附012.Kubeadm部署高可用Kubernetes
目录
一 kubeadm介绍
1.1 概述
1.2 kubeadm功能
二 部署规划
2.1 节点规划
2.2 初始准备
2.3 互信配置
三 集群部署
3.1 Docker安装
3.2 相关组件包
3.3 正式安装
三 部署高可用组件I
3.1 Keepalived安装
3.2 创建配置文件
3.3 启动Keepalived
3.4 启动Nginx
四 初始化集群-Mater
4.1 Master上初始化
4.2 添加其他master节点
五 安装NIC插件
5.1 NIC插件介绍
5.2 部署calico
六 部署高可用组件II
6.1 高可用说明
七 添加Worker节点
7.1 下载镜像
7.2 添加Node节点
7.3 确认验证
八 开启IPVS
8.1 修改ConfigMap
九 测试集群
9.1 创建测试service
9.2 测试访问
十 部署dashboard
10.1 设置标签
10.2 创建证书
10.3 分发证书
10.4 手动创建secret
10.5 部署dashboard
10.6 查看dashboard参数
十一 访问dashboard
11.1 导入证书
11.2 创建kubeconfig文件
11.3 测试访问dashboard
十二 部署heapster
12.2 部署heapster
12.3 确认验证
回到顶部
一 kubeadm介绍
1.1 概述
参考《附003.Kubeadm部署Kubernetes》。
1.2 kubeadm功能
参考《附003.Kubeadm部署Kubernetes》。
回到顶部
二 部署规划
2.1 节点规划
节点主机名
IP
类型
运行服务
k8smaster01
172.24.8.71
Kubernetes master节点
docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、heapster、calico
k8smaster02
172.24.8.72
Kubernetes master节点
docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、
kubelet、heapster、calico
k8smaster03
172.24.8.73
Kubernetes master节点
docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、
kubelet、heapster、calico
k8snode01
172.24.8.74
Kubernetes node节点1
docker、kubelet、proxy、calico
k8snode02
172.24.8.75
Kubernetes node节点2
docker、kubelet、proxy、calico
k8snode03
172.24.8.76
Kubernetes node节点3
docker、kubelet、proxy、calico
Kubernetes的高可用主要指的是控制平面的高可用,即指多套Master节点组件和Etcd组件,工作节点通过负载均衡连接到各Master。HA有通常有如下两种架构:
高可用架构一:etcd与Master节点组件混布在一起。
clipboard
高可用架构二:使用独立的Etcd集群,不与Master节点混布。
clipboard
释义:
两种方式的相同之处在于都提供了控制平面的冗余,实现了集群高可以用,区别在于:
Etcd混布方式
所需机器资源少
部署简单,利于管理
容易进行横向扩展
风险大,一台宿主机挂了,master和etcd就都少了一套,集群冗余度受到的影响比较大。
Etcd独立部署方式:
所需机器资源多(按照Etcd集群的奇数原则,这种拓扑的集群关控制平面最少需要6台宿主机了)
部署相对复杂,要独立管理etcd集群和和master集群
解耦了控制平面和Etcd,集群风险小健壮性强,单独挂了一台master或etcd对集群的影响很小
提示:本实验使用高可用架构一实现Kubernetes的高可用。
2.2 初始准备
复制代码
1 [root@k8smaster01 ~]# vi k8sinit.sh
2 # Modify Author: xhy
3 # Modify Date: 2019-06-23 22:19
4 # Version:
5 #***************************************************************#
6 # Initialize the machine. This needs to be executed on every machine.
7
8 # Add host domain name.
9 cat >> /etc/hosts << EOF
10 172.24.8.71 k8smaster01
11 172.24.8.72 k8smaster02
12 172.24.8.73 k8smaster03
13 172.24.8.74 k8snode01
14 172.24.8.75 k8snode02
15 172.24.8.76 k8snode03
16 EOF
17
18 # Add docker user
19 useradd -m docker
20
21 # Disable the SELinux.
22 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
23
24 # Turn off and disable the firewalld.
25 systemctl stop firewalld
26 systemctl disable firewalld
27
28 # Modify related kernel parameters & Disable the swap.
29 cat > /etc/sysctl.d/k8s.conf << EOF
30 net.ipv4.ip_forward = 1
31 net.bridge.bridge-nf-call-ip6tables = 1
32 net.bridge.bridge-nf-call-iptables = 1
33 net.ipv4.tcp_tw_recycle = 0
34 vm.swappiness = 0
35 vm.overcommit_memory = 1
36 vm.panic_on_oom = 0
37 net.ipv6.conf.all.disable_ipv6 = 1
38 EOF
39 sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null
40 swapoff -a
41 sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
42 modprobe br_netfilter
43
44 # Add ipvs modules
45 cat > /etc/sysconfig/modules/ipvs.modules < /etc/docker/daemon.json < /etc/yum.repos.d/kubernetes.repo
2 [kubernetes]
3 name=Kubernetes
4 baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
5 enabled=1
6 gpgcheck=1
7 repo_gpgcheck=1
8 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
9 EOF
10 #配置yum源
复制代码
复制代码
1 [root@k8smaster01 ~]# yum search kubelet --showduplicates #查看相应版本
2 [root@k8smaster01 ~]# yum install -y kubeadm-1.15.6-0.x86_64 kubelet-1.15.6-0.x86_64 kubectl-1.15.6-0.x86_64 --disableexcludes=kubernetes
复制代码
clipboard
说明:同时安装了cri-tools, kubernetes-cni, socat三个依赖:
socat:kubelet的依赖;
cri-tools:即CRI(Container Runtime Interface)容器运行时接口的命令行工具。
复制代码
1 [root@k8smaster01 ~]# systemctl enable kubelet
复制代码
提示:所有Master+Worker节点均需要如上操作。此时不需要启动kubelet,初始化的过程中会自动启动的,如果此时启动了会出现报错,忽略即可。
回到顶部
三 部署高可用组件I
3.1 Keepalived安装
复制代码
1 [root@k8smaster01 ~]# wget https://www.keepalived.org/software/keepalived-2.0.19.tar.gz
2 [root@k8smaster01 ~]# tar -zxvf keepalived-2.0.19.tar.gz
3 [root@k8smaster01 ~]# cd keepalived-2.0.19/
4 [root@k8smaster01 ~]# ./configure --sysconf=/etc --prefix=/usr/local/keepalived
5 [root@k8smaster01 keepalived-2.0.19]# make && make install
6 [root@k8smaster01 ~]# systemctl enable keepalived && systemctl start keepalived
复制代码
提示:所有Master节点均需要如上操作。
3.2 创建配置文件
复制代码
1 [root@k8smaster01 ~]# git clone https://github.com/cookeem/kubeadm-ha #拉取github的高可用自动配置脚本
2 [root@k8smaster01 ~]# vi /root/kubeadm-ha/kubeadm-config.yaml
3 apiVersion: kubeadm.k8s.io/v1beta1
4 kind: ClusterConfiguration
5 kubernetesVersion: v1.15.6 #配置安装的版本
6 ……
7 podSubnet: "10.10.0.0/16" #指定pod网段及掩码
8 ……
复制代码
clipboard
提示:若需要修改为国内Kubernetes初始化镜像源,可通过在kubeadm-config.yaml中追加如下参数,若参考4.1步骤提前下载:
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_container
复制代码
1 [root@k8smaster01 ~]# cd kubeadm-ha/
2 [root@k8smaster01 kubeadm-ha]# vi create-config.sh
3 # master keepalived virtual ip address
4 export K8SHA_VIP=172.24.8.100
5 # master01 ip address
6 export K8SHA_IP1=172.24.8.71
7 # master02 ip address
8 export K8SHA_IP2=172.24.8.72
9 # master03 ip address
10 export K8SHA_IP3=172.24.8.73
11 # master keepalived virtual ip hostname
12 export K8SHA_VHOST=k8smaster01
13 # master01 hostname
14 export K8SHA_HOST1=k8smaster01
15 # master02 hostname
16 export K8SHA_HOST2=k8smaster02
17 # master03 hostname
18 export K8SHA_HOST3=k8smaster03
19 # master01 network interface name
20 export K8SHA_NETINF1=eth0
21 # master02 network interface name
22 export K8SHA_NETINF2=eth0
23 # master03 network interface name
24 export K8SHA_NETINF3=eth0
25 # keepalived auth_pass config
26 export K8SHA_KEEPALIVED_AUTH=412f7dc3bfed32194d1600c483e10ad1d
27 # calico reachable ip address
28 export K8SHA_CALICO_REACHABLE_IP=172.24.8.2
29 # kubernetes CIDR pod subnet
30 export K8SHA_CIDR=10.10.0.0
31
32 [root@k8smaster01 kubeadm-ha]# ./create-config.sh
复制代码
解释:所有Master节点均需要如上操作。执行脚本后会生产如下配置文件清单:
执行create-config.sh脚本后,会自动生成以下配置文件:
kubeadm-config.yaml:kubeadm初始化配置文件,位于kubeadm-ha代码的./根目录
keepalived:keepalived配置文件,位于各个master节点的/etc/keepalived目录
nginx-lb:nginx-lb负载均衡配置文件,位于各个master节点的/root/nginx-lb目录
calico.yaml:calico网络组件部署文件,位于kubeadm-ha代码的./calico目录
3.3 启动Keepalived
复制代码
1 [root@k8smaster01 ~]# cat /etc/keepalived/keepalived.conf
2 [root@k8smaster01 ~]# cat /etc/keepalived/check_apiserver.sh
复制代码
clipboard
复制代码
1 [root@k8smaster01 ~]# systemctl restart keepalived.service
2 [root@k8smaster01 ~]# systemctl status keepalived.service
3 [root@k8smaster01 ~]# ping 172.24.8.100
4
复制代码
提示:所有Master节点均需要如上操作。
3.4 启动Nginx
执行create-config.sh脚本后,nginx-lb的配置文件会自动复制到各个master的节点的/root/nginx-lb目录
复制代码
1 [root@k8smaster01 ~]# cd /root/nginx-lb/
复制代码
clipboard
复制代码
1 [root@k8smaster01 nginx-lb]# docker-compose up -d #使用docker-compose方式启动nginx-lb
2 [root@k8smaster01 ~]# docker-compose ps #检查nginx-lb启动状态
复制代码
提示:所有Master节点均需要如上操作。
回到顶部
四 初始化集群-Mater
4.1 Master上初始化
复制代码
1 [root@k8smaster01 ~]# kubeadm --kubernetes-version=v1.15.6 config images list #列出所需镜像
2 k8s.gcr.io/kube-apiserver:v1.15.6
3 k8s.gcr.io/kube-controller-manager:v1.15.6
4 k8s.gcr.io/kube-scheduler:v1.15.6
5 k8s.gcr.io/kube-proxy:v1.15.6
6 k8s.gcr.io/pause:3.1
7 k8s.gcr.io/etcd:3.3.10
8 k8s.gcr.io/coredns:1.3.1
复制代码
复制代码
1 [root@k8smaster01 ~]# kubeadm --kubernetes-version=v1.15.6 config images pull #拉取kubernetes所需镜像
复制代码
注意:
由于国内Kubernetes镜像可能无法pull,建议通过VPN等方式提前pull镜像,然后上传至所有master节点。
复制代码
1 [root@VPN ~]# docker pull k8s.gcr.io/kube-apiserver:v1.15.6
2 [root@VPN ~]# docker pull k8s.gcr.io/kube-controller-manager:v1.15.6
3 [root@VPN ~]# docker pull k8s.gcr.io/kube-scheduler:v1.15.6
4 [root@VPN ~]# docker pull k8s.gcr.io/kube-proxy:v1.15.6
5 [root@VPN ~]# docker pull k8s.gcr.io/pause:3.1
6 [root@VPN ~]# docker pull k8s.gcr.io/etcd:3.3.10
7 [root@VPN ~]# docker pull k8s.gcr.io/coredns:1.3.1
8 [root@k8smaster01 ~]# docker load -i kube-apiserver.tar
9 [root@k8smaster01 ~]# docker load -i kube-controller-manager.tar
10 [root@k8smaster01 ~]# docker load -i kube-scheduler.tar
11 [root@k8smaster01 ~]# docker load -i kube-proxy.tar
12 [root@k8smaster01 ~]# docker load -i pause.tar
13 [root@k8smaster01 ~]# docker load -i etcd.tar
14 [root@k8smaster01 ~]# docker load -i coredns.tar
复制代码
复制代码
1 [root@k8smaster01 ~]# kubeadm init --config=/root/kubeadm-ha/kubeadm-config.yaml --upload-certs
复制代码
clipboard
保留如下命令用于后续节点添加:
复制代码
1 You can now join any number of the control-plane node running the following command on each as root:
2
3 kubeadm join 172.24.8.100:16443 --token qcxeyv.q37rluk3qql8p9bf \
4 --discovery-token-ca-cert-hash sha256:d8cf7c0384fff8779227f1a913d981d02b9f8f79a70365ba76a909e7160899a9 \
5 --control-plane --certificate-key d8393e3d6c936c2e489e4aff53458c6c5b06ef2a8715f49529494cbd469c1471
6
7 Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
8 As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
9 "kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
10
11 Then you can join any number of worker nodes by running the following on each as root:
12
13 kubeadm join 172.24.8.100:16443 --token qcxeyv.q37rluk3qql8p9bf \
14 --discovery-token-ca-cert-hash sha256:d8cf7c0384fff8779227f1a913d981d02b9f8f79a70365ba76a909e7160899a9
复制代码
注意:如上token具有默认24小时的有效期,token和hash值可通过如下方式获取:
kubeadm token list
如果 Token 过期以后,可以输入以下命令,生成新的 Token
复制代码
1 kubeadm token create
2 openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
3
复制代码
复制代码
1 [root@k8smaster01 ~]# mkdir -p $HOME/.kube
2 [root@k8smaster01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube