描述

此文章的内容主要是通过 kubernetes cluster-api 对象,管理多个部署在 openstack 平台上的 kubernetes 集群。
·

资源说明

此次实验需要的资源:

  • 一个支持 self-service 网络的 openstack 集群,并且在此之上至少可以创建 4c8g 的虚拟机两台。
  • 一个 kubernetes 管理集群,可以是单节点或者 kind。
  • 一个可以在 openstack 平台上部署 kubernetes 主机的镜像。

个人感觉此实验属于较大型的实验,需要的资源比较多,容易劝退大部分的人。在资源不允许的情况下还想要了解 kubernetes cluster-api 工作原理的小伙伴,推荐参考官方的快速入门实验,它是通过 kinddocker 来完成的,这样只需要少量的资源就可以实现。

PS: 此文章中不提供 openstack 集群的安装步骤,并且假设大家都已存在一个 kubernetes 集群。
PS: 此次实验所使用的操作系统是 Ubuntu20.04

·

为 OpenStack 构建 image

openstack 中必须提供与 cluster-api 兼容的 image,下面是通过 image-builder 构建兼容 image 的步骤。

1、image-builder 的先决条件

1.1 安装 packers
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install packer

root@image-builder:~# packer version
Packer v1.8.1
1.2 下载 goss plugin
  1. 此处下载适用的最新版本。.
  2. 将二进制文件重命名为 packer-provisioner-goss,并添加可执行权限。
  3. 将文件放在 packer 查找插件的目录(~/.packer.d/plugins)之中。
1.3 安装 ansible

我选择通过 pip 安装

### 配置 pip 国内源
mkdir ~/.pip && cat << "EOF" > ~/.pip/pip.conf 
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host = https://pypi.tuna.tsinghua.edu.cn
EOF

### 验证
root@image-builder:~# pip config list
global.index-url='https://pypi.tuna.tsinghua.edu.cn/simple'
install.trusted-host='https://pypi.tuna.tsinghua.edu.cn'

### 安装 ansible
pip install ansible

·

2、QCOW2 的先决条件

PS: openstack image 是使用 KVM 管理程序构建的。

# 安装软件包以使用 qemu-img
apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst cpu-checker libguestfs-tools libosinfo-bin

# 将用户添加到 kvm 组,如果使用 root 用户可忽略这一步骤
sudo usermod -a -G kvm <yourusername>
sudo chown root:kvm /dev/kvm

·

3、使用 image-builder

3.1 安装 image-builder
### 实验期间的最新版本为 v0.1.12
git clone https://github.com/kubernetes-sigs/image-builder.git
cd image-builder/images/capi/
3.2 通过 make 构建镜像(qemu)的先决条件
make deps-qemu

在这里插入图片描述

3.3 配置

images/capi/packer/config 中包含几个 JSON 文件,它们定义了 image 的默认配置。如果需要自定义,不需要直接修改它们的值,最好是创建一个新 JSON 文件,并通过 PACKER_VAR_FILES 环境变量指定它。在这个文件中设置的变量将覆盖之前的任何值。

PS: 可以通过 PACKER_VAR_FILES 传递多个文件,最后一个文件优先于任何其他文件。

cd image-builder/images/capi/
cat << 'EOF' > packer/config/vars.json
{
  "kubernetes_container_registry": "registry.aliyuncs.com/google_containers",
  "pause_image": "registry.aliyuncs.com/google_containers/pause:3.5",
  "kubernetes_deb_gpg_key": "https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg",
  "kubernetes_deb_repo": "\"https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial\"",
  "kubernetes_deb_version": "1.22.8-00",
  "kubernetes_series": "v1.22",
  "kubernetes_semver": "v1.22.8",
  "containerd_url": "http://10.0.30.29/K8sFileDownload/github.com/containerd/containerd/releases/download/v1.6.2/cri-containerd-cni-1.6.2-linux-amd64.tar.gz",
  "containerd_sha256": "91f1087d556ecfb1f148743c8ee78213cd19e07c22787dae07fe6b9314bec121",
  "containerd_version": "1.6.2",
  "crictl_url": "http://10.0.30.29/K8sFileDownload/github.com/kubernetes-sigs/cri-tools/releases/download/v1.23.0/crictl-v1.23.0-linux-amd64.tar.gz",
  "crictl_sha256": "b754f83c80acdc75f93aba191ff269da6be45d0fc2d3f4079704e7d1424f1ca8",
  "crictl_version": "1.23.0",
  "goss_download_path": "http://10.0.30.29/K8sFileDownload/github.com/aelsabbahy/goss/releases/download/v0.3.16/goss-linux-amd64",
  "goss_version": "0.3.16"
}
EOF

