首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
kubernetes与velero的第一次尝试
2
在Kubernetes中如何针对Namespace进行资源限制?
3
kubernetes之metrics-server安装与配置
4
kubernetes部署metrics-server
5
Kubernetes1.20.9摘掉一个master节点再重新加入(ETCD需要注意的)
6
Kubernetes 1.17.17升级到1.18.20
7
Kubernetes 1.18.20升级到1.19.12
8
Kubernetes 1.19.12升级到1.20.9(强调一下selfLink)
9
Kubernetes 1.16.15升级到1.17.17
10
使用 kainstall 工具一键部署 kubernetes 高可用集群
11
附034.Kubernetes_v1.21.0高可用部署架构二
12
附016.Kubernetes_v1.17.4高可用部署
13
附022.Kubernetes_v1.18.3高可用部署架构一
14
附024.Kubernetes_v1.18.3高可用部署架构二
15
使用 StatefulSet 部署 etcd 集群
16
Kubernetes 稳定性保障手册 -- 极简版
17
Linux(centos7)离现安装kubernetes1.19.2和docker——组件部分
18
docker register 私有仓库部署 - http模式
19
KubeSphere 开源 KubeEye:Kubernetes 集群自动巡检工具
20
K8S 中的 CPUThrottlingHigh 到底是个什么鬼?
21
全链路分布式跟踪系统 Apache SkyWalking 入门教程
22
pod Evicted的状态究竟是何人所为
23
使用 ezctl 工具部署和管理 Kubernetes 集群
24
Kubernetes部署策略详解
25
kubernetes容器探针检测
26
使用Spring Boot实现动态健康检查HealthChecks
27
真一文搞定 ingress-nginx 的使用
28
K8S备份、恢复、迁移神器 Velero
29
一次关于k8s kubectl top 和 contained ps 不一致的问题探究
30
kubernetes备份恢复之velero
31
使用 Velero 进行集群备份与迁移
32
TKE集群中nginx-ingress使用实践
33
使用velero进行kubernetes灾备
34
Kubernetes 映射外部服务
35
运维体系建设套路
36
k8s解决pod调度不均衡的问题
37
ingress中虚拟路径解决方案
38
容器下的两地三中心建设
39
k8s集群外的主机访问pod的解决方案
40
k8s基础-健康检查机制
41
k8s基础-标签使用
42
ingress-nginx请求改写
43
nginx ingress server alias 多域名多证书问题
44
JAVA | Java 解决跨域问题 花式解决跨域问题
45
如何通过ingress-nginx实现应用灰度发布?
46
在Kubernetes(k8s)中使用GPU
47
使用 Prometheus-Operator 监控 Calico
48
使用Kubespray部署Kubernetes集群
49
云原生下的CI/CD:Argo CD 详解,手把手教你入门
50
Pod的健康检查机制
清单首页k8s文章详情

附016.Kubernetes_v1.17.4高可用部署

一 kubeadm介绍

1.1 概述

参考《附003.Kubeadm部署Kubernetes》。

1.2 kubeadm功能

参考《附003.Kubeadm部署Kubernetes》。

二 部署规划

2.1 节点规划

节点主机名

IP

类型

运行服务

master01

172.24.8.71

Kubernetes master节点

docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、metrics、calico

master02

172.24.8.72

Kubernetes master节点

docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、metrics、calico

master03

172.24.8.73

Kubernetes master节点

docker、etcd、kube-apiserver、kube-scheduler、kube-controller-manager、kubectl、kubelet、metrics、calico

worker01

172.24.8.74

Kubernetes node节点1

docker、kubelet、proxy、calico

worker02

172.24.8.75

Kubernetes node节点2

docker、kubelet、proxy、calico

worker03

172.24.8.76

Kubernetes node节点3

docker、kubelet、proxy、calico

Kubernetes的高可用主要指的是控制平面的高可用,即指多套Master节点组件和Etcd组件,工作节点通过负载均衡连接到各Master。HA有通常有如下两种架构:

