kubeadm 提供了kubeadm init
和 kubeadm join
,可以快速创建 k8s 集群
kubeadm 通过执行必要的操作来启动和运行最小可用集群。按照设计,它只关注启动引导,而非配置机器
我们希望在 kubeadm 之上构建更高级别以及更加合规的工具,理想情况下,使用 kubeadm 作为所有部署工作的基准将会更加易于创建一致性集群
安装各种 “锦上添花” 的扩展,例如 Kubernetes Dashboard、监控方案、以及特定云平台的扩展,都不在讨论范围内
安装 kubeadm https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.3e221b11Qo8aZk
kubeadm 1 kubeadm [command ] [flags]
command:
1 2 3 4 5 6 7 8 9 10 11 alpha certs completion config help init join reset token upgrade version
flags:
1 2 3 4 5 6 7 8 9 --add-dir-header -h, --help --log-file string --log-file-max-size uint --one-output --rootfs string --skip-headers --skip-log-headers -v, --v Level
kubeadm completion
让 kubeadm 命令支持自动补全,只支持 bash 和 zsh 两种环境。 将 kubeadm completion bash
打印的脚本加载到环境变量即可:
1 2 3 4 5 6 7 yum install bash-completion -y touch /etc/profile.d/kubeadm_completion.shkubeadm completion bash > /etc/profile.d/kubeadm_completion.sh exit [root@master01 ~]$kubeadm alpha certs completion config help init join reset token upgrade version
kubeadm init
此命令初始化一个 Kubernetes 控制平面节点
参考:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-init
kubeadm init
执行流程:
检查系统状态,有的检查只报错,有的检查会退出流程
生成自签名 CA(可用使用用户提供的现有 CA)为集群中的每个组件设置身份,默认存放在 /etc/kubernetes/kpi
在 /etc/kubernetes/ 中为 kubelet、controller-manger 和 scheduler 编写配置文件,让它们可以连接 API Server,每个文件都需要有自己的标识。同时还需要为管理用途编写文件 admin.conf
alpha 相关,略…
为 API Server、controller-manager 和 scheduler 生成静态的 manifest 文件。如果没有提供外部 etcd,也会为 etcd 生成一个额外的 Pod manifest 文件。 静态 Pod 的 manifest 文件将会写入 /etc/kubernetes/manifest,kubelet 监控这个目录,在启动时判断是否生成 Pod。 一旦控制平面 Pod 启动并运行,kubeadm init
将会继续运行
alpha 相关,略…
将标签和 taint 应用到 master 节点,这样就不会有额外的工作负载运行在该节点上
生成 token 以让额外的 node 能够将它们自己注册到这个 master,默认有效期 24 小时
创建所有必需的配置让 node 能够通过 Bootstrap Token 和 TLS Bootstrap 机制来加入集群
编写一个 ConfigMap 来提供加入集群所需的所有信息,并设置相关的 RBAC 访问规则
让 Bootstrap Token 能够访问 CSR 鉴权 API
为所有新的 CSR 请求配置 auto-approval
安装内部的 DNS 服务(默认 CoreDNS),通过 Api Server 安装 kube-proxy 插件组件 请注意:就算部署了 DNS 服务,在安装 CNI 之前它也不会被调度到 node 上
alpha 相关,略…
1 2 kubeadm init [command ] kubeadm init [flags]
command:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 kubeadm init phase [command ] addon bootstrap-token certs control-plane etcd kubeconfig kubelet-finalize kubelet-start mark-control-plane preflight upload-certs upload-config
flags:标星的是需要指定的,其他没有标星的一般情况下使用默认值即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ★ --apiserver-advertise-address string ★ --apiserver-bind-port int32 --apiserver-cert-extra-sans strings --cert-dir string --certificate-key string --config string ★ --control-plane-endpoint string --cri-socket string --dry-run --experimental-patches string --feature-gates string --ignore-preflight-errors strings ★ --image-repository string ★ --kubernetes-version string --node-name string ★ --pod-network-cidr string ★ --service-cidr string --service-dns-domain string --skip-certificate-key- --skip-phases strings --skip-token-print --token string --token-ttl duration --upload-certs
k8s 中有三个网段:node、service、pod,这三个网段千万不要冲突,否则通信会出现问题
范例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 kubeadm init --apiserver-advertise-address=10.0.0.71 \ --control-plane-endpoint=10.0.0.1 \ --apiserver-bind-port=6443 \ --kubernetes-version=v1.20.2 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.10.0.0/16 \ --image-repository=registry.aliyuncs.com/google_containers kubeadm init --apiserver-advertise-address=10.0.0.71 \ --apiserver-bind-port=6443 \ --kubernetes-version=v1.20.2 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.10.0.0/16 \ --image-repository=registry.aliyuncs.com/google_containers
kubeadm join
此命令用来初始化 Kubernetes 节点并将其加入集群
在执行完 kubeadm init
后,会在终端打印以后加入此集群时需要执行的kubeadm join
命令
参考:https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm-join/
当节点加入 kubeadm 初始化的集群时,我们需要建立双向信任。 这个过程可以分解为发现 和TLS 引导 两部分。
通常两个部分会使用相同的令牌。 在这种情况下可以使用 –token 参数,而不是单独指定每个令牌。
1 2 kubeadm join [api-server-endpoint] [flags] kubeadm join [command ]
command:
api-server-endpoint:控制平面的 IP,如果是单控制平面,就是 master 节点的 IP,如果是多控制平面,就是 VIP
flags:
kubeadm alpha
kubeadm 处于测试阶段的命令,尽量不要用,kubeadm alpha --help
查看有哪些命令,v1.20.2 版本中只有一个:kubeconfig
kubeadm certs
command:
1 2 3 4 certificate-key check-expiration generate-csr renew
1 2 3 4 5 kubeadm certs check-expiration [flags] --cert-dir string --config string --kubeconfig string
1 2 3 4 5 kubeadm certs generate-csr [flags] --cert-dir string --config string --kubeconfig-dir string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 kubeadm certs renew [command ] admin.conf all apiserver apiserver-etcd-client apiserver-kubelet-client controller-manager.conf etcd-healthcheck-client etcd-peer etcd-server front-proxy-client scheduler.conf
kubeadm config
在 kubeadm init
执行期间,kubeadm 将 ClusterConfiguration 对象上传到你的集群的 kube-system 名字空间下 名为 kubeadm-config 的 ConfigMap 对象中。 然后在 kubeadm join
、kubeadm reset
和 kubeadm upgrade
执行期间读取此配置。 要查看此 ConfigMap,请调用 kubectl get cm -o yaml -n kube-system kubeadm-config
。
你可以使用 kubeadm config print
命令打印默认配置, 并使用 kubeadm config migrate
命令将旧版本的配置转化成新版本。 kubeadm config images list
和 kubeadm config images pull
命令可以用来列出并拉取 kubeadm 所需的镜像。
1 2 kubeadm config [command ] kubeadm config [flags]
command:
1 2 3 4 kubeadm config images [command ] [flags] list pull
1 2 3 4 5 6 7 8 kubeadm config images list [flags] --allow-missing-template-keys --config string -o, --experimental-output string --feature-gates string --image-repository string --kubernetes-version string
1 2 3 4 5 6 7 kubeadm config images pull [flags] --config string --cri-socket string --feature-gates string --image-repository string --kubernetes-version string
1 2 3 4 kubeadm config migrate [flags] --new-config string --old-config string
1 2 3 4 kubeadm config print [command ] init-defaults join-defaults
1 2 3 4 kubeadm config print init-defaults [flags] kubeadm config print join-defaults [flags] --component-configs strings
flags:
kubeadm reset
kubeadm reset
负责从使用 kubeadm init
或 kubeadm join
命令创建的文件中清除节点本地文件系统。对于控制平面节点,reset 还从 etcd 集群中删除该节点的本地 etcd 堆成员,还从 kubeadm ClusterStatus 对象中删除该节点的信息。 ClusterStatus 是一个 kubeadm 管理的 Kubernetes API 对象,该对象包含 kube-apiserver 端点列表。
kubeadm reset phase
可用于执行上述工作流程的各个阶段。 要跳过阶段列表,你可以使用 –skip-phases 参数,该参数的工作方式类似于 kubeadm join
和 kubeadm init
阶段运行器
“reset” 执行以下阶段:
1 2 3 4 preflight Run reset pre-flight checks update-cluster-status Remove this node from the ClusterStatus object. remove-etcd-member Remove a local etcd member. cleanup-node Run cleanup node.
1 2 kubeadm reset [command ] kubeadm reset [flags]
command:
1 2 3 4 5 6 kubeadm reset phase [command ] cleanup-node preflight remove-etcd-member update-cluster-status
flags:
1 2 3 4 5 6 --cert-dir string --cri-socket string -f, --force --ignore-preflight-errors strings --kubeconfig string --skip-phases strings
注意:如果使用了外部 etcd,kubeadm reset
将不会删除任何 etcd 中的数据
kubeadm token
用于管理 kubeadm join
使用的令牌
使用 kubeadm init
默认生成的 token 有效期 24 小时
1 2 3 4 5 6 7 8 9 10 $kubeadm token create --print-join-commandkubeadm join 10.0.0.171:6443 --token mud4vy.ygs3zdmuz6rwggrt --discovery-token-ca-cert-hash sha256:83da17177796380c6038dd8a76bc7050fd9c3c6b55d53a7f7a652817cc73c8e6 $kubeadm token listTOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS mud4vy.ygs3zdmuz6rwggrt 23h 2021-01-23T23:46:03+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token $openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 83da17177796380c6038dd8a76bc7050fd9c3c6b55d53a7f7a652817cc73c8e6
kubeadm upgrade
用于升级 Kubernetes 集群到新版本
kubeadm version
用于打印 kubeadm 的版本信息
kubeadm help
部署 k8s 集群
学习环境,简单部署,准备三台主机,都是 centos7
角色
主机名
ip 地址
master1
master01.ljk.cn
10.0.0.71/24
node1
node01.ljk.cn
10.0.0.72/24
node2
node02.ljk.cn
10.0.0.73/24
注意:kubernetes 对 docker 的版本有要求,最新版本的 docker 一般来讲都不兼容
经过测试:kubernetes v1.20.2 最高支持 docker v19.03
在三台主机上均执行以下步骤:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache fast yum list docker-ce.x86_64 --showduplicates | sort -r yum install -y docker-ce-19.03.9 mkdir -p /etc/dockertee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors" : ["https://3417nt4m.mirror.aliyuncs.com" ], "exec-opts" :["native.cgroupdriver=systemd" ] } EOF systemctl enable --now docker.service
在三台主机上均执行以下步骤:
1 2 3 4 5 6 7 8 9 10 11 12 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF setenforce 0 yum install -y kubelet kubeadm kubectl systemctl enable --now kubelet
部署 dns,或者直接修改/etc/hosts 在三台主机上均执行以下步骤:
1 2 3 4 5 ... 10.0.0.71 master01.ljk.cn 10.0.0.72 node01.ljk.cn 10.0.0.73 node02.ljk.cn
kubeadm init
初始化集群初始化,而且集群初始化只需要初始化一次
注意:kubeadm init
必须在 master 节点上运行,任意一 master 节点即可
1 2 3 4 kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers --kubernetes-version=v1.20.2 [root@master01 docker]$kubeadm init phase preflight
初始化,两种方式:
1 2 3 4 5 6 7 8 [root@master01 ~]$kubeadm init --apiserver-advertise-address=10.0.0.71 \ --apiserver-bind-port=6443 \ --kubernetes-version=v1.20.2 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.10.0.0/16 \ --image-repository=registry.aliyuncs.com/google_containers \ --ignore-preflight-errors=NumCPU
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 [root@master01 ~]$kubeadm config print init-defaults > /etc/kubernetes/kubeadmin-init.yaml [root@master01 ~]$cat /etc/kubernetes/kubeadmin-init.yaml apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups : - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 10.0.0.71 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: master01.ljk.cn taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type : CoreDNS etcd: local : dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.20.2 networking: dnsDomain: ljk.local podSubnet: 10.244.0.0/16 serviceSubnet: 10.10.0.0/16 scheduler: {} [root@master01 docker]$kubeadm init --config=/etc/kubernetes/kubeadmin-init.yaml --ignore-preflight-errors=NumCPU ... ... ... Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME /.kube sudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/config sudo chown $(id -u):$(id -g) $HOME /.kube/config Alternatively, if you are the root user, you can run: export KUBECONFIG=/etc/kubernetes/admin.conf You should now deploy a pod network to the cluster. Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.0.0.71:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:b794ecc7f2fc825b58e4e2108eab0dfa603c3d861de55bcc8c437949bed83fec mkdir -p $HOME /.kubesudo cp -i /etc/kubernetes/admin.conf $HOME /.kube/config sudo chown $(id -u):$(id -g) $HOME /.kube/config export KUBECONFIG=/etc/kubernetes/admin.confkubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
补充:如果是多控制平面,kubeadm init
需要添加 –control-plane-endpoint 参数,设置访问多个 master 的 VIP,通常是 keepalived+HAProxy 配置多个 master 的高可用
1 2 3 4 5 6 7 8 [root@master01 ~]$kubeadm init --apiserver-advertise-address=10.0.0.71 \ --control-plane-endpoint=10.0.0.1 \ --apiserver-bind-port=6443 \ --kubernetes-version=v1.20.2 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.10.0.0/16 \ --image-repository=registry.aliyuncs.com/google_containers \ --ignore-preflight-errors=NumCPU
kubeadm join
node 加入 k8s 集群加入集群的 kubeadm join
命令在 kubeadm init
完成后会自动打印出来,如果将来 token 和 hash 过期失效了,使用 kubeadm token create --print-join-command
重新生成即可
1 2 3 4 5 6 7 8 [root@node01 kubernetes]$kubeadm join 10.0.0.71:6443 \ --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:b794ecc7f2fc825b58e4e2108eab0dfa603c3d861de55bcc8c437949bed83fec [root@node02 ~]$kubeadm join 10.0.0.71:6443 \ --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:b794ecc7f2fc825b58e4e2108eab0dfa603c3d861de55bcc8c437949bed83fec
查看是否加入成功:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 [root@master01 ~]$kubectl get nodes NAME STATUS ROLES AGE VERSION master01.ljk.cn Ready control-plane,master 53m v1.20.2 node01.ljk.cn Ready <none> 6m24s v1.20.2 node02.ljk.cn Ready <none> 10m v1.20.2 [root@master01 ~]$ip a ... 4: flannel.1: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN group default link /ether 26:69:fd:2f:7a:3f brd ff:ff:ff:ff:ff:ff [root@node01 kubernetes]$ip a ... 4: flannel.1: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN group default link /ether a2:74:d6:61:d5:5c brd ff:ff:ff:ff:ff:ff [root@node02 ~]$ip a ... 4: flannel.1: <BROADCAST,MULTICAST> mtu 1450 qdisc noop state DOWN group default link /ether fe:83:2b:fc :1e:01 brd ff:ff:ff:ff:ff:ff
部署 Web 服务 Dashboard github 地址:https://github.com/kubernetes/dashboard/releases
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 $wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml$vim recommended.yaml... spec: type : NodePort ports: - port: 443 targetPort: 8443 nodePort: 30002 selector: k8s-app: kubernetes-dashboard ... kubectl apply -f ./recommended.yaml $kubectl get pod -n kubernetes-dashboardNAME READY STATUS RESTARTS AGE dashboard-metrics-scraper-79c5968bdc-5dv7w 1/1 Running 0 88m kubernetes-dashboard-7448ffc97b-rg77t 1/1 Running 0 88m $cat admin-user.ymlapiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard $kubectl apply -f admin-user.yml$kubectl get secrets -A | grep admin-user$kubectl describe secrets -n kubernetes-dashboard admin-user-token-wpz7jName: admin-user-token-wpz7j Namespace: kubernetes-dashboard Labels: <none> Annotations: kubernetes.io/service-account.name: admin-user kubernetes.io/service-account.uid: 613c9277-f124-4622-88c9-714dc2479602 Type: kubernetes.io/service-account-token Data ==== ca.crt: 1066 bytes namespace: 20 bytes token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjJ2THVKYzd4Q3hVeVI5QWVCMk5YUU5kbE9lRzJjZ1hHZkV0WndQUGczWmcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLXdwejdqIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiI2MTNjOTI3Ny1mMTI0LTQ2MjItODhjOS03MTRkYzI0Nzk2MDIiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZXJuZXRlcy1kYXNoYm9hcmQ6YWRtaW4tdXNlciJ9.N7Hcf9JIgV5p_j8-YYJHMDrqGkGtsalTxbabTjXASyoR63gmvNmekPACQ9EDwu1MF2du3wkyReVb_aYD11tHw4XsNbfnoaytYqcQ9U8lhLXd8A7wlBnK8_EBa5-XP0-nRRSw7gUsG6s7xvrviWcndNO0nIUPgS--B1G8S-AR_Y0CJRzFF4FL0zhZvxCxSDwHO2OrjKpbxhuZOgzhOI_CXCEMghsCyUUFeNlRj2F-YulzVNLdJSzIh0UMyvoKVv6ylesRtyUJK8lo3tpcC0K4hTKsWYXHgibto024tT4D1KtYLqNhEhI4PkYogZQTsG3-ggVo5Nry5m8AL0CKCD0xoA
最后,打开浏览器,输入 https://10.0.0.171:30002/,除了10.0.0.171,10.0.0.71 和 10.0.0.72 也可以,然后 copy 刚才生产的 admin-user 用户的 token,成功登陆
k8s 集群升级 小版本升级,一般不会有很大更改,经过充分测试,直接升级即可
大版本升级,风险较大,可以像小版本一样,经过测试,然后直接升级;但是更推荐以下升级方式:
在备用的服务器上再部署一套 k8s 集群,使用最新的 k8s 版本
把业务离线导入新的 k8s 集群
经过测试后,切换负载均衡到新的 k8s 集群
下线的旧 k8s 集群,直接重装系统,安装最新的 ubuntu 或者 centos,然后作为 node 加入到新的 k8s 集群
升级完成
这种方法是比较稳妥的,只是成本比较高,需要有充足的备用的服务器,如果目前的 k8s 集群使用 30 台服务器,那备用的服务器差不多也得 20 台
升级 master 先升级 kubeadm,kubeadm 是 k8s 升级的“准升证”
验证当 k8s 前版本
各 master 安装指定新版本 kubeadm
1 2 3 4 $apt -cache madison kubeadm $apt -get install kubeadm=1.17.4-00 $kubeadm version $apt install kubelet=1.17.4-00 kubectl=1.17.4-00
kubeadm 升级命令使用帮助
1 2 3 4 5 6 7 8 9 10 11 12 $kubeadm upgrade --help Upgrade your cluster smoothly to a newer version with this command Usage: kubeadm upgrade [flags] kubeadm upgrade [command ] Available Commands: apply Upgrade your Kubernetes cluster to the specified version diff Show what differences would be applied to existing static pod manifests. See also: kubeadm upgrade apply --dry-run node Upgrade commands for a node in the cluster plan Check which versions are available to upgrade to and validate whether your current cluster is upgradeable. To skip the internet check, pass in the optional [version] parameter
升级计划
开始升级
1 2 3 $kubeadm upgrade apply v1.17.4 $kubeadm upgrade apply v1.17.4 $kubeadm upgrade apply v1.17.4
验证镜像
升级 node 升级客户端服务 kubectl kubelet
验证当前 node 版本信息
升级各 node 节点配置文件
1 $kubeadm upgrade node --kubelet-version v1.17.4
各 Node 节点升级 kubelet、kubeadm、kubectl 二进制包
1 $apt install kubelet=1.17.4-00 kubeadm=1.17.4-00 kubectl=1.17.4-00
测试运行 Nginx+Tomcat