这些自定义变量主要是替换了软件包的默认下载地址,其中 containerdcrictlgoss 的下载地址默认是 GitHub,由于网络的限制,我们需要提前将其手动下载,然后通过自己的文件服务发布程序(如上的10.0.30.29)进行发布,这样可以加速 kubernetes 集群安装的速度,并能提高成功率。

3.4 构建 image
cd image-builder/images/capi/
PACKER_VAR_FILES=packer/config/vars.json make build-qemu-ubuntu-2004

构建出的 image 位于 images/capi/output/BUILD_NAME+kube-KUBERNETES_VERSION 中。

root@image-builder:/usr/local/src/image-builder/images/capi# ls -lh output/ubuntu-2004-kube-v1.22.8/
total 4.0G
-rw-r--r-- 1 root root 4.0G May 29 10:11 ubuntu-2004-kube-v1.22.8

·

4、将生成的 image 上传至 openstack

glance image-create --name "ubuntu-2004-kube-v1.22.8" \
--file /usr/local/src/ubuntu-2004-kube-v1.22.8 \
--disk-format qcow2 --container-format bare --visibility public

### 查看
[root@controller ~(admin)]# openstack image list
+--------------------------------------+--------------------------+--------+
| ID                                   | Name                     | Status |
+--------------------------------------+--------------------------+--------+
| d4fb8039-5451-454e-b97e-dc3224eba76e | cirros                   | active |
| ef0ced5e-40ef-4aba-85c3-e44e231c7967 | ubuntu-2004-kube-v1.22.8 | active |
+--------------------------------------+--------------------------+--------+

·

初始化 kubernetes 管理集群

PS: 假设大家已经存在一个 kubernetes 集群,下面只是初始化管理集群的步骤,不包含安装步骤。

默认初始化管理集群时,需要下载的 yaml 文件和 image 都在 “墙外”,初始化时间会很长,而且很容易失败。所以,我们需要将 yaml 文件下载到本地,并修改 image 下载地址为自己的加速地址或者手动将其下载到本地,来加速管理集群初始化的速度。修改好 yaml 文件之后,如何使用它们有两种方法:

  • 方法一:通过 kubectl apply -f 执行这些 yaml 文件。这种方法虽然也能成功安装并使用,但是不能通过 clusterctl 命令对其进行管理。
  • 方法二:通过配置 Overrides 层以覆盖默认值。这样,在执行 clusterctl 命令时,会使用 overrides 层提供的 Provider 组件、集群模板和元数据。(此实验中使用方法二)

·

1、安装 clusterctl

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

root@cluster-api:~# clusterctl version
clusterctl version: &version.Info{Major:"1", Minor:"1", GitVersion:"v1.1.3", GitCommit:"31146bd17a220ef6214c4c7a21f1aa57380b6b1f", GitTreeState:"clean", BuildDate:"2022-03-08T18:52:05Z", GoVersion:"go1.17.3", Compiler:"gc", Platform:"linux/amd64"}

·

2、下载需要的 yaml 文件,并修改 image 下载地址

2.1 下载 cert-manager.yaml