高可用架构一:etcd与Master节点组件混布在一起。

高可用架构二:使用独立的Etcd集群,不与Master节点混布。

释义:

两种方式的相同之处在于都提供了控制平面的冗余,实现了集群高可以用,区别在于:

  • Etcd混布方式
  1. 所需机器资源少
  2. 部署简单,利于管理
  3. 容易进行横向扩展
  4. 风险大,一台宿主机挂了,master和etcd就都少了一套,集群冗余度受到的影响比较大。
  • Etcd独立部署方式:
  1. 所需机器资源多(按照Etcd集群的奇数原则,这种拓扑的集群关控制平面最少需要6台宿主机了)
  2. 部署相对复杂,要独立管理etcd集群和和master集群
  3. 解耦了控制平面和Etcd,集群风险小健壮性强,单独挂了一台master或etcd对集群的影响很小

提示:本实验使用高可用架构一实现Kubernetes的高可用。

2.2 初始准备

[root@master01 ~]# vi k8sinit.sh

代码语言:javascript
复制
  1 #!/bin/sh
  2 #****************************************************************#
  3 # ScriptName: k8sinit.sh
  4 # Author: xhy
  5 # Create Date: 2019-06-23 22:19
  6 # Modify Author: xhy
  7 # Modify Date: 2020-03-16 20:44
  8 # Version: 
  9 #***************************************************************#
 10 # Initialize the machine. This needs to be executed on every machine.
 11 
 12 # Add host domain name.
 13 cat >> /etc/hosts << EOF
 14 172.24.8.71 master01
 15 172.24.8.72 master02
 16 172.24.8.73 master03
 17 172.24.8.74 worker01
 18 172.24.8.75 worker02
 19 172.24.8.76 worker03
 20 EOF
 21 
 22 # Add docker user
 23 useradd -m docker
 24 
 25 # Disable the SELinux.
 26 sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
 27 
 28 # Turn off and disable the firewalld.
 29 systemctl stop firewalld
 30 systemctl disable firewalld
 31 
 32 # Modify related kernel parameters & Disable the swap.
 33 cat > /etc/sysctl.d/k8s.conf << EOF
 34 net.ipv4.ip_forward = 1
 35 net.bridge.bridge-nf-call-ip6tables = 1
 36 net.bridge.bridge-nf-call-iptables = 1
 37 net.ipv4.tcp_tw_recycle = 0
 38 vm.swappiness = 0
 39 vm.overcommit_memory = 1
 40 vm.panic_on_oom = 0
 41 net.ipv6.conf.all.disable_ipv6 = 1
 42 EOF
 43 sysctl -p /etc/sysctl.d/k8s.conf >&/dev/null
 44 swapoff -a
 45 sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
 46 modprobe br_netfilter
 47 
 48 # Add ipvs modules
 49 cat > /etc/sysconfig/modules/ipvs.modules <<EOF
 50 #!/bin/bash
 51 modprobe -- ip_vs
 52 modprobe -- ip_vs_rr
 53 modprobe -- ip_vs_wrr
 54 modprobe -- ip_vs_sh
 55 modprobe -- nf_conntrack_ipv4
 56 EOF
 57 chmod 755 /etc/sysconfig/modules/ipvs.modules
 58 bash /etc/sysconfig/modules/ipvs.modules
 59 
 60 # Install rpm
 61 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget
 62 
 63 # Install Docker Compose
 64 sudo curl -L "http://down.linuxsb.com:8888/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
 65 sudo chmod +x /usr/local/bin/docker-compose
 66 
 67 # Update kernel
 68 rpm --import http://down.linuxsb.com:8888/RPM-GPG-KEY-elrepo.org
 69 rpm -Uvh http://down.linuxsb.com:8888/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
 70 yum --disablerepo="*" --enablerepo="elrepo-kernel" install -y kernel-ml
 71 sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT=0/' /etc/default/grub
 72 grub2-mkconfig -o /boot/grub2/grub.cfg
 73 yum update -y
 74 
 75 # Reboot the machine.
 76 # reboot
 77 

