使用Cluster API的Docker提供程序

To:目标

Cluster API 是 Kubernetes 的一个子项目,重点是提供声明性 API 和工具,简化多个 Kubernetes 集群的规划、升级和运维。可以参考官方文档和下面的文章来了解更多关于 Cluster API 的概述。

    • Kubernetes Cluster API

 

    ClusterAPIによるKubernetesクラスタの操作

Cluster API是一种机制,通过使用为每个平台准备的提供者(Provider)来吸收平台差异,并构建Kubernetes集群。
在这里,使用Docker作为提供者之一。
Docker提供者并不设计用于生产环境,而只针对开发环境。
然而,在可用的提供者中,它需要较少的预先准备即可运行。
因此,我认为对于初次接触Cluster API的人来说,它是其中一种最容易上手的提供者之一。

本次操作在一台机器上安装了所需的所有软件,并运行Cluster API的Docker提供程序。
安装步骤请参考以下信息。

    The Cluster API Book Quick Start

组成

准备一台下面的机器。

    • Disk: 50GB

 

    • Cores: 2 core

 

    • Memory: 4GB

 

    OS: Ubuntu 20.04

步骤

容器

安装Docker。

sudo apt install docker.io -y

为了使普通用户能够操作Docker,将普通用户添加到docker组,并重新登录。

sudo usermod -a -G docker <username>
exit

kubectl – Kube 控制工具

安装 kubectl。

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt install -y kubectl

亲切的

安装kind。
安装完的kind将作为管理集群使用。

curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.19.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

创建一种配置文件,使得Docker Provider能够访问主机上的Docker。

cat << _EOF_ > kind-cluster-with-extramounts.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraMounts:
    - hostPath: /var/run/docker.sock
      containerPath: /var/run/docker.sock
_EOF_

创建 Kubernetes 集群。

kind create cluster --config kind-cluster-with-extramounts.yaml

确认已创建的 Kubernetes 集群的运行情况。

$ kubectl get pod -A
NAMESPACE            NAME                                         READY   STATUS    RESTARTS   AGE
kube-system          coredns-5d78c9869d-rkcwg                     1/1     Running   0          8s
kube-system          coredns-5d78c9869d-z6zj2                     1/1     Running   0          8s
kube-system          etcd-kind-control-plane                      1/1     Running   0          20s
kube-system          kindnet-ggj6z                                1/1     Running   0          8s
kube-system          kube-apiserver-kind-control-plane            1/1     Running   0          20s
kube-system          kube-controller-manager-kind-control-plane   1/1     Running   0          20s
kube-system          kube-proxy-cdf4z                             1/1     Running   0          8s
kube-system          kube-scheduler-kind-control-plane            1/1     Running   0          22s
local-path-storage   local-path-provisioner-6bc4bddd6b-fklmj      1/1     Running   0          8s

集群控制器 (jí zhì qì)

安装 clusterctl。
clusterctl 可以处理 Management Cluster 的生命周期。

curl -L https://github.com/kubernetes-sigs/cluster-api/releases/download/v1.4.2/clusterctl-linux-amd64 -o clusterctl
chmod +x ./clusterctl
sudo mv ./clusterctl /usr/local/bin/clusterctl

管理集群 ( )

初始化

启用功能门 (Feature Gates) (即启用阿尔法状态的功能)。

export CLUSTER_TOPOLOGY=true

初始化管理集群。

$  clusterctl init --infrastructure docker
Fetching providers
Installing cert-manager Version="v1.11.1"
Waiting for cert-manager to be available...
Installing Provider="cluster-api" Version="v1.4.2" TargetNamespace="capi-system"
Installing Provider="bootstrap-kubeadm" Version="v1.4.2" TargetNamespace="capi-kubeadm-bootstrap-system"
Installing Provider="control-plane-kubeadm" Version="v1.4.2" TargetNamespace="capi-kubeadm-control-plane-system"
Installing Provider="infrastructure-docker" Version="v1.4.2" TargetNamespace="capd-system"

Your management cluster has been initialized successfully!

You can now create your first workload cluster by running the following:

  clusterctl generate cluster [name] --kubernetes-version [version] | kubectl apply -f -

设置环境变量

只要是尝试常规操作,就不需要进行特别的设置,但需要根据个人环境进行修改。

如果在Docker提供程序中需要特殊的网络配置,则可以设置以下环境变量。

# The list of service CIDR, default ["10.128.0.0/12"]
export SERVICE_CIDR=["10.96.0.0/12"]

# The list of pod CIDR, default ["192.168.0.0/16"]
export POD_CIDR=["192.168.0.0/16"]

# The service domain, default "cluster.local"
export SERVICE_DOMAIN="k8s.test"

可以将默认启用的Pod安全标准禁用,但不建议这样做。

export ENABLE_POD_SECURITY_STANDARD="false"

为工作负载集群创建清单文件。

创建用于工作负载集群的清单文件。
这次要创建一个名为 capi-quickstart 的工作负载集群。

    • flavor

 

    • インフラストラクチャプロバイダー毎に準備されている Workload Cluster のテンプレート

 

    • Docker Provider の場合は運用環境での使用を目的として設計されておらず、開発環境のみを対象としているため、development とする

 

    • kubernetes-version

 

    • Workload Cluster の Kubernetes Version を指定する

 

    • control-plane-machine-count

 

    • Workload Cluster の Control Plane の台数を指定する

 

    • worker-machine-count

 

    Workload Cluster の Worker Node の台数を指定する
