kubeadm安装kubernetes多master高可用集群 docker K8S



---架构信息

系统版本:CentOS 7.9

内核:4.18.0-80.7.2.el7

Kubernetes: v1.20.4

Docker-ce: v19.03.6

推荐硬件配置:2核2G

Keepalived保证apiserever服务器的IP高可用

Haproxy实现apiserver的负载均衡

为了减少服务器数量,haproxy、keepalived配置在node-01和node-02。

节点名称角色IP安装软件
负载VIPVIP10.11.90.200
node-01master10.11.90.201kubeadm、kubelet、kubectl、docker、haproxy、keepalived
node-02master10.11.90.202kubeadm、kubelet、kubectl、docker、haproxy、keepalived
node-03master10.11.90.203kubeadm、kubelet、kubectl、docker
node-04node10.11.90.204kubeadm、kubelet、kubectl、docker
node-05node10.11.90.205kubeadm、kubelet、kubectl、docker
node-06node10.11.90.206kubeadm、kubelet、kubectl、docker
service网段10.245.0.0/16


---部署前准备工作

1) 关闭selinux和防火墙

sed -ri 's#(SELINUX=).*#\1disabled#' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld

2) 关闭swap

swapoff -a

3) 为每台服务器添加host解析记录

cat >>/etc/hosts<<EOF
10.11.90.201 node-01
10.11.90.202 node-02
10.11.90.203 node-03
10.11.90.204 node-04
10.11.90.205 node-05
10.11.90.206 node-06
EOF

4) 创建并分发密钥

-在node-01创建ssh密钥。

ssh-keygen -t rsa

-分发node-01的公钥,用于免密登录其他服务器

for n in `seq -w 01 06`;do ssh-copy-id node-$n;done

5) 配置内核参数

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 1
vm.swappiness=0
EOF
sysctl --system

6) 加载ipvs模块

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

7) 添加yum源

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
wget http://mirrors.aliyun.com/repo/Centos-7.repo -O /etc/yum.repos.d/CentOS-Base.repo
wget http://mirrors.aliyun.com/repo/epel-7.repo -O /etc/yum.repos.d/epel.repo 
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo


---部署keepalived和haproxy

-在node-01和node-02安装keepalived和haproxy

yum install -y keepalived haproxy

-keepalived配置

node-01的priority为100,node-02的priority为90,其他配置一样。

[root@node-01 ~]# cat /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
   notification_email {
        feng110498@163.com
   }
   notification_email_from Alexandre.Cassen@firewall.loc
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id LVS_1
}
vrrp_instance VI_1 {
    state MASTER          
    interface eth0
    lvs_sync_daemon_inteface eth0
    virtual_router_id 88
    advert_int 1
    priority 100         
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
      10.31.90.200/24
    }
}

-haproxy配置

node-01和node-02的haproxy配置是一样的。此处我们监听的是10.31.90.200的8443端口,因为haproxy是和k8s apiserver是部署在同一台服务器上,都用6443会冲突。

global
        chroot  /var/lib/haproxy
        daemon
        group haproxy
        user haproxy
        log 127.0.0.1:514 local0 warning
        pidfile /var/lib/haproxy.pid
        maxconn 20000
        spread-checks 3
        nbproc 8
defaults
        log     global
        mode    tcp
        retries 3
        option redispatch
listen https-apiserver
        bind 10.31.90.200:8443
        mode tcp
        balance roundrobin
        timeout server 900s
        timeout connect 15s
        server apiserver01 10.31.90.201:6443 check port 6443 inter 5000 fall 5
        server apiserver02 10.31.90.202:6443 check port 6443 inter 5000 fall 5
        server apiserver03 10.31.90.203:6443 check port 6443 inter 5000 fall 5

-启动服务

systemctl enable keepalived && systemctl start keepalived 

systemctl enable haproxy && systemctl start haproxy 


# 部署kubernetes

yum install -y kubelet-1.13.2 kubeadm-1.13.2 kubectl-1.13.2 ipvsadm ipset docker-ce-18.06.1.ce

#启动docker

systemctl enable docker && systemctl start docker

#设置kubelet开机自启动

systemctl enable kubelet 


-修改初始化配置

使用kubeadm config print init-defaults > kubeadm-init.yaml 打印出默认配置,然后在根据自己的环境修改配置.

[root@node-01 ~]# cat kubeadm-init.yaml 
apiVersion: kubeadm.k8s.io/v1beta1
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 10.31.90.201
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: node-01
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiVersion: kubeadm.k8s.io/v1beta1
kind: ClusterConfiguration
apiServer:
  timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "10.31.90.200:8443"
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kubernetesVersion: v1.13.2
networking:
  dnsDomain: cluster.local
  podSubnet: ""
  serviceSubnet: "10.245.0.0/16"
scheduler: {}
controllerManager: {}
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"

-预下载镜像

kubeadm config images pull --config kubeadm-init.yaml 

-初始化

kubeadm init --config kubeadm-init.yaml    