提示:对于某些特性,可能需要升级内核,内核升级操作见《018.Linux升级内核》。

2.3 互信配置

为了更方便远程分发文件和执行命令,本实验配置master节点到其它节点的 ssh 信任关系。

代码语言:javascript
复制
  1 [root@master01 ~]# ssh-keygen -f ~/.ssh/id_rsa -N ''
  2 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master01
  3 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master02
  4 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@master03
  5 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker01
  6 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker02
  7 [root@master01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@worker03
  8 

提示:此操作仅需要在master01节点操作。

2.4 其他准备

[root@master01 ~]# vi environment.sh

代码语言:javascript
复制
  1 #!/bin/sh
  2 #****************************************************************#
  3 # ScriptName: environment.sh
  4 # Author: xhy
  5 # Create Date: 2020-03-16 23:11
  6 # Modify Author: xhy
  7 # Modify Date: 2020-03-16 23:11
  8 # Version: 
  9 #***************************************************************#
 10 # 集群 MASTER 机器 IP 数组
 11 export MASTER_IPS=(172.24.8.71 172.24.8.72 172.24.8.73)
 12 
 13 # 集群 MASTER IP 对应的主机名数组
 14 export MASTER_NAMES=(master01 master02 master03)
 15 
 16 # 集群 NODE 机器 IP 数组
 17 export NODE_IPS=(172.24.8.74 172.24.8.75 172.24.8.76)
 18 
 19 # 集群 NODE IP 对应的主机名数组
 20 export NODE_NAMES=(worker01 worker02 worker03)
 21 
 22 # 集群所有机器 IP 数组
 23 export ALL_IPS=(172.24.8.71 172.24.8.72 172.24.8.73 172.24.8.74 172.24.8.75 172.24.8.76)
 24 
 25 # 集群所有IP 对应的主机名数组
 26 export ALL_NAMES=(master01 master02 master03 worker01 worker02 worker03)
 27 

[root@master01 ~]# source environment.sh

[root@master01 ~]# chmod +x environment.sh

[root@master01 ~]# for all_ip in ${ALL_IPS[@]}

do

echo ">>> ${all_ip}"

scp -rp k8sinit.sh root@${all_ip}:/root/

ssh root@${all_ip} "bash /root/k8sinit.sh"

done

三 集群部署

3.1 Docker安装

[root@master01 ~]# for all_ip in ${ALL_IPS[@]}

do

echo ">>> ${all_ip}"

ssh root@${all_ip} "yum -y install yum-utils device-mapper-persistent-data lvm2"

ssh root@${all_ip} "yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo"

ssh root@${all_ip} "yum -y install docker-ce"

ssh root@${all_ip} "mkdir /etc/docker"

ssh root@${all_ip} "cat > /etc/docker/daemon.json <<EOF

{

\"registry-mirrors\": [\"https://dbzucv6w.mirror.aliyuncs.com\"],

\"exec-opts\": [\"native.cgroupdriver=systemd\"],

\"log-driver\": \"json-file\",

\"log-opts\": {

\"max-size\": \"100m\"

},

\"storage-driver\": \"overlay2\",

\"storage-opts\": [

\"overlay2.override_kernel_check=true\"

]

}

EOF"

ssh root@${all_ip} "systemctl restart docker"

ssh root@${all_ip} "systemctl enable docker"

ssh root@${all_ip} "systemctl status docker"

ssh root@${all_ip} "iptables -nvL"

done

提示:如上仅需Master01节点操作,从而实现所有节点自动化安装。

3.2 相关组件包

需要在每台机器上都安装以下的软件包:

kubeadm: 用来初始化集群的指令;

