使用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 服务提供商来运行工作负载集群,并总结相应的步骤。