Merge "Kubernetes Custom Resources for Cluster API"
This commit is contained in:
commit
69b14cef13
604
specs/2023.2/support-k8s-cr.rst
Normal file
604
specs/2023.2/support-k8s-cr.rst
Normal file
@ -0,0 +1,604 @@
|
||||
..
|
||||
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||
License.
|
||||
|
||||
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||
|
||||
|
||||
======================================================================
|
||||
Support Kubernetes Custom Resources for Cluster API Provider OpenStack
|
||||
======================================================================
|
||||
|
||||
This specification describes the enhancement of Kubernetes infra-driver in
|
||||
Tacker to support LCM operation of Kubernetes Custom Resources (CR) as CNF,
|
||||
using Kubernetes Cluster API (CAPI) [#capi]_ as an example CR. The scope of the
|
||||
present document includes instantiation, termination, scale and update of CNFs
|
||||
including CRs for CAPI.
|
||||
|
||||
https://blueprints.launchpad.net/tacker/+spec/support-k8s-cr
|
||||
|
||||
|
||||
Problem description
|
||||
===================
|
||||
|
||||
Tacker only allows specific types (a.k.a., kind) of Kubernetes resources and
|
||||
CR, which is user-defined kinds complying with the Kubernetes API, is not
|
||||
included yet. However, CRs are already widely used to instruct Kubernetes to
|
||||
manage more than just containers. For example, CAPI enables users to manage
|
||||
Kubernetes clusters as Kubernetes resources by defining some CRs, such as
|
||||
Cluster, Machine, etc, corresponding to the components composing Kubernetes
|
||||
clusters. By supporting CAPI CRs, Tacker can create Kubernetes Cluster with
|
||||
Kubernetes infra-driver, which is much simpler than existing Tacker's
|
||||
management drivers for similar use cases [#tacker_k8s_cluster1]_,
|
||||
[#tacker_k8s_cluster2]_.
|
||||
|
||||
As described above, the limited supported resources in Tacker may prevent a
|
||||
better implementation. In this sense, adding base classes and utilities for
|
||||
handling CRs in Kubernetes infra-driver helps other developers to extend the
|
||||
supported CRs in the future, such as some prerequisites (e.g., drivers, device
|
||||
plugins, etc) to use GPU from containers [#nvidia_gpu]_.
|
||||
|
||||
Proposed change
|
||||
===============
|
||||
|
||||
This spec proposes to support CRs of CAPI, including enhancement of the
|
||||
Kubernetes infra-driver to handle LCM operations for CRs. CAPI is a set of CRs
|
||||
to bring declarative, Kubernetes-style APIs to cluster creation, configuration,
|
||||
and management. Using CAPI as an example of CNF consisting of CRs, creating the
|
||||
basic utilities and classes to add more CRs in the future.
|
||||
|
||||
For this to happen, the following items have to be implemented.
|
||||
|
||||
* Instantiation of CNF including CRs (using Cluster API as an example)
|
||||
* Termination of CNF including CRs (using Cluster API as an example)
|
||||
* Scaling of CNF including CRs (using Cluster API as an example)
|
||||
* Updating of CNF including CRs (using Cluster API as an example)
|
||||
* Sample VNF (i.e., CNF) packages with manifests of CRs for CAPI
|
||||
* Updating user document
|
||||
|
||||
Kubernetes Custom Resources
|
||||
---------------------------
|
||||
|
||||
Custom resources are extensions of the Kubernetes API. This feature allows
|
||||
users to define new resource types, beyond the built-in resources of
|
||||
Kubernetes, such as Pods, Services, and Deployments. Once a custom resource is
|
||||
installed, users can create and access its objects using Kubernetes APIs, just
|
||||
as they do for built-in resources.
|
||||
|
||||
Some examples of popular custom resources for projects are:
|
||||
|
||||
* Cluster API: Cluster, MachineDeployment, MachineSet, Machine, etc
|
||||
* Istio: VirtualService, DestinationRule, and Gateway.
|
||||
* Prometheus: ServiceMonitor
|
||||
* Elasticsearch: Elasticsearch
|
||||
* Kubernetes Operators: Kubernetes Operators are a way to automate the
|
||||
deployment and management of complex applications on Kubernetes. Examples
|
||||
include the Nvidia GPU operator, the PostgreSQL operator, and the MongoDB
|
||||
operator.
|
||||
|
||||
In general, to use custom resources, users have to install CR Definition (CRD)
|
||||
and CR controller to Kubernetes cluster.
|
||||
|
||||
Cluster API
|
||||
-----------
|
||||
|
||||
We picked CAPI as the first CR Tacker support because Tacker already covered a
|
||||
similar use case. Tacker has supported deploying a Kubernetes cluster by using
|
||||
management drivers. CAPI
|
||||
enables users to manage Kubernetes clusters as Kubernetes resources by defining
|
||||
some CRs, such as Cluster, Machine, etc, corresponding to the components
|
||||
composing Kubernetes clusters. Therefore, by supporting CAPI CRs we can create
|
||||
Kubernetes Cluster with Kubernetes infra-driver.
|
||||
|
||||
The following are the characteristics of CAPI:
|
||||
|
||||
#. Management Cluster and Workload Cluster
|
||||
CAPI is also a Kubernetes resource and must be deployed on a cluster.
|
||||
Therefore, when using CAPI, there are two types of clusters: clusters where
|
||||
CAPI is installed and clusters that are created by CAPI. In CAPI, the
|
||||
former is called a Management Cluster and the latter a Workload Cluster.
|
||||
#. Providers
|
||||
CAPI consists of a number of CR called Providers and their controllers.
|
||||
Among them, the infrastructure provider is particularly unique. There are
|
||||
many providers and each provider supports different cloud platforms. For
|
||||
example, CAPI Provider OpenStack (CAPO) is used to build a Kubernetes
|
||||
cluster on OpenStack. The role of an infrastructure provider is to prepare
|
||||
nodes (in most cases, creating VMs) for Kubernetes clusters and
|
||||
install/configure Kubernetes components (e.g., etcd, kube-api server) on
|
||||
those nodes.
|
||||
|
||||
This figure shows the overview of the operation of CAPI.
|
||||
|
||||
.. uml::
|
||||
|
||||
@startuml
|
||||
|
||||
actor User
|
||||
package manifest
|
||||
component ManagementCluster {
|
||||
component "ClusterAPI" as capi
|
||||
component "KubernetesAPI" as kapi1
|
||||
}
|
||||
component Infrastructure {
|
||||
component WorkloadCluster {
|
||||
component "KubernetesAPI" as kapi2
|
||||
}
|
||||
}
|
||||
|
||||
User --> manifest: 2. create
|
||||
User -> kapi1: 3. apply manifest
|
||||
kapi1->capi
|
||||
capi -> WorkloadCluster: 4. create
|
||||
User -> ManagementCluster: 1. create
|
||||
|
||||
|
||||
@enduml
|
||||
|
||||
|
||||
Officially supported providers (i.e., cloud platforms) [#capi_providers]_ are:
|
||||
|
||||
* AWS
|
||||
* Azure
|
||||
* Azure Stack HCI
|
||||
* BYOH
|
||||
* CloudStack
|
||||
* CoxEdge
|
||||
* DigitalOcean
|
||||
* Equinix Metal (formerly Packet)
|
||||
* GCP
|
||||
* Hetzner
|
||||
* IBM Cloud
|
||||
* KubeKey
|
||||
* KubeVirt
|
||||
* MAAS
|
||||
* Metal3
|
||||
* Microvm
|
||||
* Nested
|
||||
* Nutanix
|
||||
* OCI
|
||||
* OpenStack
|
||||
* Outscale
|
||||
* Sidero
|
||||
* Tinkerbell
|
||||
* vcluster
|
||||
* Virtink
|
||||
* VMware Cloud Director
|
||||
* vSphere
|
||||
|
||||
Among them, we choose OpenStack (i.e., CAPO) for the first step. This is
|
||||
simply because it is easier to test and matches the previous use cases
|
||||
supported by management drivers.
|
||||
|
||||
|
||||
Enhancement of Kubernetes Infra-driver for CAPI
|
||||
-----------------------------------------------
|
||||
|
||||
In this section, we describe the enhancement of Kubernetes Infra-driver to
|
||||
create Kubernetes clusters with CAPI. As described in the previous section, we
|
||||
need to create two kinds of Kubernetes clusters: i) Management Cluster and ii)
|
||||
Workload Cluster. We first explain the steps to create those two Kubernetes
|
||||
clusters, then we also describe scaling and changing current VNF package
|
||||
operations of the Workload Cluster.
|
||||
|
||||
Creating Management Cluster
|
||||
```````````````````````````
|
||||
|
||||
This figure shows an overview of creating Management Cluster with Kubernetes
|
||||
infra-driver supporting CRs of CAPI. As CAPI itself consist of Kubernetes
|
||||
resources, creating Management Cluster can be the same operation as Instantiate
|
||||
CNF. Terminate CNF is omitted as it is almost the same as the Instantiate CNF.
|
||||
Also, LCM operations other than instantiation/termination are out of the scope
|
||||
of this specification.
|
||||
|
||||
#. Request create CNF
|
||||
Users request create CNF with a VNF package that contains CAPI CRDs.
|
||||
#. Request instantiate VNF
|
||||
Users request instantiate VNF with an instantiate parameters.
|
||||
#. Call Kubernetes API
|
||||
Kubernetes infra-driver calls Kubernetes APIs to create a set of CRs of
|
||||
CAPI as a CNF.
|
||||
#. Create a set of CRs for CAPI
|
||||
Kubernetes Control Plane creates a set of CRs according to the contents of
|
||||
the VNF package.
|
||||
|
||||
Upon CRs successfully deployed, CAPI is available on Kubernetes VIM (i.e.,
|
||||
Kubernetes VIM becomes Management Cluster).
|
||||
|
||||
.. uml::
|
||||
|
||||
@startuml
|
||||
|
||||
frame "python-tackerclient" {
|
||||
component "tacker-client" as client {
|
||||
package "VNF Package" as vnfpkg {
|
||||
file "VNFD" as vnfd
|
||||
file "CNF (Cluster API)\nDefinition" as cnfd
|
||||
}
|
||||
file "Instantiate\nparameters" as inst_param
|
||||
}
|
||||
}
|
||||
|
||||
frame "tacker" {
|
||||
component "tacker-server" {
|
||||
component "Server" as serv
|
||||
}
|
||||
component "tacker-conductor" {
|
||||
component "Conductor" as cond
|
||||
component "Vnflcm driver" as vld
|
||||
component "Kubernetes\ninfra-driver" as infra
|
||||
}
|
||||
}
|
||||
|
||||
frame "Kubernetes Cluster" as k8s {
|
||||
node "Control Plane" as k8s_m {
|
||||
node "Cluster API" as capi
|
||||
}
|
||||
node "Worker" as k8s_w
|
||||
}
|
||||
|
||||
'# Relationships
|
||||
vnfpkg --> serv: 1. Request\n create VNF
|
||||
inst_param --> serv: 2. Request\n instantiate VNF
|
||||
serv --> cond
|
||||
cond --> vld
|
||||
vld --> infra
|
||||
infra -right-> k8s_m: 3. Call Kubernetes\n API
|
||||
k8s_m -> capi: 4. Create a CRs\n for Cluster API
|
||||
|
||||
capi -[hidden]-> k8s_w
|
||||
|
||||
@enduml
|
||||
|
||||
|
||||
Creating Workload Cluster
|
||||
`````````````````````````
|
||||
|
||||
This figure shows an overview of creating Workload Cluster with Kubernetes
|
||||
infra-driver supporting CRs of CAPO. As CAPI defines Kubernetes cluster as
|
||||
Kubernetes resources, creating Workload Cluster corresponds can be the same
|
||||
operation as Instantiate CNF. Terminate CNF is omitted as it is almost the
|
||||
same as the Instantiate CNF.
|
||||
|
||||
#. Request create VNF
|
||||
Users request create VNF with a VNF package that contains CAPI CRDs.
|
||||
#. Request instantiate VNF
|
||||
Users request instantiate VNF with an instantiate parameters.
|
||||
#. Call Kubernetes API
|
||||
Kubernetes infra-driver calls Kubernetes APIs to create a set of CRs of
|
||||
CAPI as a CNF.
|
||||
#. Create a Cluster resource
|
||||
Kubernetes Control Plane creates a Cluster resource. In general, several
|
||||
sub resources are also created which are omitted in the figure.
|
||||
#. Create a Workload Cluster
|
||||
CAPI creates Workload Cluster according to the contents of VNF Package.
|
||||
#. Execute the management driver
|
||||
The vnflcm driver executes management driver contained in VNF
|
||||
Package.
|
||||
#. Get credentials for Workload Cluster
|
||||
The management driver obtains credentials for Workload Cluster which is
|
||||
automatically stored as Secret on Management Cluster by CAPI.
|
||||
#. Send the credentials
|
||||
The management driver sends obtained credentials to the web server
|
||||
according to the pre-configured URL. The web server must be managed by
|
||||
users to receive credentials.
|
||||
|
||||
.. note:: In order to use the Workload Cluster as VIM, users have to register
|
||||
VIM with the credentials sent by the management driver.
|
||||
|
||||
.. uml::
|
||||
|
||||
@startuml
|
||||
|
||||
component "Web Server" as w
|
||||
|
||||
frame "python-tackerclient" {
|
||||
component "tacker-client" as client {
|
||||
package "VNF Package" as vnfpkg {
|
||||
file "VNFD" as vnfd
|
||||
file "CNF (k8s Cluster)\nDefinition" as cnfd
|
||||
file "Scripts for\n Management Driver\n(Credentials Sender)" as mgmtd
|
||||
}
|
||||
file "Instantiate\nparameters" as inst_param
|
||||
}
|
||||
}
|
||||
|
||||
vnfd -[hidden]> cnfd
|
||||
cnfd -[hidden]> mgmtd
|
||||
|
||||
frame "tacker" {
|
||||
component "tacker-server" {
|
||||
component "Server" as serv
|
||||
}
|
||||
component "tacker-conductor" {
|
||||
component "Conductor" as cond
|
||||
component "Vnflcm driver" as vld
|
||||
component "Kubernetes\ninfra-driver" as infra
|
||||
}
|
||||
}
|
||||
|
||||
frame "Management Cluster" as mgmt {
|
||||
node "Control Plane" as k8s_m_m {
|
||||
node "Cluster API" as capi
|
||||
}
|
||||
node "Worker" as k8s_m_w {
|
||||
node "Cluster" as cluster
|
||||
}
|
||||
}
|
||||
|
||||
component "Management Driver\n(Credentials Sender)" as mgmtdi
|
||||
|
||||
cloud "Hardware Resources" as hw_w {
|
||||
frame "Workload Cluster" as wkld {
|
||||
node "Control Plane" as k8s_w_m
|
||||
node "Worker" as k8s_w_w {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
'# Relationships
|
||||
vnfpkg --> serv: 1. Request\n create VNF
|
||||
inst_param --> serv: 2. Request\n instantiate VNF
|
||||
serv --> cond
|
||||
cond --> vld
|
||||
vld --> infra
|
||||
infra -right-> k8s_m_m: 3. Call Kubernetes\n API
|
||||
capi --> cluster: 4. Create a Cluster Resource
|
||||
cluster --> wkld: 5. Create a Workload Cluster
|
||||
k8s_w_m -[hidden]-> k8s_w_w
|
||||
vld -right-> mgmtdi: 6. Execute management driver
|
||||
mgmtdi <--- mgmt: 7. Get credentials for Workload Cluster
|
||||
mgmtdi -> w: 8. Send credentials
|
||||
|
||||
|
||||
@enduml
|
||||
|
||||
Scale Workload Cluster
|
||||
``````````````````````
|
||||
|
||||
This figure shows an overview of scaling Workload Cluster with Kubernetes
|
||||
infra-driver supporting CRs of CAPO.
|
||||
|
||||
#. Request scale VNF
|
||||
Users request scale VNF
|
||||
#. Call Kubernetes API
|
||||
Kubernetes infra-driver calls Kubernetes APIs to change a parameter that
|
||||
represents the number of worker nodes in the Workload Cluster which must be
|
||||
``replicas``.
|
||||
#. Change a parameter for the number of worker nodes
|
||||
CAPI in Kubernetes Control Plane changes the parameter for the number of
|
||||
worker nodes according to the API calls.
|
||||
#. Change the number of worker nodes
|
||||
CAPI changes the number of worker nodes according to the Cluster resource.
|
||||
|
||||
|
||||
.. uml::
|
||||
|
||||
@startuml
|
||||
|
||||
frame "python-tackerclient" {
|
||||
component "tacker-client" as client {
|
||||
}
|
||||
}
|
||||
|
||||
frame "tacker" {
|
||||
component "tacker-server" {
|
||||
component "Server" as serv
|
||||
}
|
||||
component "tacker-conductor" {
|
||||
component "Conductor" as cond
|
||||
component "Vnflcm driver" as vld
|
||||
component "Kubernetes\ninfra-driver" as infra
|
||||
}
|
||||
}
|
||||
|
||||
frame "Management Cluster" as mgmt {
|
||||
node "Control Plane" as k8s_m_m {
|
||||
node "Cluster API" as capi
|
||||
}
|
||||
node "Worker" as k8s_m_w {
|
||||
node "Cluster" as cluster
|
||||
}
|
||||
}
|
||||
|
||||
cloud "Hardware Resources" as hw_w {
|
||||
frame "Workload Cluster" as wkld {
|
||||
node "Control Plane" as k8s_w_m
|
||||
node "Worker" as k8s_w_w
|
||||
node "Worker" as k8s_w_w2
|
||||
}
|
||||
}
|
||||
|
||||
'# Relationships
|
||||
client --> serv: 1. Request\n scale VNF
|
||||
serv --> cond
|
||||
cond --> vld
|
||||
vld --> infra
|
||||
infra -right-> k8s_m_m: 2. Call Kubernetes\n API
|
||||
capi --> cluster: 3. Change a parameter\n for the number of worker nodes
|
||||
cluster --> wkld: 4. Change the number of worker nodes
|
||||
k8s_w_m -[hidden]-> k8s_w_w
|
||||
k8s_w_m -[hidden]-> k8s_w_w2
|
||||
|
||||
@enduml
|
||||
|
||||
Update Workload Cluster
|
||||
```````````````````````
|
||||
|
||||
This figure shows an overview of updating Workload Cluster with Kubernetes
|
||||
infra-driver supporting CRs of CAPO. Similar to the other Kubernetes
|
||||
resources, CRs of CAPI (e.g., Cluster) can be updated by applying the updated
|
||||
version of manifest. This operation can be covered by the change current VNF
|
||||
package in Tacker.
|
||||
|
||||
#. Request update VNF
|
||||
Users request to change the current VNF package
|
||||
#. Call Kubernetes API
|
||||
Kubernetes infra-driver calls Kubernetes APIs to override Cluster resource.
|
||||
#. Change a parameter for the number of worker nodes
|
||||
CAPI in Kubernetes Control Plane changes the Cluster resource according to
|
||||
the API calls.
|
||||
#. Change the number of worker nodes
|
||||
CAPI changes worker nodes according to the Cluster resource.
|
||||
|
||||
.. uml::
|
||||
|
||||
@startuml
|
||||
|
||||
frame "python-tackerclient" {
|
||||
component "tacker-client" as client {
|
||||
}
|
||||
}
|
||||
|
||||
frame "tacker" {
|
||||
component "tacker-server" {
|
||||
component "Server" as serv
|
||||
}
|
||||
component "tacker-conductor" {
|
||||
component "Conductor" as cond
|
||||
component "Vnflcm driver" as vld
|
||||
component "Kubernetes\ninfra-driver" as infra
|
||||
}
|
||||
}
|
||||
|
||||
frame "Management Cluster" as mgmt {
|
||||
node "Control Plane" as k8s_m_m {
|
||||
node "Cluster API" as capi
|
||||
}
|
||||
node "Worker" as k8s_m_w {
|
||||
node "Cluster" as cluster
|
||||
}
|
||||
}
|
||||
|
||||
cloud "Hardware Resources" as hw_w {
|
||||
frame "Workload Cluster" as wkld {
|
||||
node "Control Plane" as k8s_w_m
|
||||
node "Worker" as k8s_w_w
|
||||
node "Worker" as k8s_w_w2
|
||||
}
|
||||
}
|
||||
|
||||
'# Relationships
|
||||
client --> serv: 1. Request\n change current VNF package
|
||||
serv --> cond
|
||||
cond --> vld
|
||||
vld --> infra
|
||||
infra -right-> k8s_m_m: 2. Call Kubernetes\n API
|
||||
capi --> cluster: 3. Update the resources
|
||||
cluster --> wkld: 4. Change the resources of worker nodes
|
||||
k8s_w_m -[hidden]-> k8s_w_w
|
||||
k8s_w_m -[hidden]-> k8s_w_w2
|
||||
|
||||
@enduml
|
||||
|
||||
Alternatives
|
||||
------------
|
||||
|
||||
None.
|
||||
|
||||
Data model impact
|
||||
-----------------
|
||||
|
||||
None.
|
||||
|
||||
REST API impact
|
||||
---------------
|
||||
|
||||
None.
|
||||
|
||||
Security impact
|
||||
---------------
|
||||
|
||||
None.
|
||||
|
||||
However, we have to carefully manage credentials for created Workload Cluster.
|
||||
CAPI stores those credentials as Secret of Management Cluster. Therefore,
|
||||
unless the security of Management Cluster is violated, the credentials are
|
||||
safe. Such security management is the out of scope of Tacker.
|
||||
|
||||
Notifications impact
|
||||
--------------------
|
||||
|
||||
None.
|
||||
|
||||
Other end user impact
|
||||
---------------------
|
||||
|
||||
None.
|
||||
|
||||
Performance Impact
|
||||
------------------
|
||||
|
||||
None.
|
||||
|
||||
Other deployer impact
|
||||
---------------------
|
||||
|
||||
* Deployer who uses this feature may have to create a server to receive
|
||||
credentials for Workload Cluster and may have to create script to register
|
||||
those credentials as VIM.
|
||||
* Deployer who uses this feature may have to prepare VNF packages containing
|
||||
appropriate CAPI CRs and cluster definitions.
|
||||
|
||||
Developer impact
|
||||
----------------
|
||||
|
||||
* VNF package developers need to contain the management driver to obtain the
|
||||
credentials of Workload Cluster or alternative scripts to do the same thing.
|
||||
* VNF package developers may need to update the packages according to the
|
||||
update of CAPI.
|
||||
* VNF package developers may need to fix bugs in the package caused by CAPI.
|
||||
* Tacker developers may need to fix bugs in Kubernetes infra-driver caused by
|
||||
CAPI.
|
||||
* Developers may need to be careful to change components of Tacker, especially
|
||||
when they want to support additional CRs in Kubernetes infra-driver so that
|
||||
it complies with implementation of the present document.
|
||||
|
||||
|
||||
Implementation
|
||||
==============
|
||||
|
||||
Assignee(s)
|
||||
-----------
|
||||
|
||||
Primary assignee:
|
||||
* Reina Yoshitani <yoshitanir@intellilink.co.jp>
|
||||
|
||||
Other contributors:
|
||||
* Shun Higuchi <higuchis@intellilink.co.jp>
|
||||
* Hiromu Asahina (hiromu) <hiromu.asahina@ntt.com> <hiromu.a5a@gmail.com>
|
||||
|
||||
Work Items
|
||||
----------
|
||||
|
||||
* Instantiation of CNF including CRs (using Cluster API as an example)
|
||||
* Termination of CNF including CRs (using Cluster API as an example)
|
||||
* Scaling of CNF including CRs (using Cluster API as an example)
|
||||
* Updating of CNF including CRs (using Cluster API as an example)
|
||||
* Sample VNF (i.e., CNF) packages with manifests of CRs for CAPI
|
||||
* Updating user document
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
* Kubernetes v1.25.0 or later
|
||||
|
||||
Testing
|
||||
=======
|
||||
|
||||
We can enhance existing functional tests for Kubernetes VIM by adding test
|
||||
cases for CRs. Those CRs do not necessarily have to be CAPI as the main scope
|
||||
of the present document is to support CRs.
|
||||
|
||||
Documentation Impact
|
||||
====================
|
||||
|
||||
Need to explain the use cases of the enhanced Kubernetes infra-driver.
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
.. [#capi] https://cluster-api.sigs.k8s.io/
|
||||
.. [#nvidia_gpu] https://docs.nvidia.com/datacenter/cloud-native/gpu-operator/getting-started.html#install-nvidia-gpu-operator
|
||||
.. [#tacker_k8s_cluster1] https://docs.openstack.org/tacker/latest/user/mgmt_driver_deploy_k8s_usage_guide.html
|
||||
.. [#tacker_k8s_cluster2] https://docs.openstack.org/tacker/latest/user/mgmt_driver_deploy_k8s_kubespary_usage_guide.html
|
||||
.. [#capi_providers] https://cluster-api.sigs.k8s.io/reference/providers.html
|
Loading…
Reference in New Issue
Block a user