kubelet: 在集群中的每个节点上用来启动 pod 和 container 等;

kubectl: 用来与集群通信的命令行工具。

kubeadm不能安装或管理 kubelet 或 kubectl ,所以得保证他们满足通过 kubeadm 安装的 Kubernetes 控制层对版本的要求。如果版本没有满足要求,可能导致一些意外错误或问题。

具体相关组件安装见《附001.kubectl介绍及使用》。

提示:Kubernetes 1.17版本所有兼容相应组件的版本参考:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.17.md。

3.3 正式安装

[root@master01 ~]# for all_ip in ${ALL_IPS[@]}

do

echo ">>> ${all_ip}"

ssh root@${all_ip} "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"

ssh root@${all_ip} "yum install -y kubeadm-1.17.4-0.x86_64 kubelet-1.17.4-0.x86_64 kubectl-1.17.4-0.x86_64 --disableexcludes=kubernetes"

ssh root@${all_ip} "systemctl enable kubelet"

done

提示:如上仅需Master01节点操作,从而实现所有节点自动化安装,同时此时不需要启动kubelet,初始化的过程中会自动启动的,如果此时启动了会出现报错,忽略即可。

说明:同时安装了cri-tools, kubernetes-cni, socat三个依赖:

socat:kubelet的依赖;

cri-tools:即CRI(Container Runtime Interface)容器运行时接口的命令行工具。

四 部署高可用组件I

4.1 Keepalived安装

[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}

do

echo ">>> ${master_ip}"

ssh root@${master_ip} "yum -y install gcc gcc-c++ make libnl libnl-devel libnfnetlink-devel openssl-devel"

ssh root@${master_ip} "wget http://down.linuxsb.com:8888/software/keepalived-2.0.20.tar.gz"

ssh root@${master_ip} "tar -zxvf keepalived-2.0.20.tar.gz"

ssh root@${master_ip} "cd keepalived-2.0.20/ && ./configure --sysconf=/etc --prefix=/usr/local/keepalived && make && make install"

ssh root@${master_ip} "systemctl enable keepalived && systemctl start keepalived"

done

提示:如上仅需Master01节点操作,从而实现所有节点自动化安装。

4.2 创建配置文件

[root@master01 ~]# git clone https://github.com/cookeem/kubeadm-ha #拉取github的高可用自动配置脚本

[root@master01 ~]# cd kubeadm-ha/

[root@master01 kubeadm-ha]# vi create-config.sh #其他部分保持默认

代码语言:javascript
复制
  1 #!/bin/bash
  2 
  3 #######################################
  4 # set variables below to create the config files, all files will create at ./config directory
  5 #######################################
  6 
  7 # master keepalived virtual ip address
  8 export K8SHA_VIP=172.24.8.71
  9 
 10 # master01 ip address
 11 export K8SHA_IP1=172.24.8.72
 12 
 13 # master02 ip address
 14 export K8SHA_IP2=172.24.8.73
 15 
 16 # master03 ip address
 17 export K8SHA_IP3=172.24.8.74
 18 
 19 # master keepalived virtual ip hostname
 20 export K8SHA_VHOST=master
 21 
 22 # master01 hostname
 23 export K8SHA_HOST1=master01
 24 
 25 # master02 hostname
 26 export K8SHA_HOST2=master02
 27 
 28 # master03 hostname
 29 export K8SHA_HOST3=master03
 30 
 31 # master01 network interface name
 32 export K8SHA_NETINF1=eth0
 33 
 34 # master02 network interface name
 35 export K8SHA_NETINF2=eth0
 36 
 37 # master03 network interface name
 38 export K8SHA_NETINF3=eth0
 39 
 40 # keepalived auth_pass config
 41 export K8SHA_KEEPALIVED_AUTH=412f7dc3bfed32194d1600c483e10ad1d
 42 
 43 # calico reachable ip address
 44 export K8SHA_CALICO_REACHABLE_IP=172.24.8.2
 45 
 46 # kubernetes CIDR pod subnet
 47 export K8SHA_CIDR=10.10.0.0
 48 

