一. 前期准备
- 在开始操作之前,在所有节点 hosts 中配置如下所示的信息:
$ cat /etc/hosts
10.32.137.202 webservice-rs17.idcyz.hb1.kwaidc.com
10.32.137.27 webservice-rs18.idcyz.hb1.kwaidc.com
10.62.172.233 bjpg-rs866.yz02
127.0.0.1 my-dev.ci.com
- 新master节点 安装master的组件,如kubeadm、kubelet、kubectl
- 提前pull api-server、controller-manage、kube-scheduler、etcd 、coredns镜像
参考现有master的配置版本
$ kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.23.4
k8s.gcr.io/kube-controller-manager:v1.23.4
k8s.gcr.io/kube-scheduler:v1.23.4
k8s.gcr.io/kube-proxy:v1.23.4
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6
备注:一般翻墙拉取比较慢,可以从阿里云拉取,然后tag k8s.gcr.io/xxxxx
二. 更新APIServer 证书
APIServer 地址有变化 或者 新增加master节点的时候 ,由于新主机名或者IP地址不包括在证书的subject的备选名称(SAN)列表中的话,访问的时候会报错,会提示对指定的 IP 地址或者主机名访问证书无效,所以需要更新证书,使 SAN 列表中包含所有你将用来访问 APIServer 的IP地址或者主机名
首页我们一个 kubeadm 的配置文件,如果一开始安装集群的时候你就是使用的配置文件,那么我们可以直接更新这个配置文件,但是如果你没有使用配置文件,直接使用的 kubeadm init 来安装的集群,那么我们可以从集群中获取 kubeadm 的配置信息来创建一个配置文件,因为 kubeadm 会将其配置写入到 kube-system 命名空间下面一个名为 kubeadm-config 的 ConfigMap 中。
- 可以直接执行如下所示的命令将该配置导出:
$ kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml
上面的命令导出如下
controlPlaneEndpoint: 10.32.137.202:6443
apiServer:
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {
}
dns: {
}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
kind: ClusterConfiguration
kubernetesVersion: v1.23.1
networking:
dnsDomain: cluster.local
podSubnet: 172.20.0.0/16
serviceSubnet: 172.21.0.0/20
scheduler: {
}
上面的配置中并没有列出额外的 SAN 信息,我们要添加一个新的数据,需要在 apiServer 属性下面添加一个 certsSANs 的列表。
我这边由于测试 先添加了一个master节点。所以在certsSANs 列表只加了一台机器的名称跟IP
添加后
备注:controlPl