k8s(Kubernetes)实战(一)之部署etcd与flannel
k8s(Kubernetes)实战(二)之部署api-server、controller-manager、scheduler、kubelet
k8s(Kubernetes)实战(三)之 通过kubespray-2.15.0 部署k8s
书接上文 k8s(Kubernetes)实战(一)之部署etcd与flannel 。
接下来部署k8s的各个组件api-server、controller-manager、scheduler、kubelet,以及kubectl。
本文参考文章:http://www.xiaoheidiannao.com/87635.html
k8s的release page:https://github.com/kubernetes/kubernetes/releases
进去之后,找到各版本的 CHANGELLOG,
然后找到 Server binaries的下载地址。
cd /data/download
#下载
wget https://dl.k8s.io/v1.18.14/kubernetes-server-linux-amd64.tar.gz
解压缩,复制二进制文件到执行目录。
tar -xvf kubernetes-server-linux-amd64.tar.gz
cd kubernetes/server/bin/
cp kube-scheduler kube-apiserver kube-controller-manager kubectl /data/soft/kubernetes/bin/
创建目录:
mkdir /data/www/api-cert
cd /data/www/api-cert
创建 Kubernetes apiserver 证书生成策略配置文件
cat << EOF | tee api-ca-config.json
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
# 参数详解
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;
signing: 表示该证书可用于签名其它证书;生成的 ca.pem 证书中 CA=TRUE;
server auth: 表示client可以用该 CA 对server提供的证书进行验证;
client auth: 表示server可以用该CA对client提供的证书进行验证;
# 上面生成的这个ca config文件只是证书生成策略配置文件,主要就是设定了证书的有效时间和profile
创建 Kubernetes Apiserver CA 证书签名请求
cat << EOF | tee api-ca-csr.json
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "HangZhou",
"ST": "ZheJiang",
"O": "k8s",
"OU": "System"
}
]
}
EOF
生成证书文件
cfssl gencert -initca api-ca-csr.json | cfssljson -bare api-ca
生成Kubernetes Apiserver 证书配置文件
cat << EOF | tee api-server-csr.json
{
"CN": "kubernetes",
"hosts": [
"10.0.0.1",
"127.0.0.1",
"192.168.3.218",
"192.168.3.220",
"192.168.3.248",
"192.168.3.251",
"192.168.3.207",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "HangZhou",
"ST": "ZheJiang",
"O": "k8s",
"OU": "System"
}
]
}
EOF
生成证书
cfssl gencert -ca=api-ca.pem -ca-key=api-ca-key.pem -config=api-ca-config.json -profile=kubernetes api-server-csr.json | cfssljson -bare api-server
创建 Kubernetes Proxy 证书
cat << EOF | tee kube-proxy-csr.json
"CN": "system:kube-proxy",
"hosts": [],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "HangZhou",
"ST": "ZheJiang",
"O": "k8s",
"OU": "System"
}
]
}
EOF
生成证书
cfssl gencert -ca=api-ca.pem -ca-key=api-ca-key.pem -config=api-ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy
最终生成以下证书文件
#查看
ls -l /data/www/api-cert/*pem
拷贝认证文件
cp /data/www/api-cert/*pem /data/soft/kubernetes/ssl/
创建 TLS Bootstrapping Token
#生成随机字符串
head -c 16 /dev/urandom | od -An -t x | tr -d ' '
#得到62f4ead878fd42aa216bdc14a876f7ee
编辑token文件
vim /data/soft/kubernetes/cfg/token.csv
/data/soft/kubernetes/cfg/token.csv 的内容为:
62f4ead878fd42aa216bdc14a876f7ee,kubelet-bootstrap,10001,"system:kubelet-bootstrap"
# token.csv是kubelet加入集群时候颁发证书使用
第一列:随机字符串,自己可生成
第二列:用户名
第三列:UID
第四列:用户组
创建apiserver配置文件
vim /data/soft/kubernetes/cfg/kube-apiserver
/data/soft/kubernetes/cfg/kube-apiserver 的内容:
KUBE_APISERVER_OPTS="--logtostderr=true \
--v=4 \
--etcd-servers=https://192.168.3.218:2379,https://192.168.3.248:2379 \
--bind-address=192.168.3.218 \
--secure-port=6443 \
--advertise-address=192.168.3.218 \
--allow-privileged=true \
--service-cluster-ip-range=10.0.0.0/24 \
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota,NodeRestriction \
--authorization-mode=RBAC,Node \
--enable-bootstrap-token-auth \
--token-auth-file=/data/soft/kubernetes/cfg/token.csv \
--service-node-port-range=30000-50000 \
--tls-cert-file=/data/soft/kubernetes/ssl/api-server.pem \
--tls-private-key-file=/data/soft/kubernetes/ssl/api-server-key.pem \
--client-ca-file=/data/soft/kubernetes/ssl/api-ca.pem \
--service-account-key-file=/data/soft/kubernetes/ssl/api-ca-key.pem \
--etcd-cafile=/data/soft/etcd/ssl/etcd-ca.pem \
--etcd-certfile=/data/soft/etcd/ssl/etcd-server.pem \
--etcd-keyfile=/data/soft/etcd/ssl/etcd-server-key.pem"
创建 kube-apiserver 的kube-apiserver.service文件
vim /usr/lib/systemd/system/kube-apiserver.service
/usr/lib/systemd/system/kube-apiserver.service 内容为
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=/data/soft/kubernetes/cfg/kube-apiserver
ExecStart=/data/soft/kubernetes/bin/kube-apiserver $KUBE_APISERVER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务
systemctl daemon-reload
systemctl enable kube-apiserver
systemctl restart kube-apiserver
检查kube-spi是否运行
ps -ef |grep kube-apiserver
创建kube-scheduler配置文件
vim /data/soft/kubernetes/cfg/kube-scheduler
KUBE_SCHEDULER_OPTS="--logtostderr=true --v=4 --master=127.0.0.1:8080 --leader-elect=true"
创建kube-scheduler的kube-scheduler.service 文件
vim /usr/lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/data/soft/kubernetes/cfg/kube-scheduler
ExecStart=/data/soft/kubernetes/bin/kube-scheduler $KUBE_SCHEDULER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务
systemctl daemon-reload
systemctl enable kube-scheduler.service
systemctl restart kube-scheduler.service
检查服务
#查看服务状态
systemctl status kube-scheduler.service
创建kube-controller-manager配置文件
vim /data/soft/kubernetes/cfg/kube-controller-manager
KUBE_CONTROLLER_MANAGER_OPTS="--logtostderr=true \
--v=4 \
--master=127.0.0.1:8080 \
--leader-elect=true \
--address=127.0.0.1 \
--service-cluster-ip-range=10.0.0.0/24 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/data/soft/kubernetes/ssl/api-ca.pem \
--cluster-signing-key-file=/data/soft/kubernetes/ssl/api-ca-key.pem \
--root-ca-file=/data/soft/kubernetes/ssl/api-ca.pem \
--service-account-private-key-file=/data/soft/kubernetes/ssl/api-ca-key.pem"
创建kube-controller-manager systemd unit 文件
vim /usr/lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
[Service]
EnvironmentFile=-/data/soft/kubernetes/cfg/kube-controller-manager
ExecStart=/data/soft/kubernetes/bin/kube-controller-manager $KUBE_CONTROLLER_MANAGER_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动服务
systemctl daemon-reload
systemctl enable kube-controller-manager
systemctl restart kube-controller-manager
检查服务
systemctl status kube-controller-manager
将可执行文件路/data/soft/kubernetes/ 添加到 PATH 变量中
vim /etc/profile
载文件的结尾,添加内容
PATH=/data/soft/kubernetes/bin:$PATH:$HOME/bin
source /etc/profile
查看master集群状态
kubectl get cs,nodes
node节点,应该已经事先安装好了dokcer
。。。。。。docker安装过程略
将kubelet 二进制文件拷贝node节点
#还是之前下载好的k8s文件
cd /data/upload/kubernetes/server/bin
scp -P 22 -r kubelet kube-proxy root@192.168.3.251:/data/soft/kubernetes/bin/
scp -P 22 -r kubelet kube-proxy root@192.168.3.220:/data/soft/kubernetes/bin/
创建 kubelet bootstrap kubeconfig 文件
在生成kubernetes证书的目录下执行以下命令生成kubeconfig文件:
cd /data/soft/kubernetes/ssl/
编辑快速脚本
vim environment.sh
# 创建 kubelet bootstrapping kubeconfig
BOOTSTRAP_TOKEN=62f4ead878fd42aa216bdc14a876f7ee
KUBE_APISERVER="https://192.168.3.218:6443"
# kuber-apiserver启动参数中的token.csv和kubelet启动参数中指定的bootstrap文件bootstrap.kubeconfig中的token值是否一致,此外该token必须为
实际数值,不能使用变量代替
# 设置集群参数
kubectl config set-cluster kubernetes \
--certificate-authority=./api-ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=bootstrap.kubeconfig
# 设置客户端认证参数
kubectl config set-credentials kubelet-bootstrap \
--token=${BOOTSTRAP_TOKEN} \
--kubeconfig=bootstrap.kubeconfig
# 设置上下文参数
kubectl config set-context default \
--cluster=kubernetes \
--user=kubelet-bootstrap \
--kubeconfig=bootstrap.kubeconfig
# 设置默认上下文
kubectl config use-context default --kubeconfig=bootstrap.kubeconfig
#----------------------
# 创建kube-proxy kubeconfig文件
kubectl config set-cluster kubernetes \
--certificate-authority=./api-ca.pem \
--embed-certs=true \
--server=${KUBE_APISERVER} \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-credentials kube-proxy \
--client-certificate=./kube-proxy.pem \
--client-key=./kube-proxy-key.pem \
--embed-certs=true \
--kubeconfig=kube-proxy.kubeconfig
kubectl config set-context default \
--cluster=kubernetes \
--user=kube-proxy \
--kubeconfig=kube-proxy.kubeconfig
kubectl config use-context default --kubeconfig=kube-proxy.kubeconfig
执行该脚本
bash environment.sh
将bootstrap.kubeconfig kube-proxy.kubeconfig 文件拷贝到所有 nodes节点
scp -P 22 -r bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.3.251:/data/soft/kubernetes/cfg/
scp -P 22 -r bootstrap.kubeconfig kube-proxy.kubeconfig root@192.168.3.220:/data/soft/kubernetes/cfg/
node节点配置kubelet(node节点操作)
创建 kubelet 参数配置模板文件:
vim /data/soft/kubernetes/cfg/kubelet.config
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 192.168.3.251
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS: ["10.0.0.2"]
clusterDomain: cluster.local.
failSwapOn: false
authentication:
anonymous:
enabled: true
参数说明:
address: 授权绑定的ip地址(node本地ip)
创建kubelet配置文件
vim /data/soft/kubernetes/cfg/kubelet
KUBELET_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=192.168.3.251 \
--kubeconfig=/data/soft/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/data/soft/kubernetes/cfg/bootstrap.kubeconfig \
--config=/data/soft/kubernetes/cfg/kubelet.config \
--cert-dir=/data/soft/kubernetes/ssl \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0"
创建kubelet的kubelet.service 文件
vim /usr/lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service
[Service]
EnvironmentFile=/data/soft/kubernetes/cfg/kubelet
ExecStart=/data/soft/kubernetes/bin/kubelet $KUBELET_OPTS
Restart=on-failure
KillMode=process
[Install]
WantedBy=multi-user.target
将kubelet.config kubelet 文件拷贝到所有 nodes节点
cd /data/soft/kubernetes/cfg/
scp -P 22 -r kubelet.config kubelet root@192.168.3.220:/data/soft/kubernetes/cfg/
scp -P 22 -r /usr/lib/systemd/system/kubelet.service root@192.168.0.7:/usr/lib/systemd/system/kubelet.service
将kubelet-bootstrap用户绑定到系统集群角色,master 执行(master节点)
/data/soft/kubernetes/bin/kubectl create clusterrolebinding kubelet-bootstrap \
--clusterrole=system:node-bootstrapper \
--user=kubelet-bootstrap
node启动服务kubelet
systemctl daemon-reload
systemctl enable kubelet
systemctl restart kubelet
master节点approve kubelet CSR 请求处理
这里采用手动 approve CSR 请求,在Master节点查看请求签名的Node:
#查看node节点加入集群的请求
kubectl get csr
会显示
然后手动通过请求
kubectl certificate approve node-csr-nOMSBoV60s1_jfrVJT7R5dunMuB2LQG7k4iffh-5S_s
kubectl certificate approve node-csr-xfcGk_ofPLgKGS8oYq2z8Y1NyERG-0BLWnpXUNamkU4
然后再查看下csr,发下状态变成Approved了
查看集群状态
kubectl get nodes
*注意:node节点下的/data/soft/kubernetes/ssl目录下的证书文件,是node的kubelet启动时自动生成的,如果这里的证书已经存在,他就会使用已经存在的。
这将导致:
1.如果master的API-SERVER的证书有变化,请记得删除node节点/data/soft/kubernetes/ssl目录下的全部证书,等kubelet重启时自动生成新的客户端证书
2.使用scp命令在node间拷贝文件时,可能会误操作把node1的客户端证书拷贝到node2中去,导致node2的nukelet用错误的客户端证书连接不到api,这个也是删除node节点/data/soft/kubernetes/ssl目录下的全部证书就好了
3.node的证书有变化的话,它请求注册为节点时,需要master重新同意才行,命令kubectl get csr查看新的请求成为node 的节点
kube-proxy 运行在所有 node节点上,它监听 apiserver 中 service 和 Endpoint 的变化情况,创建路由规则来进行服务负载均衡。
创建 kube-proxy 配置文件
vim /data/soft/kubernetes/cfg/kube-proxy
KUBE_PROXY_OPTS="--logtostderr=true \
--v=4 \
--hostname-override=192.168.3.251 \
--cluster-cidr=10.0.0.0/24 \
--proxy-mode=ipvs \
--masquerade-all=true \
--kubeconfig=/data/soft/kubernetes/cfg/kube-proxy.kubeconfig"
192.168.3.251为node本机的IP。
创建kube-proxy systemd unit 文件
vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.tarsget
[Service]
EnvironmentFile=/data/soft/kubernetes/cfg/kube-proxy
ExecStart=/data/soft/kubernetes/bin/kube-proxy $KUBE_PROXY_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
将kubelet.config kubelet 文件拷贝到所有 nodes节点(记得修改config的本机IP)
cd /data/soft/kubernetes/cfg/
scp -P 22 -r kube-proxy root@192.168.3.220:/data/soft/kubernetes/cfg/
scp -P 22 -r /usr/lib/systemd/system/kube-proxy.service root@192.168.3.220:/usr/lib/systemd/system/kube-proxy.service
启动服务
systemctl daemon-reload
systemctl enable kube-proxy
systemctl restart kube-proxy
查看服务的状态,
systemctl status kube-proxy
创建一个Nginx镜像的Replication Controller文件
#进入专门存储用的目录
cd /data/YAML
vim nginx-rc.yml
文件内容为:
apiVersion: v1
kind: ReplicationController
metadata:
name: nginx-rc
spec:
replicas: 3
selector:
app: nginx-rc
template:
metadata:
labels:
app: nginx-rc
spec:
containers:
- name: nginx-rc
image: nginx
ports:
- containerPort: 80
执行命令,创建replicationController,
kubectl create -f nginx-rc.yml
执行此命令,会创建处一个nginx的rc,这个rc的目的是维持3个数量的nginx的pod。
kubectl get rc
kubectl get pod -o wide
第一次启动时,各个node会需要先下载nginx的镜像,比较慢。可以看到,在2个node上启动除了3个nginx的pod。
此时只要在任意台node上,执行命令 curl http://172.18.20.2 ,就会返回nginx的主页
但是,172.18.20.2 是pod的地址,只能在内网访问,且是一个随时可能被销毁、创建的pod,地址并不不固定,不可能当作使用服务时访问的地址来使用,
所以,就会用到k8s的另一个功能,service,通过地址固定的service来链接动态创建副本的pod。
创建一个Nginx的Service文件
vim nginx-svc.yml
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
labels:
name: nginx-svc
spec:
selector:
app: nginx-rc
ports:
- port: 8080 #该service的ip的端口
targetPort: 80 #对应服务的pod的端口
protocol: TCP
nodePort: 30001 #宿主机的端口
type: NodePort
然后,创建这个svc(service)。
kubectl create -f nginx-svc.yml
查看创建好的svc,
kubectl get svc -o wide
这里说明几个端口,之前rc里定义的80端口是pod的IP的端口,这个8080是service的ip10.0.0.52的端口,30001是service所在的宿主机的端口。
svc启动后,在所有安装了proxy的node节点的ip上,都能访问nginx了。我这里就是192.168.3.251:30001和192.168.3.220:30001
接下来,最后的任务,就是配置好另一台master服务器,做好负载均衡,并把node的api地址指向虚拟IP。
拷贝文件
scp -P 22 -r /data/soft/kubernetes root@192.168.3.248:/data/soft/
scp -P 22 -r /usr/lib/systemd/system/{kube-apiserver,kube-controller-manager,kube-scheduler}.service root@192.168.3.248:/usr/lib/systemd/system/
scp -P 22 -r /data/soft/etcd/ssl/ root@192.168.3.248:/data/soft/etcd/
添加环境变量
#打开环境变量文件
vim /etc/profile
#添加的内容
export KUBERNETES_MASTER="127.0.0.1:8080"
PATH=/data/soft/kubernetes/bin:$PATH:$HOME/bin
#更新
source /etc/profile
修改配置文件(就是改IP)
vim /data/soft/kubernets/cfg/kube-apiserver
启动
systemctl start kube-apiserver.service
systemctl start kube-scheduler.service
systemctl start kube-controller-manager.service
简单测试
[root@z_master02 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-rc-97ql8 1/1 Running 0 10d
nginx-rc-cjcm5 1/1 Running 0 10d
nginx-rc-hzfp5 1/1 Running 0 10d
[root@z_master02 ~]# kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
192.168.3.220 Ready node 11d v1.18.0 192.168.3.220 CentOS Linux 7 (Core) 3.10.0-1160.6.1.el7.x86_64 docker://20.10.0
192.168.3.251 Ready node 11d v1.18.0 192.168.3.251 CentOS Linux 7 (Core) 3.10.0-1127.el7.x86_64 docker://19.3.14
[root@z_master02 ~]# kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-1 Healthy {"health":"true"}
etcd-0 Healthy {"health":"true"}
使用keepalived的vrrp技术来避免单点故障。
编辑haproxy的配置文件(2个master节点都要)
vim /etc/haproxy/haproxy.cfg
global
log /dev/log local0 warning
chroot /usr/local/etc/haproxy
maxconn 4000
user haproxy
group haproxy
daemon
defaults
log global
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
frontend kube-apiserver
bind *:9443
mode tcp
option tcplog
default_backend kube-apiserver
backend kube-apiserver
mode tcp
option tcplog
option tcp-check
balance roundrobin
default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
server kube-apiserver-1 192.168.3.218:6443 check
server kube-apiserver-2 192.168.3.248:6443 check
然后用docker方式启动
docker run -d --name=haproxy-k8s --net=host -v /etc/haproxy:/usr/local/etc/haproxy haproxy:2.1 --restart=always
编辑keepalived的配置文件(2个master节点都要)
vim /etc/keepalived/keepalived.conf
master01的keepalived配置文件内容:
global_defs {
script_user root
enable_script_security
}
vrrp_script chk_haproxy {
script "/bin/bash -c 'if [[ $(netstat -nlp | grep 9443) ]]; then exit 0; else exit 1; fi'" # haproxy 检测
interval 2 # 每2秒执行一次检测
weight 11 # 权重变化
}
vrrp_instance VI_1 {
state MASTER
interface ens192
virtual_router_id 207 # id设为相同,表示是同一个虚拟路由组
priority 100
nopreempt #可抢占
unicast_peer {
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.3.207
}
track_script {
chk_haproxy
}
}
notify "/container/service/keepalived/assets/notify.sh"
master02的keepalived配置文件内容:
global_defs {
script_user root
enable_script_security
}
vrrp_script chk_haproxy {
script "/bin/bash -c 'if [[ $(netstat -nlp | grep 9443) ]]; then exit 0; else exit 1; fi'" # haproxy 检测
interval 2 # 每2秒执行一次检测
weight 11 # 权重变化
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 207 # id设为相同,表示是同一个虚拟路由组
priority 100
nopreempt #可抢占
unicast_peer {
}
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.3.207
}
track_script {
chk_haproxy
}
}
notify "/container/service/keepalived/assets/notify.sh"
然后启动keepalived
docker run --cap-add=NET_ADMIN --cap-add=NET_BROADCAST --cap-add=NET_RAW --net=host --volume /etc/keepalived/keepalived.conf:/container/service/keepalived/assets/keepalived.conf -d osixia/keepalived:2.0.19 --copy-service --restart=always
检查vrrp的效果:
在master01上,查看网卡信息 ,命令:ip a ,可以看到虚拟IP已经写入网卡。
查看master02的网卡,应该是没有虚拟IP的。
然后把master01的keepalived关掉,去查master02的网卡,会发现它有了这个虚拟IP。
然后再把master01的keepalived开启,会发现master02的网卡已经没有虚拟IP了,master01上面有虚拟IP了。
进入配置文件目录
cd /data/soft/kubernetes/cfg/
修改文件,bootstrap.kubeconfig,kubelet.kubeconfig,kube-proxy.kubeconfig
把其中的master的ip地址192.168.3.218,改为虚拟IP地址192.168.3.207
重启服务:
systemctl restart kubelet
systemctl restart kube-proxy
2个node节点都执行这样的修改。