[root@master01 kubeadm-ha]# bash create-config.sh

解释:如上仅需Master01节点操作。执行脚本后会生产如下配置文件清单:

执行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目录

[root@master01 kubeadm-ha]# vi kubeadm-config.yaml #完善配置

代码语言:javascript
复制
  1 ---
  2 apiVersion: kubeadm.k8s.io/v1beta1
  3 kind: ClusterConfiguration
  4 kubernetesVersion: v1.17.4				#设置安装版本
  5 apiServerCertSANs:
  6 - master01
  7 - master02
  8 - master03
  9 - master
 10 - 172.24.8.71
 11 - 172.24.8.72
 12 - 172.24.8.73
 13 - 172.24.8.254
 14 controlPlaneEndpoint: "172.24.8.254:16443"		#设置相关地址
 15 networking:
 16   # This CIDR is a Calico default. Substitute or remove for your CNI provider.
 17   podSubnet: "10.10.0.0/16"				#设置Pod网段
 18   serviceSubnet: "192.168.0.0/16"			#设置svc网段
 19 ---
 20 apiVersion: kubeproxy.config.k8s.io/v1alpha1
 21 kind: KubeProxyConfiguration
 22 mode: ipvs
 23 

提示:如上仅需Master01节点操作,更多config文件参考:https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2

4.3 启动Keepalived

[root@master01 ~]# cat /etc/keepalived/keepalived.conf

[root@master01 ~]# cat /etc/keepalived/check_apiserver.sh 确认Keepalived配置

[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}

do

echo ">>> ${master_ip}"

ssh root@${master_ip} "systemctl restart keepalived.service"

ssh root@${master_ip} "systemctl status keepalived.service"

ssh root@${master_ip} "ping -c1 172.24.8.254"

done

提示:如上仅需Master01节点操作,从而实现所有节点自动启动服务。

4.4 启动Nginx

执行create-config.sh脚本后,nginx-lb的配置文件会自动复制到各个master的节点的/root/nginx-lb目录

[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}

do

echo ">>> ${master_ip}"

ssh root@${master_ip} "cd /root/nginx-lb/ && docker-compose up -d"

ssh root@${master_ip} "docker-compose ps"

done

提示:如上仅需Master01节点操作,从而实现所有节点自动启动服务。

五 初始化集群-Master

5.1 拉取镜像

[root@master01 ~]# kubeadm --kubernetes-version=v1.17.4 config images list #列出所需镜像

[root@master01 ~]# docker login --username=x120952576@126.com registry.aliyuncs.com

[root@master01 ~]# vi down.sh

代码语言:javascript
复制
  1 #!/bin/bash
  2 # 使用如下脚本下载国内镜像,并修改tag为google的tag
  3 KUBE_VERSION=v1.17.4
  4 KUBE_PAUSE_VERSION=3.1
  5 ETCD_VERSION=3.4.3-0
  6 CORE_DNS_VERSION=1.6.5
  7 GCR_URL=k8s.gcr.io
  8 ALIYUN_URL=registry.cn-hangzhou.aliyuncs.com/google_containers
  9 
 10 images=(kube-proxy:${KUBE_VERSION}
 11 kube-scheduler:${KUBE_VERSION}
 12 kube-controller-manager:${KUBE_VERSION}
 13 kube-apiserver:${KUBE_VERSION}
 14 pause:${KUBE_PAUSE_VERSION}
 15 etcd:${ETCD_VERSION}
 16 coredns:${CORE_DNS_VERSION})
 17 
 18 for imageName in ${images[@]} ; do
 19   docker pull $ALIYUN_URL/$imageName
 20   docker tag $ALIYUN_URL/$imageName $GCR_URL/$imageName
 21   docker rmi $ALIYUN_URL/$imageName
 22 done
 23 

