k8s(Kubernetes)实战(二)之部署api-server、controller-manager、scheduler、kubelet

k8s合集:(前两章为k8s二进制安装方法,十分复杂,推荐从第三章开始)

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/

三、部署 kube-apiserver 组件

创建 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组件

创建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

创建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

Master节点组件部署完成

 将可执行文件路/data/soft/kubernetes/ 添加到 PATH 变量中

vim /etc/profile

载文件的结尾,添加内容

PATH=/data/soft/kubernetes/bin:$PATH:$HOME/bin
source /etc/profile

 查看master集群状态

 kubectl get cs,nodes

六、部署 kubelet 组件

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"

创建kubeletkubelet.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 的节点

七、Node上部署 kube-proxy 组件

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。 

九、配置第二台MASTER

拷贝文件

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   <none>        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   <none>        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与haproxy

使用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了。

十一、把node的Apiserver地址改为虚拟IP

进入配置文件目录

cd /data/soft/kubernetes/cfg/

修改文件,bootstrap.kubeconfigkubelet.kubeconfigkube-proxy.kubeconfig

把其中的master的ip地址192.168.3.218,改为虚拟IP地址192.168.3.207

重启服务:

systemctl restart kubelet
systemctl restart kube-proxy

2个node节点都执行这样的修改。
 


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值