clusterctl generate cluster capi-quickstart \
  --flavor development \
  --kubernetes-version v1.27.0 \
  --control-plane-machine-count=1 \
  --worker-machine-count=1 \
  > capi-quickstart.yaml

创建工作负载集群

创建工作负载集群。
通过应用上述创建的清单,将会分别创建控制平面和工作节点各1台。

$ kubectl apply -f capi-quickstart.yaml
clusterclass.cluster.x-k8s.io/quick-start created
dockerclustertemplate.infrastructure.cluster.x-k8s.io/quick-start-cluster created
kubeadmcontrolplanetemplate.controlplane.cluster.x-k8s.io/quick-start-control-plane created
dockermachinetemplate.infrastructure.cluster.x-k8s.io/quick-start-control-plane created
dockermachinetemplate.infrastructure.cluster.x-k8s.io/quick-start-default-worker-machinetemplate created
kubeadmconfigtemplate.bootstrap.cluster.x-k8s.io/quick-start-default-worker-bootstraptemplate created
cluster.cluster.x-k8s.io/capi-quickstart created

可以通过以下方式确认创建情况。
只要MachineDeployment / xxxx的READY以外为True,就没有问题。
通过安装Calico等CNI来实现MachineDeployment / xxxx为True。
通过安装CNI,可以配置Pod网络,并在工作负载集群上运行Pod。
因此,如果需要,建议安装CNI。

$ clusterctl describe cluster capi-quickstart
NAME                                                             READY  SEVERITY  REASON                       SINCE  MESSAGE

Cluster/capi-quickstart                                          True                                          56s

├─ClusterInfrastructure - DockerCluster/capi-quickstart-cv78j    True                                          106s

├─ControlPlane - KubeadmControlPlane/capi-quickstart-9zkz5       True                                          56s

│ └─Machine/capi-quickstart-9zkz5-qbgg5                          True                                          58s

└─Workers

  └─MachineDeployment/capi-quickstart-md-0-hgxb8                 False  Warning   WaitingForAvailableMachines  106s   Minimum availability requires 1 replicas, current 0 available
    └─Machine/capi-quickstart-md-0-hgxb8-6968755649xk6k6n-6pv5j  True                                          31s

获取 Workload Cluster 的 kubeconfig。

clusterctl get kubeconfig capi-quickstart > capi-quickstart.kubeconfig

使用获取的 kubeconfig,查看 Workload Cluster 的节点。

$ kubectl --kubeconfig=./capi-quickstart.kubeconfig get nodes -o wide
NAME                                                STATUS     ROLES           AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
capi-quickstart-9zkz5-qbgg5                         NotReady   control-plane   2m36s   v1.27.0   172.18.0.4    <none>        Ubuntu 22.04.2 LTS   5.4.0-149-generic   containerd://1.6.19-46-g941215f49
capi-quickstart-md-0-hgxb8-6968755649xk6k6n-6pv5j   NotReady   <none>          2m8s    v1.27.0   172.18.0.5    <none>        Ubuntu 22.04.2 LTS   5.4.0-149-generic   containerd://1.6.19-46-g941215f49

另外,在Docker中也可以查看进程。

$ docker ps -a
CONTAINER ID   IMAGE                               COMMAND                  CREATED         STATUS         PORTS                                  NAMES
ba8d301e01ea   kindest/node:v1.27.0                "/usr/local/bin/entr…"   2 minutes ago   Up 2 minutes                                          capi-quickstart-md-0-hgxb8-6968755649xk6k6n-6pv5j
7e2eb311eb8c   kindest/node:v1.27.0                "/usr/local/bin/entr…"   3 minutes ago   Up 3 minutes   34191/tcp, 127.0.0.1:34191->6443/tcp   capi-quickstart-9zkz5-qbgg5
8b5968483e0f   kindest/haproxy:v20230330-2f738c2   "haproxy -sf 7 -W -d…"   3 minutes ago   Up 3 minutes   43505/tcp, 0.0.0.0:43505->6443/tcp     capi-quickstart-lb
6c9350879f83   kindest/node:v1.27.1                "/usr/local/bin/entr…"   9 minutes ago   Up 9 minutes   127.0.0.1:45555->6443/tcp              kind-control-plane

总结

本次使用Docker Provider确认了Cluster API的运作。通过使用Docker Provider,可以尝试较低成本的Cluster API,包括机器等配置成本。本文还介绍了使用kind来创建Docker上的Kubernetes Cluster的方法。Cluster API将Kubernetes Cluster作为Kubernetes资源进行管理,因此可以对Kubernetes Cluster执行编排。

然而,正如本文中提到的,Docker提供商是为开发环境设计的,不推荐在生产环境中使用。
然而,在试验Cluster API的一系列操作和试验Cluster API的配置元素时,可以轻松且充分地使用实际设备进行操作。
因此,作为Cluster API的入门指南,建议先尝试使用Docker Provider,然后再尝试其他提供商的使用。

因此,在下一篇文章中,我们将尝试使用 OpenStack 服务提供商来运行工作负载集群,并总结相应的步骤。

广告
将在 10 秒后关闭
bannerAds