首先,在进行初始化管理集群时,clusterctl 会检查是否已经安装了 cert-manager,如果没有,它将安装默认版本。需要关注一下两点:

  • 如果通过 clusterctl 安装 cert-manager,它将关注其生命周期,并最终在 clusterctl 升级期间对其进行升级。
  • 如果 cert-manager 是单独安装的,则用户在需要时负责升级该组件。
2.2 下载 ClusterAPI 组件的 yaml 文件

ClusterAPI 组件的默认仓库地址,可以通过 clusterctl config repositories 命令查看,下面列出的是此次实验需要用到的文件:

root@cluster-api:~# clusterctl config repositories
NAME           TYPE                     URL                                                                                          FILE
cluster-api    CoreProvider             https://github.com/kubernetes-sigs/cluster-api/releases/latest/                              core-components.yaml
kubeadm        BootstrapProvider        https://github.com/kubernetes-sigs/cluster-api/releases/latest/                              bootstrap-components.yaml
kubeadm        ControlPlaneProvider     https://github.com/kubernetes-sigs/cluster-api/releases/latest/                              control-plane-components.yaml
openstack      InfrastructureProvider   https://github.com/kubernetes-sigs/cluster-api-provider-openstack/releases/latest/           infrastructure-components.yaml

其实这些 yaml 文件都可以通过 clusterctl generate provider 命令生成,但是我选择直接手动下载,因为我们还需要相关的元数据文件。

  • 通过这里下载
    core-components.yaml、bootstrap-components.yaml、control-plane-components.yaml
    和 metadata.yaml。
  • 通过这里下载
    infrastructure-components.yaml、cluster-template.yaml 和 metadata.yaml。
  • 通过这里下载
    cert-manager.yaml。
2.3 修改 image 下载地址
sed -i s#"k8s.gcr.io/cluster-api"#"k8s-gcr.panbuhei.online/cluster-api"#g core-components.yaml 
sed -i s#"k8s.gcr.io/cluster-api"#"k8s-gcr.panbuhei.online/cluster-api"#g bootstrap-components.yaml 
sed -i s#"k8s.gcr.io/cluster-api"#"k8s-gcr.panbuhei.online/cluster-api"#g control-plane-components.yaml 

sed -i s#"k8s.gcr.io/capi-openstack"#"k8s-gcr.panbuhei.online/capi-openstack"#g infrastructure-components.yaml

PS: 还需要关注 cluster-metadata.yamlnodeCidrpodCidr 的网络地址段,以防冲突。

  • nodeCidr 默认网段为:10.6.0.0/24。
  • podCidr 默认网段为:192.168.0.0/16。

·

3、修改完成后,配置 Overrides 层

Overrides 层的默认路径为 $HOME/.cluster-api/overrides。可以在 clusterctl 配置文件(默认 $HOME/.cluster-api/clusterctl.yaml)中通过 overridesFolder: <PATH> 来指定。

此目录结构应遵循 <providerType-providerName>/<version>/<fileName> 模板。如下所示:

root@cluster-api:~# tree ~/.cluster-api/overrides/
/root/.cluster-api/overrides/
├── bootstrap-kubeadm
│   └── v1.1.3
│       ├── bootstrap-components.yaml
│       └── metadata.yaml
├── cert-manager
│   └── v1.7.2
│       └── cert-manager.yaml
├── cluster-api
│   └── v1.1.3
│       ├── core-components.yaml
│       └── metadata.yaml
├── control-plane-kubeadm
│   └── v1.1.3
│       ├── control-plane-components.yaml
│       └── metadata.yaml
└── infrastructure-openstack
    └── v0.6.3
        ├── cluster-template.yaml
        ├── infrastructure-components.yaml
        └── metadata.yaml

编辑或修改 clusterctl 配置文件