[root@master01 ~]# chmod u+x down.sh

[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}

do

echo ">>> ${master_ip}"

scp -rp down.sh root@${master_ip}:/root/

ssh root@${master_ip} "bash down.sh &"

done

提示:如上仅需Master01节点操作,从而实现所有Master节点自动拉取镜像。

[root@master01 ~]# docker images #确认验证

5.2 Master上初始化

[root@master01 ~]# kubeadm init --config=/root/kubeadm-ha/kubeadm-config.yaml --upload-certs

保留如下命令用于后续节点添加:

代码语言:javascript
复制
  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.254:16443 --token r0awcu.lqd10ud79onpnti7 \
  4     --discovery-token-ca-cert-hash sha256:b010761631964b9ff381eb2dfcdd0708acd50b544782c3ed241e303f67cbe4ab \
  5     --control-plane --certificate-key b238ee75df1efb88880f2453e1e6e1afb7e774b57817eb3fb15a4a9e578e92fd
  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.254:16443 --token r0awcu.lqd10ud79onpnti7 \
 14     --discovery-token-ca-cert-hash sha256:b010761631964b9ff381eb2dfcdd0708acd50b544782c3ed241e303f67cbe4ab
 15 

注意:如上token具有默认24小时的有效期,token和hash值可通过如下方式获取:

kubeadm token list

如果 Token 过期以后,可以输入以下命令,生成新的 Token

kubeadm token create openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

[root@master01 ~]# mkdir -p $HOME/.kube