kubeadm init主要执行了以下操作:

[init]:指定版本进行初始化操作

[preflight] :初始化前的检查和下载所需要的Docker镜像文件

[kubelet-start] :生成kubelet的配置文件”/var/lib/kubelet/config.yaml”,没有这个文件kubelet无法启动,所以初始化之前的kubelet实际上启动失败。

[certificates]:生成Kubernetes使用的证书,存放在/etc/kubernetes/pki目录中。

[kubeconfig] :生成 KubeConfig 文件,存放在/etc/kubernetes目录中,组件之间通信需要使用对应文件。

[control-plane]:使用/etc/kubernetes/manifest目录下的YAML文件,安装 Master 组件。

[etcd]:使用/etc/kubernetes/manifest/etcd.yaml安装Etcd服务。

[wait-control-plane]:等待control-plan部署的Master组件启动。

[apiclient]:检查Master组件服务状态。

[uploadconfig]:更新配置

[kubelet]:使用configMap配置kubelet。

[patchnode]:更新CNI信息到Node上,通过注释的方式记录。

[mark-control-plane]:为当前节点打标签,打了角色Master,和不可调度标签,这样默认就不会使用Master节点来运行Pod。

[bootstrap-token]:生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到

[addons]:安装附加组件CoreDNS和kube-proxy


-为kubectl准备Kubeconfig文件

kubectl默认会在执行的用户家目录下面的.kube目录下寻找config文件。这里是将在初始化时[kubeconfig]步骤生成的admin.conf拷贝到.kube/config。

[root@node-01 ~]# mkdir -p $HOME/.kube
[root@node-01 ~]# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@node-01 ~]# chown $(id -u):$(id -g)$HOME/.kube/config

在该配置文件中,记录了API Server的访问地址,所以后面直接执行kubectl命令就可以正常连接到API Server中。


-查看组件状态

[root@node-01 ~]# kubectl get cs

NAME                 STATUS    MESSAGE              ERROR

scheduler            Healthy   ok                   

controller-manager   Healthy   ok                   

etcd-0               Healthy   {"health": "true"}  


[root@node-01 ~]# kubectl get node

NAME      STATUS   ROLES    AGE   VERSION

node-01   NotReady    master   14m   v1.13.2

目前只有一个节点,角色是Master,状态是NotReady。


-其他master部署

在node-01将证书文件拷贝至其他master节点

USER=root

CONTROL_PLANE_IPS="node-02 node-03"

for host in ${CONTROL_PLANE_IPS}; do

    ssh "${USER}"@$host "mkdir -p /etc/kubernetes/pki/etcd"

    scp /etc/kubernetes/pki/ca.* "${USER}"@$host:/etc/kubernetes/pki/

    scp /etc/kubernetes/pki/sa.* "${USER}"@$host:/etc/kubernetes/pki/

    scp /etc/kubernetes/pki/front-proxy-ca.* "${USER}"@$host:/etc/kubernetes/pki/

    scp /etc/kubernetes/pki/etcd/ca.* "${USER}"@$host:/etc/kubernetes/pki/etcd/

    scp /etc/kubernetes/admin.conf "${USER}"@$host:/etc/kubernetes/

done

在其他master执行,注意--experimental-control-plane参数

kubeadm join 10.31.90.200:8443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:84201a329ec4388263e97303c6e4de50c2de2aa157a3b961cb8a6f325fadedb1 --experimental-control-plane

注意:token有效期是有限的,如果旧的token过期,可以使用kubeadm token create --print-join-command重新创建一条token。


-node部署

在node-04、node-05、node-06执行,注意没有--experimental-control-plane参数

kubeadm join 10.31.90.200:8443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:84201a329ec4388263e97303c6e4de50c2de2aa157a3b961cb8a6f325fadedb1


-部署网络插件flannel

Master节点NotReady的原因就是因为没有使用任何的网络插件,此时Node和Master的连接还不正常。目前最流行的Kubernetes网络插件有Flannel、Calico、Canal、Weave这里选择使用flannel。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml


-查看节点状态

所有的节点已经处于Ready状态。

[root@node-01 ~]# kubectl get node

NAME      STATUS   ROLES    AGE   VERSION

node-01   Ready    master   35m   v1.13.2

node-02   Ready    master   36m   v1.13.2


-查看pod

[root@node-01 ~]# kubectl get pod -n kube-system

NAME                                        READY   STATUS    RESTARTS   AGE

coredns-89cc84847-j8mmg                     1/1     Running   0          1d

coredns-89cc84847-rbjxs                     1/1     Running   0          1d


-查看ipvs的状态