cat > $HOME/.cluster-api/clusterctl.yaml << "EOF"
providers:
  - name: "cluster-api"
    url: "/root/.cluster-api/overrides/cluster-api/latest/core-components.yaml"
    type: "CoreProvider"
  - name: "kubeadm"
    url: "/root/.cluster-api/overrides/bootstrap-kubeadm/latest/bootstrap-components.yaml"
    type: "BootstrapProvider"
  - name: "kubeadm"
    url: "/root/.cluster-api/overrides/control-plane-kubeadm/latest/control-plane-components.yaml"
    type: "ControlPlaneProvider"
  - name: "openstack"
    url: "/root/.cluster-api/overrides/infrastructure-openstack/latest/infrastructure-components.yaml"
    type: "InfrastructureProvider"
cert-manager:
  url: "/root/.cluster-api/overrides/cert-manager/latest/cert-manager.yaml"
  version: "v1.7.2"
EOF

一旦指定了这些 overrides,clusterctl 将使用它们而不是从默认或指定的提供程序中获取值。再次执行 clusterctl config repositories 命令就可以看出。例如:

root@cluster-api:~# clusterctl config repositories
NAME           TYPE                     URL                                                                                          FILE
cluster-api    CoreProvider             /root/.cluster-api/overrides/cluster-api/latest/                                             core-components.yaml
kubeadm        BootstrapProvider        /root/.cluster-api/overrides/bootstrap-kubeadm/latest/                                       bootstrap-components.yaml
kubeadm        ControlPlaneProvider     /root/.cluster-api/overrides/control-plane-kubeadm/latest/                                   control-plane-components.yaml
openstack      InfrastructureProvider   /root/.cluster-api/overrides/infrastructure-openstack/latest/                                infrastructure-components.yaml

·

4、最后,初始化 kubernetes 管理集群

首先,需要确保 cluster-api 主机可以连接一个 kubernetes 集群,这里我的 cluster-api 主机就是一个单节点的 kubernetes 集群。

root@cluster-api:~# kubectl get pod -A
NAMESPACE     NAME                                       READY   STATUS    RESTARTS      AGE
kube-system   calico-kube-controllers-65fc569c85-bwsbb   1/1     Running   2 (10m ago)   10m
kube-system   calico-node-fbj2l                          1/1     Running   0             11m
kube-system   coredns-5b64bd74c4-bbgcd                   1/1     Running   0             10m
kube-system   dns-autoscaler-996597fcd-4k779             1/1     Running   0             10m
kube-system   kube-apiserver-cluster-api                 1/1     Running   1             12m
kube-system   kube-controller-manager-cluster-api        1/1     Running   1             12m
kube-system   kube-proxy-9pcz8                           1/1     Running   0             11m
kube-system   kube-scheduler-cluster-api                 1/1     Running   1             12m
kube-system   nodelocaldns-7pxd6                         1/1     Running   1 (6s ago)    8s

然后,才能初始化 kubernetes 管理集群

clusterctl init --core cluster-api:v1.1.3 \
--bootstrap kubeadm:v1.1.3 \
--control-plane kubeadm:v1.1.3 \
--infrastructure openstack:v0.6.3 \
--target-namespace capi-system
  • --target-namespace:指定 ClusterAPI 组件的目标 namespace。默认每个组件都有自己的 namespace,指定统一的 namespace 方便管理与维护。

验证管理集群

root@cluster-api:~# kubectl -n capi-system get pod 
NAME                                                             READY   STATUS    RESTARTS   AGE
capi-controller-manager-5974cc8f78-q2jxn                         1/1     Running   0          3m5s
capi-kubeadm-bootstrap-controller-manager-7b7b756665-drmjc       1/1     Running   0          3m4s
capi-kubeadm-control-plane-controller-manager-78b684c4d5-x5k24   1/1     Running   0          3m4s
capo-controller-manager-749968667d-5k9qf                         1/1     Running   0          3m3s

·

通过 cluster-api 在 openstack 平台部署 kubernetes 集群

1、openstack 平台准备

在 openstack 平台创建 kubernetes 集群主机的 flavor

openstack flavor create --id 1 \
--vcpus 4 \
--ram 8192 \
--disk 30 k8s.control_plane

