kubeadm部署kubernetes高可用

一、

1.准备

准备6台机器,操作系统CentOS Linux release 7.9.2009 (Core)
硬件配置:16C 32G 硬盘1.6T
集群中所有机器之间网络互通,且可访问外网。
注意:选择对应的kubeadm kubectl kubelet 和对应的docker版本 
选择kubeadm-1.20.6 kubectl-1.20.6 kubelet-1.20.6 docker-19.03.14
节点名称 IP
master1 192.168.81.21
master2 192.168.81.22
master3 192.168.81.23
node1 192.168.81.24
node2 192.168.81.25
node3 192.168.81.26

2.1安装前预处理操作

(1)更改节点名称 
hostnamectl set-hostname 

(2)添加hosts解析
cat >>/etc/hosts <
192.168.81.21 master1
192.168.81.22 master2
192.168.81.23 master3
192.168.81.24 node1
192.168.81.25 node2
192.168.81.26 node3
EOF
注:所有节点都要添加host解析记录

(3)配置免密
在master1节点生成密钥对,并分发给其他的所有主机。
ssh-keygen
[root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub  root@master1
[root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub  root@master2
[root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub  root@master3
[root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub  root@node1
[root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub  root@node2
[root@master1 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub  root@node3

(4)升级内核
通过下载kernel image的rpm包进行安装。

centos7系统:http://elrepo.org/linux/kernel/el7/x86_64/RPMS/

编写shell脚本升级内核

#!/bin/bash
# ----------------------------
# upgrade kernel by [email protected]
# ----------------------------

yum localinstall -y kernel-lt*
if [ $? -eq 0 ];then
 grub2-set-default 0 && grub2-mkconfig -o /etc/grub2.cfg
 grubby --args="user_namespace.enable=1" --update-kernel="$(grubby --default-kernel)"
fi
echo "please reboot your system quick!!!"

注意:一定要重启机器
[root@master1 ~]# uname -r
4.4.229-1.el7.elrepo.x86_64

kubeadm部署kubernetes高可用_第1张图片

(5)关闭防火墙selinux
 systemctl disable --now firewalld
 setenforce 0
 sed -i 's/enforcing/disabled/' /etc/selinux/config 
 
(6)关闭swap分区
 swapoff -a
 sed -i.bak 's/^.*centos-swap/#&/g' /etc/fstab
 第一条是临时关闭,当然也可以使用第二条永久关闭,后者手动在/etc/fstab文件中将swap挂载所在的行注释掉即可。
 
(7)优化内核
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp.keepaliv.probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp.max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp.max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.top_timestamps = 0
net.core.somaxconn = 16384
EOF
注:使其立即生效 执行sysctl --system

(8)配置yum源
所有的节点均采用阿里云官网的base和epel源
 mv /etc/yum.repos.d/* /tmp
 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
 curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
 
(9)时区与时间同步
 ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 yum install dnf ntpdate -y
 ntpdate ntp.aliyun.com
 
 
可以编写shell将上面的第5-8步骤写成shell脚本自动化快速完成
#!/bin/sh
#关闭防火墙
systemctl disable --now firewalld
setenforce 0
sed -i 's/enforcing/disabled/' /etc/selinux/config
#关闭swap分区
swapoff -a
sed -i.bak 's/^.*centos-swap/#&/g' /etc/fstab
#优化系统
cat > /etc/sysctl.d/k8s.conf << EOF
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
fs.may_detach_mounts = 1
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp.keepaliv.probes = 3
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp.max_tw_buckets = 36000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp.max_orphans = 327680
net.ipv4.tcp_orphan_retries = 3
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.ip_conntrack_max = 65536
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.top_timestamps = 0
net.core.somaxconn = 16384
EOF
#立即生效
sysctl --system
#配置阿里云的base和epel源
mv /etc/yum.repos.d/* /tmp
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#安装dnf工具

yum install dnf -y
dnf makecache
#安装ntpdate工具
dnf install ntpdate -y
#同步阿里云时间
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
ntpdate ntp.aliyun.com

2.2安装docker

(1)添加docker软件yum

方法:浏览器打开mirrors.aliyun.com网站,找到docker-ce,即可看到镜像仓库源

kubeadm部署kubernetes高可用_第2张图片

curl -o /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

(2)安装docker-ce组件
dnf list docker-ce --showduplicates #列出所有可安装版本
这里我们安装的是docker19.03.14

docker --version
查看版本号,检测docker是否安装成功

上面的这种查看docker client的版本的。建议使用下面这种方法查看docker-ce版本号,这种方法把dockerclient端和server端的版本号查看的一清二楚。

[root@master1 ~]# docker --version
Docker version 19.03.14, build 5eb3275d40
[root@master1 ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.14
 API version:       1.40
 Go version:        go1.13.15
 Git commit:        5eb3275d40
 Built:             Tue Dec  1 19:20:42 2020
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.14
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       5eb3275d40
  Built:            Tue Dec  1 19:19:17 2020
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.4
  GitCommit:        212e8b6fa2f44b9c21b2798135fc6fb7c53efc16
 runc:
  Version:          1.1.1
  GitCommit:        v1.1.1-0-g52de29d
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

(4)更换docker的镜像仓库源

默认的镜像仓库地址是docker官方的,国内访问异常缓慢,因此更换为个人阿里云的源。

 cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": ["https://f1bhsuge.mirror.aliyuncs.com"]
}
EOF

由于重新加载docker仓库源,所以需要重启docker

systemctl restart docker

2.3、安装kubernetes

(1)添加kubernetes软件yum

方法:浏览器打开mirrors.aliyun.com网站,找到kubernetes,即可看到镜像仓库源

kubeadm部署kubernetes高可用_第3张图片

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

#重新生成缓存
dnf clean all
dnf makecache
(2)安装kubeadmkubeletkubectl组件

所有的节点都需要安装这几个组件。

#列出可安装版本
dnf list kubeadm --showduplicates

这里我们选择1.20.6

dnf install -y kubelet-1.20.6 kubeadm-1.20.6 kubectl-1.20.6
(3)设置开机自启动

我们先设置开机自启,但是kubelet服务暂时先不启动。

[root@master1 ~]# systemctl enable kubelet

2.4、Haproxy+Keepalived配置高可用VIP

高可用我们采用官方推荐的HAproxy+KeepalivedHAproxyKeepalived以守护进程的方式在所有Master节点部署。

(1)安装keepalivedhaproxy

注意:只需要在三个master节点安装即可

[root@master1 ~]# dnf install -y keepalived haproxy 
(2)配置Haproxy服务

所有master节点的haproxy配置相同,haproxy的配置文件是/etc/haproxy/haproxy.cfgmaster1节点配置完成之后再分发给master2、master3两个节点。

[root@master1 ~]# cat /etc/haproxy/haproxy.cfg
global
  maxconn  2000
  ulimit-n  16384
  log  127.0.0.1 local0 err
  stats timeout 30s

defaults
  log global
  mode  http
  option  httplog
  timeout connect 5000
  timeout client  50000
  timeout server  50000
  timeout http-request 15s
  timeout http-keep-alive 15s

frontend monitor-in
  bind *:33305
  mode http
  option httplog
  monitor-uri /monitor

listen stats
  bind    *:8006
  mode    http
  stats   enable
  stats   hide-version
  stats   uri       /stats
  stats   refresh   30s
  stats   realm     Haproxy\ Statistics
  stats   auth      admin:admin

frontend k8s-master
  bind 0.0.0.0:8443
  bind 127.0.0.1:8443
  mode tcp
  option tcplog
  tcp-request inspect-delay 5s
  default_backend k8s-master

backend k8s-master
  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 master1 192.168.81.21:6443  check inter 2000 fall 2 rise 2 weight 100
  server master2 192.168.81.22:6443  check inter 2000 fall 2 rise 2 weight 100
  server master3 192.168.81.23:6443  check inter 2000 fall 2 rise 2 weight 100

(3)配置Keepalived服务

keepalived中使用track_script机制来配置脚本进行探测kubernetesmaster节点是否宕机,并以此切换节点实现高可用。

master1节点的keepalived配置文件如下所示,配置文件所在的位置/etc/keepalived/keepalived.cfg

[root@master1 ~]# cat /etc/keepalived/keepalived.conf 
! Configuration File for keepalived
global_defs {
    router_id LVS_DEVEL
}
vrrp_script chk_kubernetes {
    script "/etc/keepalived/check_kubernetes.sh"
    interval 2
    weight -5
    fall 3  
    rise 2
}
vrrp_instance VI_1 {
    state MASTER
    interface ens192
    mcast_src_ip 192.168.81.21
    virtual_router_id 51
    priority 100
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        192.168.81.100
    }
#    track_script {
#       chk_kubernetes
#    }
}
注:需要注意几点(前两点记得修改):
mcast_src_ip:配置多播源地址,此地址是当前主机的ip地址。
priority:keepalived根据此项参数的大小仲裁master节点。我们这里让master节点为kubernetes提供服务,其他两个节点暂时为备用节点。因此master1节点设置为100,master2节点设置为99,master3节点设置为98。
state:我们将master1节点的state字段设置为MASTER,其他两个节点字段修改为BACKUP。
上面的集群检查功能是关闭的,等到集群建立完成后再开启。
(4)配置健康检测脚本

我这里将健康检测脚本放置在/etc/keepalived目录下,check_kubernetes.sh检测脚本如下:

[root@master1 keepalived]# cat check_kubernetes.sh 
#!/bin/bash
function chech_kubernetes() {
 for ((i=0;i<5;i++));do
  apiserver_pid_id=$(pgrep kube-apiserver)
  if [[ ! -z $apiserver_pid_id ]];then
   return
  else
   sleep 2
  fi
  apiserver_pid_id=0
 done
}

# 1:running  0:stopped
check_kubernetes
if [[ $apiserver_pid_id -eq 0 ]];then
 /usr/bin/systemctl stop keepalived
 exit 1
else
 exit 0
fi

注:根据上面的注意事项配置master2、master3节点的keepalived服务。
(5)启动KeeplivedHaproxy服务
[root@master1 ~]# systemctl enable --now keepalived haproxy

检查一下服务状态

systemctl status keepalived haproxy
ping vip  #检测一下是否通

2.5、部署Master节点

(1)生成预处理文件

master节点执行如下指令:

[root@master1 ~]# kubeadm config print init-defaults > kubeadm-init.yaml

这个文件kubeadm-init.yaml,是我们初始化使用的文件,里面大概修改这几项参数。

[root@master1 ~]# cat kubeadm-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
cgroupDriver: systemd
localAPIEndpoint:
  advertiseAddress: "192.168.81.100"    #VIP的地址   
  bindPort:  6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: master1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:           #添加如下两行信息
  certSANs:
  - "192.168.81.100"         #VIP地址
  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.cn-hangzhou.aliyuncs.com/google_containers  #阿里云的镜像站点
controlPlaneEndpoint: "192.168.81.100:8443"   #VIP的地址和端口
kind: ClusterConfiguration
kubernetesVersion: 1.20.6       #kubernetes版本号
networking:
  dnsDomain: cluster.local 
  serviceSubnet: 10.96.0.0/12       #选择默认即可,当然也可以自定义CIDR
  podSubnet: 172.0.0.0/16       #添加pod网段
scheduler: {}

**注意:**上面的advertiseAddress字段的值,这个值并非当前主机的网卡地址,而是高可用集群的VIP的地址。

**注意:**上面的controlPlaneEndpoint这里填写的是VIP的地址,而端口则是haproxy服务的8443端口,也就是我们在haproxy里面配置的这段信息。

frontend k8s-master
  bind 0.0.0.0:8443
  bind 127.0.0.1:8443
  mode tcp

这一段里面的8443端,如果你自定义了其他端口,这里请记得修改controlPlaneEndpoint里面的端口。

(2)提前拉取镜像

如果直接采用kubeadm init来初始化,中间会有系统自动拉取镜像的这一步骤,这是比较慢的,我建议分开来做,所以这里就先提前拉取镜像。

[root@master1 ~]# kubeadm config images pull --config kubeadm-init.yaml

如果大家看到开头的两行warning信息(我这里没有打印),不必担心,这只是警告,不影响我们完成实验。

其他master节点提前拉取镜像

其他两个master节点在初始化之前也尽量先把镜像拉取下来,这样子减少初始化时间

[root@master1 ~]# scp kubeadm-init.yaml root@master2:~
[root@master1 ~]# scp kubeadm-init.yaml root@master3:~

master2节点

# 注意在master2节点执行如下命令
[root@master2 ~]# kubeadm config images pull --config kubeadm-init.yaml

master3节点

# 注意在master3节点执行如下命令
[root@master3 ~]# kubeadm config images pull --config kubeadm-init.yaml
(3)初始化kubenetesmaster1节点
[root@master1 ~]# kubeadm init --config kubeadm-init.yaml --upload-certs

这里我们会生成

kubeadm join 192.168.81.100:8443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:3a55533e8c84cbe0699c216cf3abd3761dfb44c5ebaece5f05da9f9d6f9604e0 \
    --control-plane --certificate-key 618ddae0fd9e026bdcb50c7be068665402f8277d12bbbbd5850ef7d4bd5b025b

Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.81.100:8443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:3a55533e8c84cbe0699c216cf3abd3761dfb44c5ebaece5f05da9f9d6f9604e0

这个过程大概30s的时间就做完了,之所以初始化的这么快就是因为我们提前拉取了镜像。像我上面这样的没有报错信息,并且显示上面的最后10行类似的信息这些,说明我们的master1节点是初始化成功的。

在使用集群之前还需要做些收尾工作,在master1节点执行:

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

再配置一下环境变量

[root@master1 ~]# cat >> ~/.bashrc <
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
[root@master1 ~]# source ~/.bashrc

好了,此时的master1节点就算是初始化完毕了。

有个重要的点就是最后几行信息中,其中有两条kubeadm join 192.168.81.100:8443 开头的信息。这分别是其他master节点和node节点加入kubernetes集群的认证命令。这个密钥是系统根据 sha256算法计算出来的,必须持有这样的密钥才可以加入当前的kubernetes集群。

使用区别

这两条加入集群的命令是有一些区别的:

比如这个第一条,我们看到最后有一行内容--control-plane --certificate-key xxxx,这是控制节点加入集群的命令,控制节点是kubernetes官方的说法,其实在我们这里指的就是其他的master节点。

查看节点

如果此时查看当前集群的节点,会发现只有master1节点自己。

[root@master1 ~]# kubectl get node
NAME      STATUS     ROLES    AGE     VERSION
master1   NotReady   master   9m58s   v1.20.6

2.6、其他master节点加入kubernetes集群中

(1)master2节点加入集群

既然是其他的master节点加入集群,那肯定是使用如下命令:

[root@master2 ~]# kubeadm join 192.168.81.100:8443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:3a55533e8c84cbe0699c216cf3abd3761dfb44c5ebaece5f05da9f9d6f9604e0 \
    --control-plane --certificate-key 618ddae0fd9e026bdcb50c7be068665402f8277d12bbbbd5850ef7d4bd5b025b

再执行一些收尾工作

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

加环境变量

[root@master2 ~]# cat >> ~/.bashrc <
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
[root@master2 ~]# source ~/.bashrc
(2)master3节点加入集群
[root@master3 ~]# kubeadm join 192.168.81.100:8443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:3a55533e8c84cbe0699c216cf3abd3761dfb44c5ebaece5f05da9f9d6f9604e0 \
    --control-plane --certificate-key 618ddae0fd9e026bdcb50c7be068665402f8277d12bbbbd5850ef7d4bd5b025b

再执行一些收尾工作

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

加环境变量

[root@master3 ~]# cat >> ~/.bashrc <
export KUBECONFIG=/etc/kubernetes/admin.conf
EOF
[root@master3 ~]# source ~/.bashrc

到此,所有的master节点都已经加入集群

查看集群master节点
[root@master1 ~]# kubectl get node
NAME      STATUS     ROLES    AGE     VERSION
master1   NotReady   master   25m     v1.20.6
master2   NotReady   master   12m     v1.20.6
master3   NotReady   master   3m30s   v1.20.6

你可以在任意一个master节点上执行kubectl get node查看集群节点的命令。

2.7、node节点加入kubernetes集群中

正如我们上面所说的,master1节点初始化完成后,第二条kubeadm join xxx(或者说是最后一行内容)内容便是node节点加入集群的命令。

kubeadm join 192.168.81.100:8443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:3a55533e8c84cbe0699c216cf3abd3761dfb44c5ebaece5f05da9f9d6f9604e0

注意:node节点加入集群只需要执行上面的一条命令即可,只要没有报错就表示成功。不必像master一样做最后的加入环境变量等收尾工作。

(1)node1节点加入集群
[root@node1 ~]# kubeadm join 192.168.81.100:8443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:3a55533e8c84cbe0699c216cf3abd3761dfb44c5ebaece5f05da9f9d6f9604e0
[preflight] Running pre-flight checks
 [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
[preflight] Reading configuration from the cluster...
....
....
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

当看到倒数第四行内容This node has joined the cluster,这一行信息表示node1节点加入集群成功。

三个node节点分别执行

(3)查看集群节点信息
[root@master1 ~]# kubectl get node
NAME      STATUS         ROLES               AGE   VERSION
master1   NotReady    control-plane,master   20d   v1.20.6
master2   NotReady    control-plane,master   20d   v1.20.6
master3   NotReady    control-plane,master   20d   v1.20.6
node1     NotReady                     20d   v1.20.6
node2     NotReady                     20d   v1.20.6
node3     NotReady                     20d   v1.20.6

可以看到集群的五个节点都已经存在,但是现在还不能用,也就是说现在集群节点是不可用的,原因在于上面的第2个字段,我们看到五个节点都是``NotReady`状态,这是因为我们还没有安装网络插件。

网络插件有calicoflannel等插件,这里我们选择使用flannel插件。

2.8、安装网络插件

默认大家从网上看的教程都会使用这个命令来初始化。

[root@master1 ~]# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

事实上很多用户都不能成功,因为国内网络受限,所以可以这样子来做。

(2)更换flannel镜像源

master1节点上修改本地的hosts文件添加如下内容以便解析

199.232.28.133  raw.githubusercontent.com

然后下载flannel文件

[root@master1 ~]# curl -o kube-flannel.yml   https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

编辑镜像源,默认的镜像地址我们修改一下。把yaml文件中所有的quay.io修改为 quay-mirror.qiniu.com

[root@master1 ~]# sed -i 's/quay.io/quay-mirror.qiniu.com/g' kube-flannel.yml

此时保存保存退出。在master节点执行此命令。

[root@master1 ~]# kubectl apply -f kube-flannel.yml 
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds-amd64 created
daemonset.apps/kube-flannel-ds-arm64 created
daemonset.apps/kube-flannel-ds-arm created
daemonset.apps/kube-flannel-ds-ppc64le created
daemonset.apps/kube-flannel-ds-s390x created

这样子就可以成功拉取flannel镜像了。当然你也可以使用我提供给大家的kube-flannel.yml文件

查看flannel是否正常

如果你想查看flannel这些pod运行是否正常,使用如下命令

[root@master1 ~]# kubectl get pods -n kube-system | grep flannel
NAME                              READY   STATUS    RESTARTS   AGE
kube-flannel-ds-amd64-dp972       1/1     Running   0          66s
kube-flannel-ds-amd64-lkspx       1/1     Running   0          66s
kube-flannel-ds-amd64-rmsdk       1/1     Running   0          66s
kube-flannel-ds-amd64-wp668       1/1     Running   0          66s
kube-flannel-ds-amd64-zkrwh       1/1     Running   0          66s

如果第三字段STATUS不是处于Running状态的话,说明flannel是异常的,需要排查问题所在。

查看节点是否为Ready

稍等片刻,执行如下指令查看节点是否可用

[root@master1 ~]# kubectl get nodes
NAME      STATUS   ROLES    AGE   VERSION
master1   Ready    master   21h   v1.18.4
master2   Ready    master   21h   v1.18.4
master3   Ready    master   21h   v1.18.4
node1     Ready       62m   v1.18.4
node2     Ready       62m   v1.18.4

目前节点状态是Ready,表示集群节点现在是可用的

2.9、安装dashboard

(1)创建dashboard
未经改动的 kubernetes-dashboard.yaml 部分细节
  • kubernetes-dashboard Deployment 处的 tolerations 配置

img

dashboard-tolerations.png

​ 如果不接受将 dashboard 部署在 master 节点,就可以将下面的配置注释掉。但事实上不注释上面的内容,Kubernetes 也不会将 dashboard 部署在 master 节点上。

​ 由于 pod 不会分配到到 master 节点, 并且 kubeadm部署的 apiserver 中启用的验证方式为 Node 和 RBAC, 且关闭了 insecure-port, 猜测可能是这个原因导致连接不上 apiServer , 即使是手动修改也不行 --apiserver-host 参数也不行。

个人的一个解决方案
  • 将 kubernetes-dashboard 部署在 master 节点上,修改的配置文件内容如下:

kubeadm部署kubernetes高可用_第4张图片

dashboard-metrics.png

kubeadm部署kubernetes高可用_第5张图片

dashboard.png

​ 上述配置将指定 kubernetes-dashboard 和 kubernetes-metrics-scraper 分配部署的节点,此处选择部署在 master 节点解决文中出现的通信问题。

  • 其他配置
    kubeadm部署kubernetes高可用_第6张图片

dashboard-nodeport.png

​ 指定 Service 通过 Cluster 节点的静态端口对外提供服务。Cluster 外部可以通过 : 访问 Service。

获取token值

[root@master1 ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

把上面的token值输入进去即可进去dashboard界面。

kubeadm部署kubernetes高可用_第7张图片

不过现在我们虽然可以登陆上去,但是我们权限不够还查看不了集群信息,因为我们还没有绑定集群角色,可以先按照上面的尝试一下,再来做下面的步骤

(2)cluster-admin管理员角色绑定
[root@master1 ~]# kubectl create serviceaccount dashboard-admin -n kube-system
[root@master1 ~]# kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
[root@master1 ~]# kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

你可能感兴趣的:(kubernetes,docker,运维)