[root@master01 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@master01 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

[root@master01 ~]# cat << EOF >> ~/.bashrc

export KUBECONFIG=$HOME/.kube/config

EOF #设置KUBECONFIG环境变量

[root@master01 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

[root@master01 ~]# source ~/.bashrc

附加:初始化过程大致步骤如下:

  • [kubelet-start] 生成kubelet的配置文件”/var/lib/kubelet/config.yaml”
  • [certificates]生成相关的各种证书
  • [kubeconfig]生成相关的kubeconfig文件
  • [bootstraptoken]生成token记录下来,后边使用kubeadm join往集群中添加节点时会用到

提示:初始化仅需要在master01上执行,若初始化异常可通过kubeadm reset && rm -rf $HOME/.kube重置。

5.3 添加其他master节点

[root@master02 ~]# kubeadm join 172.24.8.254:16443 --token r0awcu.lqd10ud79onpnti7 \

--discovery-token-ca-cert-hash sha256:b010761631964b9ff381eb2dfcdd0708acd50b544782c3ed241e303f67cbe4ab \

--control-plane --certificate-key b238ee75df1efb88880f2453e1e6e1afb7e774b57817eb3fb15a4a9e578e92fd

[root@master02 ~]# mkdir -p $HOME/.kube

[root@master02 ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

[root@master02 ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/config

[root@master02 ~]# cat << EOF >> ~/.bashrc

export KUBECONFIG=$HOME/.kube/config

EOF #设置KUBECONFIG环境变量

[root@master02 ~]# echo "source <(kubectl completion bash)" >> ~/.bashrc

[root@master02 ~]# source ~/.bashrc

提示:master03也如上执行添加至集群的controlplane。

提示:若添加异常可通过kubeadm reset && rm -rf $HOME/.kube重置。

六 安装NIC插件

6.1 NIC插件介绍

Calico 是一个安全的 L3 网络和网络策略提供者。

Canal 结合 Flannel 和 Calico, 提供网络和网络策略。

Cilium 是一个 L3 网络和网络策略插件, 能够透明的实施 HTTP/API/L7 策略。 同时支持路由(routing)和叠加/封装( overlay/encapsulation)模式。

Contiv 为多种用例提供可配置网络(使用 BGP 的原生 L3,使用 vxlan 的 overlay,经典 L2 和 Cisco-SDN/ACI)和丰富的策略框架。Contiv 项目完全开源。安装工具同时提供基于和不基于 kubeadm 的安装选项。

Flannel 是一个可以用于 Kubernetes 的 overlay 网络提供者。

Romana 是一个 pod 网络的层 3 解决方案,并且支持 NetworkPolicy API。Kubeadm add-on 安装细节可以在这里找到。

Weave Net 提供了在网络分组两端参与工作的网络和网络策略,并且不需要额外的数据库。

CNI-Genie 使 Kubernetes 无缝连接到一种 CNI 插件,例如:Flannel、Calico、Canal、Romana 或者 Weave。

提示:本实验使用Calico插件。

6.2 设置标签

[root@master01 ~]# kubectl taint nodes --all node-role.kubernetes.io/master- #允许master部署应用

提示:部署完内部应用后可使用kubectl taint node k8smaster03 node-role.kubernetes.io/master="":NoSchedule重新设置Master为Master Only 状态。

6.3 部署calico

[root@master01 ~]# for all_ip in ${ALL_IPS[@]}

do

echo ">>> ${all_ip}"

ssh root@${all_ip} "docker pull calico/cni:v3.11.2"

ssh root@${all_ip} "docker pull calico/pod2daemon-flexvol:v3.11.2"

ssh root@${all_ip} "docker pull calico/node:v3.11.2"

ssh root@${all_ip} "docker pull calico/kube-controllers:v3.11.2"

done

#建议提前pull镜像

提示:如上仅需Master01节点操作,从而实现所有Master节点自动拉取镜像。

[root@master01 ~]# wget https://docs.projectcalico.org/v3.11/manifests/calico.yaml

[root@master01 ~]# vi calico.yaml

代码语言:javascript
复制
  1 ……
  2             - name: CALICO_IPV4POOL_CIDR
  3               value: "10.10.0.0/16"		#配置Pod网段
  4 ……
  5             - name: IP_AUTODETECTION_METHOD
  6               value: "interface=eth.*"		#追加节点之间的网卡
  7 # Auto-detect the BGP IP address.
  8             - name: IP
  9               value: "autodetect"
 10 ……

[root@master01 ~]# kubectl apply -f calico.yaml

[root@master01 ~]# kubectl get pods --all-namespaces -o wide #查看部署

[root@master01 ~]# kubectl get nodes

七 部署高可用组件II

7.1 高可用说明

高可用kubernetes集群步骤三已完成配置,但是使用docker-compose方式启动nginx-lb由于无法提供kubernetes集群的健康检查和自动重启功能,nginx-lb作为高可用kubernetes集群的核心组件建议也作为kubernetes集群中的一个pod来进行管理。

在/etc/kubernetes/manifests/目录下,是kubelet直接管理的核心部署文件。现在我们停止原先使用docker-compose启动的nginx-lb,由kubelet直接管理nginx-lb服务。

7.2 容器化实现高可用

[root@master01 ~]# for master_ip in ${MASTER_IPS[@]}

do

echo ">>> ${master_ip}"

ssh root@${master_ip} "systemctl stop kubelet"

ssh root@${master_ip} "docker stop nginx-lb && docker rm nginx-lb"

scp -rp /root/nginx-lb/nginx-lb.conf root@${master_ip}:/etc/kubernetes/

scp -rp /root/nginx-lb/nginx-lb.yaml root@${master_ip}:/etc/kubernetes/manifests/

ssh root@${master_ip} "systemctl restart kubelet docker"

done

提示:如上仅需Master01节点操作,从而实现所有Master节点自动启动服务。

[root@master01 ~]# kubectl get pods --all-namespaces -o wide #再次验证

八 添加Worker节点

8.1 下载镜像

为避免node节点无法pull相关镜像,建议体现pull。

[root@master01 ~]# for node_ip in ${NODE_IPS[@]}

do

echo ">>> ${node_ip}"

ssh root@${node_ip} "docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1"

ssh root@${node_ip} "docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1 k8s.gcr.io/pause:3.1"

ssh root@${node_ip} "docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.1"

ssh root@${node_ip} "docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.4"

ssh root@${node_ip} "docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.4 k8s.gcr.io/kube-proxy:v1.17.4"

ssh root@${node_ip} "docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/kube-proxy:v1.17.4"

done

提示:如上仅需Master01节点操作,从而实现所有Master节点自动拉取镜像。

8.2 添加Worker节点

[root@master01 ~]# for node_ip in ${NODE_IPS[@]}

do

echo ">>> ${node_ip}"

ssh root@${node_ip} "kubeadm join 172.24.8.254:16443 --token r0awcu.lqd10ud79onpnti7 --discovery-token-ca-cert-hash sha256:b010761631964b9ff381eb2dfcdd0708acd50b544782c3ed241e303f67cbe4ab"

ssh root@${node_ip} "systemctl enable kubelet.service"

done

提示:如上仅需Master01节点操作,从而实现所有Worker节点添加至集群,若添加异常可通过如下方式重置:

[root@node01 ~]# kubeadm reset

[root@node01 ~]# ifconfig cni0 down

[root@node01 ~]# ip link delete cni0

[root@node01 ~]# ifconfig flannel.1 down

[root@node01 ~]# ip link delete flannel.1

[root@node01 ~]# rm -rf /var/lib/cni/

8.3 确认验证

[root@master01 ~]# kubectl get nodes #节点状态

[root@master01 ~]# kubectl get cs #组件状态

[root@master01 ~]# kubectl get serviceaccount #服务账户

[root@master01 ~]# kubectl cluster-info #集群信息

[root@master01 ~]# kubectl get pod -n kube-system -o wide #所有服务状态

提示:更多Kubetcl使用参考:https://kubernetes.io/docs/reference/kubectl/kubectl/

https://kubernetes.io/docs/reference/kubectl/overview/

更多kubeadm使用参考:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/

九 开启IPVS

提示:通常4.2修改config文件后已开启ipvs,若未开启可通过如下方式修改。

[root@master01 ~]# kubectl logs kube-proxy-b4rnm -n kube-system #查看任意一个proxy pod的日志

9.1 修改ConfigMap

[root@master01 ~]# kubectl edit cm kube-proxy -n kube-system #模式改为ipvs

……

mode: "ipvs"

……

[root@master01 ~]# kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

[root@master01 ~]# kubectl get pod -n kube-system | grep kube-proxy #查看proxy的pod

[root@master01 ~]# kubectl logs kube-proxy-2c8tj -n kube-system #查看任意一个proxy pod的日志

十 测试集群

10.1 创建测试service

[root@master01 ~]# kubectl run nginx --replicas=2 --labels="run=load-balancer-example" --image=nginx --port=80

[root@master01 ~]# kubectl expose deployment nginx --type=NodePort --name=example-service #暴露端口

[root@master01 ~]# kubectl get service #查看服务状态

[root@master01 ~]# kubectl describe service example-service #查看信息

10.2 测试访问

[root@master01 ~]# curl 192.168.182.44

[root@master01 ~]# kubectl get pod -o wide #查看endpoint

[root@master01 ~]# curl 10.10.5.1 #访问endpoint,与访问服务ip结果相同

[root@master01 ~]# curl 10.10.19.65

[root@master01 ~]# kubectl delete deployments.apps nginx

[root@master01 ~]# kubectl delete service example-service

十一 部署dashboard

参考《附017.Kubernetes_v1.17 Dashboard部署》。

参考链接:

https://blog.csdn.net/fanren224/article/details/86573264

https://blog.frognew.com/2019/04/kubeadm-install-kubernetes-1.14.html

http://www.luyixian.cn/news_show_11429.aspx

https://www.kubernetes.org.cn/4956.html

https://github.com/cookeem/kubeadm-ha

下一篇
举报
领券