openstack flavor create --id 2 \
--vcpus 4 \
--ram 8192 \
--disk 30 k8s.workload

[root@controller ~(admin)]# openstack flavor list
+----+-------------------+------+------+-----------+-------+-----------+
| ID | Name              |  RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+-------------------+------+------+-----------+-------+-----------+
| 0  | m1.panbuhei       | 1024 |    1 |         0 |     1 | True      |
| 1  | k8s.control_plane | 8192 |   30 |         0 |     4 | True      |
| 2  | k8s.workload      | 8192 |   30 |         0 |     4 | True      |
+----+-------------------+------+------+-----------+-------+-----------+

·

2、环境变量准备

2.1 查看 openstack 所有必要的环境变量

root@cluster-api:~# clusterctl generate cluster --infrastructure openstack --list-variables test-cluster
Required Variables:
  - KUBERNETES_VERSION
  - OPENSTACK_CLOUD
  - OPENSTACK_CLOUD_CACERT_B64
  - OPENSTACK_CLOUD_PROVIDER_CONF_B64
  - OPENSTACK_CLOUD_YAML_B64
  - OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR
  - OPENSTACK_DNS_NAMESERVERS
  - OPENSTACK_EXTERNAL_NETWORK_ID
  - OPENSTACK_FAILURE_DOMAIN
  - OPENSTACK_IMAGE_NAME
  - OPENSTACK_NODE_MACHINE_FLAVOR
  - OPENSTACK_SSH_KEY_NAME

Optional Variables:
  - CLUSTER_NAME                 (defaults to test-cluster)
  - CONTROL_PLANE_MACHINE_COUNT  (defaults to 1)
  - WORKER_MACHINE_COUNT         (defaults to 0)

2.2 通过此处下载 env.rc 脚本,通过它可以设置与凭据相关的环境变量。

2.3 准备 clouds.yaml 配置文件,如下所示:

cat << "EOF" > clouds.yaml
clouds:
  panbuhei:
    identity_api_version: 3
    auth:
      auth_url: http://10.0.30.241:5000/v3/
      project_domain_name: default
      user_domain_name: default
      project_name: admin
      username: admin
      password: admin
    region_name: RegionOne
EOF

注意: 这里 openstack 的身份认证地址必须要与其 external 网络相通(即,控制平面的浮动 IP),不然,无法正确创建集群。

2.4 安装 yq

wget https://github.com/mikefarah/yq/releases/download/v4.25.2/yq_linux_amd64 -O /usr/bin/yq
chmod +x /usr/bin/yq

2.5 通过 env.rc 脚本配置相关环境变量

source env.rc ./clouds.yaml panbuhei

### 可以通过 env 查看
root@cluster-api:~# env
OPENSTACK_CLOUD_YAML_B64=......
OPENSTACK_CLOUD=panbuhei
SSH_CONNECTION=172.168.20.253 60025 172.168.30.202 22
CAPO_CLOUD=panbuhei
SSH_CLIENT=172.168.20.253 60025 22
OPENSTACK_CLOUD_PROVIDER_CONF_B64=......

2.6 除了凭据相关的环境变量外,如下必要变量需要手动声明:

# image 名称
export OPENSTACK_IMAGE_NAME=ubuntu-2004-kube-v1.22.8

# SSH 密钥对名称(需要提前创建)
export OPENSTACK_SSH_KEY_NAME=openstack-key

# 控制节点和计算节点的类型
export OPENSTACK_CONTROL_PLANE_MACHINE_FLAVOR=k8s.control_plane
export OPENSTACK_NODE_MACHINE_FLAVOR=k8s.workload

# 故障域
export OPENSTACK_FAILURE_DOMAIN=nova

# openstack external 网络 ID
export OPENSTACK_EXTERNAL_NETWORK_ID=5cadce7a-998f-4bca-a49b-b3891ce3c518