[root@node-01 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn  

TCP  10.245.0.1:443 rr

  -> 10.31.90.201:6443            Masq    1      2          0         

  -> 10.31.90.202:6443            Masq    1      0          0         

  -> 10.31.90.203:6443            Masq    1      2          0         

TCP  10.245.0.10:53 rr

  -> 10.32.0.3:53                 Masq    1      0          0         

  -> 10.32.0.4:53                 Masq    1      0          0                

TCP  10.245.90.161:80 rr

  -> 10.45.0.1:80                 Masq    1      0          0         

TCP  10.245.90.161:443 rr

  -> 10.45.0.1:443                Masq    1      0          0         

TCP  10.245.149.227:1 rr

  -> 10.31.90.204:1               Masq    1      0          0         

  -> 10.31.90.205:1               Masq    1      0          0         

  -> 10.31.90.206:1               Masq    1      0          0         

TCP  10.245.181.126:80 rr

  -> 10.34.0.2:80                 Masq    1      0          0         

  -> 10.45.0.0:80                 Masq    1      0          0         

  -> 10.46.0.0:80                 Masq    1      0          0             

UDP  10.245.0.10:53 rr

  -> 10.32.0.3:53                 Masq    1      0          0         

  -> 10.32.0.4:53                 Masq    1      0          0    

至此kubernetes集群部署完成。


https://blog.51cto.com/billy98/2350660


# 将使用kubeadm创建的Kubernetes集群从版本1.13.x升级到版本1.14.x。

升级工作流程如下:

升级主master节点。

升级其他master节点。

升级work节点。


当前kubernetes版本信息:

kubectl get nodes

NAME      STATUS   ROLES    AGE   VERSION

node-01   Ready    master   99d   v1.13.3

node-02   Ready    master   99d   v1.13.3

node-03   Ready    master   99d   v1.13.3

node-04   Ready    <none>   99d   v1.13.3

node-05   Ready    <none>   99d   v1.13.3

node-06   Ready    <none>   99d   v1.13.3


# 升级主master节

1. 在第一个master节点上,升级kubeadm

yum install kubeadm-1.14.1  -y

2. 验证下载是否有效并具有预期版本:

kubeadm version

3. 运行kubeadm upgrade plan

此命令检查您的群集是否可以升级,并获取可以升级到的版本

kubeadm upgrade plan

4.运行升级命令

kubeadm upgrade apply v1.14.1

5.手动升级您的CNI提供程序插件

你的容器网络接口(CNI)提供商可能有自己的升级说明。检查插件页面以查找你的CNI提供商,并查看是否需要其他升级步骤。

6.升级第一个master节点上的kubelet和kubectl

yum install kubectl-1.14.1 kebulet-1.14.1 -y

7.重启kubelet

systemctl daemon-reload
systemctl restart kubelet


#升级其他master节点

1. 升级kubeadm程序

yum install kubeadm-1.14.1 -y

2. 升级静态pod

kubeadm upgrade node experimental-control-plane

3. 更新kubelet和kubectl

yum install kubectl-1.14.1 kebulet-1.14.1 -y

4. 重启kubelet

systemctl daemon-reload
systemctl restart kubelet


#升级work节点

1. 在work节点上升级kubeadm:

yum install -y kubeadm-1.14.1

2.调整调度策略

通过将节点标记为不可调度并逐出pod来准备节点以进行维护(此步骤在master上执行)。

kubectl drain $NODE --ignore-daemonsets

[root@node-01 ~]#

kubectl drain node-04 --ignore-daemonsets

3. 更新node

[root@node-04 ~]#

kubeadm upgrade node config --kubelet-version v1.14.1

4. 更新kubelet和kubectl

yum install kubectl-1.14.1 kebulet-1.14.1 -y

5.重启kubelet

systemctl daemon-reload
systemctl restart kubelet

6. 恢复调度策略(master执行)

kubectl uncordon $NODE

[root@node-04 ~]# 

kubectl uncordon node-04

其他work节点升级根据以上的步骤执行一遍即可。


# 验证群集的状态

在所有节点上升级kubelet之后,通过从kubectl可以访问群集的任何位置运行以下命令来验证所有节点是否可用:

[root@node-01 ~]# kubectl get nodes

NAME      STATUS   ROLES    AGE   VERSION

node-01   Ready    master   99d   v1.14.1

node-02   Ready    master   99d   v1.14.1

该STATUS列所有节点应显示Ready,并且应更新版本号。


# 工作原理

kubeadm upgrade apply 执行以下操作:

检查您的群集是否处于可升级状态:

API服务器是可访问的

所有节点都处于该Ready状态

master是否健康

执行版本控制策略。

确保master镜像可用或可用于拉到机器。

升级master组件或回滚(如果其中任何一个组件无法启动)。

应用新的kube-dns和kube-proxy清单,并确保创建所有必需的RBAC规则。

创建API服务器的新证书和密钥文件,如果旧文件即将在180天后过期,则备份旧文件。

kubeadm upgrade node experimental-control-plane在其他控制平面节点上执行以下操作:

ClusterConfiguration从群集中获取kubeadm 。

可选择备份kube-apiserver证书。

升级master组件的静态Pod清单。


https://blog.51cto.com/billy98/2389246


签名:这个人很懒,什么也没有留下!
最新回复 (0)
返回