
Kubernetes Cluster API(OpenStack)
通过 kubernetes cluster-api 来简单、便捷的管理多个 kubernetes 集群。
描述
此文章的内容主要是通过 kubernetes cluster-api
对象,管理多个部署在 openstack
平台上的 kubernetes 集群。
·
资源说明
此次实验需要的资源:
- 一个支持 self-service 网络的 openstack 集群,并且在此之上至少可以创建 4c8g 的虚拟机两台。
- 一个 kubernetes 管理集群,可以是单节点或者 kind。
- 一个可以在 openstack 平台上部署 kubernetes 主机的镜像。
个人感觉此实验属于较大型的实验,需要的资源比较多,容易劝退大部分的人。在资源不允许的情况下还想要了解 kubernetes cluster-api
工作原理的小伙伴,推荐参考官方的快速入门实验,它是通过 kind
和 docker
来完成的,这样只需要少量的资源就可以实现。
PS: 此文章中不提供 openstack 集群的安装步骤,并且假设大家都已存在一个 kubernetes 集群。
PS: 此次实验所使用的操作系统是 Ubuntu20.04
。
·
为 OpenStack 构建 image
openstack 中必须提供与 cluster-api 兼容的 image,下面是通过 image-builder 构建兼容 image 的步骤。
1、image-builder 的先决条件
- Packer version >= 1.6.0
- Goss plugin for Packer version >= 1.2.0
- Ansible version >= 2.10.0
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
- 从此处下载适用的最新版本。.
- 将二进制文件重命名为 packer-provisioner-goss,并添加可执行权限。
- 将文件放在 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
这些自定义变量主要是替换了软件包的默认下载地址,其中 containerd
、crictl
和 goss
的下载地址默认是 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.yaml
中 nodeCidr
和 podCidr
的网络地址段,以防冲突。
- 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 资源是不可变的,因此推荐的方法是:
- 复制现有的 MachineTemplate。
- 修改需要更改的值,例如 flavor 或 image ID。
- 在管理集群上创建新的 MachineTemplate。
- 修改现有的 KubeadmControlPlane,在 infrastructureRef 字段中引用新的
MachineTemplate 资源。
2.2 升级 Kubernetes 控制平面版本
要升级 Kubernetes 控制平面版本,请修改 KubeadmControlPlane
的 spec.version
字段。这将触发控制平面的滚动升级,并且根据 provider 的不同,还会升级底层机器 image。
- 为了只触发一次升级,应首先创建新的 MachineTemplate,然后在单个事务中修改 Version 和
InfrastructureTemplate。
KubeadmControlPlane 资源有一个 RolloutAfter
字段,可以将其设置为时间戳,无论
KubeadmControlPlane.spec
有任何更改,都应在此之后触发推出。这将推出替代控制平面节点,这些节点可能很有用,例如执行证书轮换、反映对机器模板的更改、迁移到新机器等。
2.3 升级由 MachineDeployment 管理的机器
MachineDeployments 将透明地管理 MachineSet 和机器,以实现无缝扩展体验。对 MachineDeployments 规范的修改将开始机器的滚动更新。
MachineDeployments 支持对机器进行更改的不同策略:
- 滚动更新:通过遵守 MaxUnavailable 和 MaxSurge 值来推出更改。仅允许的值是 Int
类型或带有整数和百分比符号的字符串,例如 “5%”。 - 删除:更改由用户或删除旧机器的任何实体驱动。只有当一台机器被完全删除时,一个新的机器才会出现。
更多推荐
所有评论(0)