# DNS 地址(如果有自己的内部 DNS 最好,如果没有,那么连接 openstack 的所有 endpoint 就需要为可访问的 IP 地址)
export OPENSTACK_DNS_NAMESERVERS=114.114.114.114

·

3、生成集群配置文件:

clusterctl generate cluster panbuhei-cluster \
  --kubernetes-version v1.22.8 \
  --control-plane-machine-count=1 \
  --worker-machine-count=1 > panbuhei-cluster.yaml

·

4、需要手动修改的配置

  • 关闭 apiServerLoadBalancer。
  • 修改 kubeadmConfigSpec.clusterConfiguration.imageRepository 为
    registry.aliyuncs.com/google_containers

·

5、添加 default 安全组

cluster-api openstack provider 自动创建的安全组规则不包含 ssh 和 icmp 的规则,所以,添加其它安全组。如下所示:

apiVersion: infrastructure.cluster.x-k8s.io/v1alpha5
kind: OpenStackMachineTemplate
metadata:
  name: panbuhei-cluster-control-plane
  namespace: default
spec:
  template:
    spec:
      cloudName: panbuhei
      ......
      securityGroups:
      - name: default
apiVersion: infrastructure.cluster.x-k8s.io/v1alpha5
kind: OpenStackMachineTemplate
metadata:
  name: panbuhei-cluster-md-0
  namespace: default
spec:
  template:
    spec:
      cloudName: panbuhei
      ......
      securityGroups:
      - name: default

·

6、通过生成的 yaml 安装 kubernetes 集群

6.1 执行 yaml 文件
root@cluster-api:~# kubectl apply -f panbuhei-cluster.yaml 
6.2 检查集群状态
root@cluster-api:~# kubectl get cluster
NAME               PHASE         AGE     VERSION
panbuhei-cluster   Provisioned   8m16s   
6.3 查看集群详细信息
clusterctl describe cluster panbuhei-cluster

在这里插入图片描述

6.4 在 openstack 查看 kubernetes 主机

在这里插入图片描述
cluster-api provider openstack(CAPO) 会自动在 openstack 平台创建网络环境、安全组、和需要的实例。

PS: 这里需要知道,通过控制平面的浮动 IP(如上 10.0.30.228) 远程连接时,需要使用 ubuntu 用户和密钥(如上 openstack-key)进行连接连接。

6.5 查看集群的控制平面是否已启动
root@cluster-api:~# kubectl get kubeadmcontrolplane
NAME                             CLUSTER            INITIALIZED   API SERVER AVAILABLE   REPLICAS   READY   UPDATED   UNAVAILABLE   AGE   VERSION
panbuhei-cluster-control-plane   panbuhei-cluster   true                                 1                  1         1             10m   v1.22.8

当集群的控制平面启动成功后,就可以通过 clusterctl get kubeconfig 获取其集群的 kubeconfig,然后通过它来访问集群。如下所示:

clusterctl get kubeconfig panbuhei-cluster > panbuhei-cluster.kubeconfig

root@cluster-api:~# kubectl --kubeconfig=./panbuhei-cluster.kubeconfig get node
NAME                                   STATUS     ROLES                  AGE   VERSION
panbuhei-cluster-control-plane-kvxkh   NotReady   control-plane,master   12m   v1.22.8
panbuhei-cluster-md-0-72shh            NotReady   <none>                 11m   v1.22.8
6.6 为集群安装网络组件
wget https://docs.projectcalico.org/manifests/tigera-operator.yaml
wget https://docs.projectcalico.org/manifests/custom-resources.yaml

kubectl --kubeconfig=./panbuhei-cluster.kubeconfig \
apply -f tigera-operator.yaml
kubectl --kubeconfig=./panbuhei-cluster.kubeconfig \
apply -f custom-resources.yaml
6.7 再次验证集群状态
root@cluster-api:~# kubectl --kubeconfig=./panbuhei-cluster.kubeconfig get node
NAME                                   STATUS   ROLES                  AGE    VERSION
panbuhei-cluster-control-plane-kvxkh   Ready    control-plane,master   108m   v1.22.8
panbuhei-cluster-md-0-72shh            Ready    <none>                 107m   v1.22.8

在这里插入图片描述

·

7、在生成的集群中部署程序

7.1 为集群配置一个别名

alias panbuhei='kubectl --kubeconfig=/root/panbuhei-cluster.kubeconfig'

7.2 创建一个 deployment

root@cluster-api:~# panbuhei create deployment my-dep --image=nginx --replicas=3
deployment.apps/my-dep created

root@cluster-api:~# panbuhei get pod 
NAME                      READY   STATUS    RESTARTS   AGE
my-dep-5b7868d854-9mjf7   1/1     Running   0          13m
my-dep-5b7868d854-k6clf   1/1     Running   0          13m
my-dep-5b7868d854-t8g6b   1/1     Running   0          13m

·

通过 cluster-api 维护 kubernetes 集群

1、扩/缩容

只需要修改 yaml 文件中的 replicas,然后 apply 更新即可。例如,增加一个 workload 节点:

### 修改
apiVersion: cluster.x-k8s.io/v1beta1
kind: MachineDeployment
metadata:
  name: panbuhei-cluster-md-0
  namespace: default
spec:
  clusterName: panbuhei-cluster
  replicas: 2
  ......

### 更新
root@cluster-api:~# kubectl apply -f panbuhei-cluster.yaml

### 查看
root@cluster-api:~# panbuhei get node
NAME                                   STATUS   ROLES                  AGE    VERSION
panbuhei-cluster-control-plane-kvxkh   Ready    control-plane,master   149m   v1.22.8
panbuhei-cluster-md-0-72shh            Ready    <none>                 148m   v1.22.8
panbuhei-cluster-md-0-k6smc            Ready    <none>                 8m7s   v1.22.8

在这里插入图片描述

·

2、升级

首先,需要全面升级集群的控制平面;然后才是升级工作机器。

PS: 实验中未成功,这里只显示概念,如有成功的小伙伴,希望评论区留下联系方式。

2.1 升级底层机器 image

要升级机器 image 底层的控制平面机器,必须更改 KubeadmControlPlane 引用的 MachineTemplate 资源。由于 MachineTemplate 资源是不可变的,因此推荐的方法是:

  1. 复制现有的 MachineTemplate。
  2. 修改需要更改的值,例如 flavor 或 image ID。
  3. 在管理集群上创建新的 MachineTemplate。
  4. 修改现有的 KubeadmControlPlane,在 infrastructureRef 字段中引用新的
    MachineTemplate 资源。
2.2 升级 Kubernetes 控制平面版本

要升级 Kubernetes 控制平面版本,请修改 KubeadmControlPlanespec.version 字段。这将触发控制平面的滚动升级,并且根据 provider 的不同,还会升级底层机器 image。

  • 为了只触发一次升级,应首先创建新的 MachineTemplate,然后在单个事务中修改 Version 和
    InfrastructureTemplate。

KubeadmControlPlane 资源有一个 RolloutAfter 字段,可以将其设置为时间戳,无论
KubeadmControlPlane.spec 有任何更改,都应在此之后触发推出。这将推出替代控制平面节点,这些节点可能很有用,例如执行证书轮换、反映对机器模板的更改、迁移到新机器等。

2.3 升级由 MachineDeployment 管理的机器

MachineDeployments 将透明地管理 MachineSet 和机器,以实现无缝扩展体验。对 MachineDeployments 规范的修改将开始机器的滚动更新。

MachineDeployments 支持对机器进行更改的不同策略:

  • 滚动更新:通过遵守 MaxUnavailable 和 MaxSurge 值来推出更改。仅允许的值是 Int
    类型或带有整数和百分比符号的字符串,例如 “5%”。
  • 删除:更改由用户或删除旧机器的任何实体驱动。只有当一台机器被完全删除时,一个新的机器才会出现。
Logo

开源、云原生的融合云平台

更多推荐