快速部署K8S高可用集群

简介

  • KubernetesGoogle20146月开源的一个容器集群部署与管理系统,简称为K8S
  • KubernetesGoogle内部的Borg容器集群部署和管理系统衍生而来,使用Go语言开发。
  • Kubernetes是一个可以移植、可扩展的开源平台,使用声明式的配置并依据配置信息自动地执行容器化应用程序的管理。
  • Kubernetes主要用于自动化部署、扩展和管理容器应用,提供资源的调度、部署管理、服务发现、扩容缩容、运维监控等一整套功能。

介绍集群

文档

  • GitHub《传送门》
  • 版本策略:《传送门》
  • 高可用集群:《传送门》

版本

  • OS: CentOS 7.7
  • Etcd3.4.3
  • Calico3.13.2
  • CoreDNS1.6.5
  • Docker19.03.8
  • Kubernetes1.17.5

要求

  • 每个节点的操作系统版本为CentOS 7.7
  • 每个节点至少拥有2CPU2GRAM
  • 每个节点的主机名都是唯一的,并且不包含下划线、小数点、大写字母。
  • 每个节点都有固定的IP地址,并且节点之间能相互通信。
  • 每个节点都关闭了swap分区,此要求从K8S v1.8开始实施。
  • 每个Master节点需安装dockerkubeadmkubectlkubelet
  • 每个Node节点需安装dockerkubeadmkubelet

规划

IP 角色 组件
172.18.20.10 Master etcd、calico、kube-apiserver、kube-controller-manager、kube-scheduler
172.18.20.11 Master etcd、calico、kube-apiserver、kube-controller-manager、kube-scheduler
172.18.20.12 Master etcd、calico、kube-apiserver、kube-controller-manager、kube-scheduler
172.18.20.13 Node calico、kube-proxy、kubelet
172.18.20.14 Node calico、kube-proxy、kubelet
172.18.20.15 Node calico、kube-proxy、kubelet

部署集群

SetUP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 关闭SELinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

# 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service

# 禁用交换分区
swapoff -a && sysctl -w vm.swappiness=0
sed -i '/swap/d' /etc/fstab
echo "vm.swappiness = 0" > /etc/sysctl.d/99-kubernetes.conf

# 内部解析
echo '127.0.0.1 localhost' > /etc/hosts
echo '172.18.20.10 master-1' >> /etc/hosts
echo '172.18.20.11 master-2' >> /etc/hosts
echo '172.18.20.12 master-3' >> /etc/hosts
echo '172.18.20.13 node-1' >> /etc/hosts
echo '172.18.20.14 node-2' >> /etc/hosts
echo '172.18.20.15 node-3' >> /etc/hosts

# 允许 iptables 查看 bridge 的流量
modprobe br_netfilter
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.d/99-kubernetes.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.d/99-kubernetes.conf
sysctl -qp /etc/sysctl.d/99-kubernetes.conf

# 提示符
echo 'export PS1="\u@\[\e[1;93m\]\h\[\e[m\]:\w\\$\[\e[m\] "' >> /root/.bashrc

# 环境变量
echo 'export PATH="${PATH}:/etc/kubernetes/bin"' >> /root/.bashrc

# 免密通信
ssh-keygen -t rsa -P "" -C "K8S" -f '/root/.ssh/id_rsa' >/dev/null 2>&1
echo "" >> /root/.ssh/authorized_keys
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys

# 调整用户进程限制
echo '* soft nofile 204800' >> /etc/security/limits.conf
echo '* hard nofile 204800' >> /etc/security/limits.conf

Docker

1
2
mkdir -p /etc/docker
vim /etc/docker/daemon.json
1
2
3
4
5
6
7
8
9
10
11
12
{
"log-opts": {
"max-size": "100m"
},
"log-driver": "json-file",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"storage-driver": "overlay2",
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://9cs90h5l.mirror.aliyuncs.com"]
}
1
2
systemctl enable docker.service
systemctl restart docker.service

Kubernetes

Package

1
vim /etc/yum.repos.d/kubernetes.repo
1
2
3
4
5
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 更新软件源
yum makecache

# 获取可用版本
yum list kubelet --showduplicates | grep '1.17'

# 安装指定版本
yum install -y ebtables ethtool kubeadm-1.17.4 kubelet-1.17.4 kubectl-1.17.4
systemctl enable kubelet.service

# 锁定版本
yum install -y yum-plugin-versionlock
yum versionlock kubeadm kubelet kubectl

# 解除锁定
yum versionlock delete kubeadm kubelet kubectl

# 自动补全
kubectl completion bash > /etc/bash_completion.d/kubectl

LoadBalancer

  • 高可用集群要为Master节点的kube-apiserver创建LoadBalancer(负载均衡器),此处通过在QingCloud(青云),创建LB实现。
  • 首先创建监听器,选择TCP协议,端口为6443,然后将所有的Master节点添加为工作后端
  • 这些Master节点的初始状态都为不可用状态,当初始化完成后,就变为活跃状态了。

Master

  • 初始化首个Master节点:
1
2
3
4
5
6
7
8
kubeadm init \
--service-cidr 10.20.0.0/16 \
--kubernetes-version v1.17.5 \
--pod-network-cidr 10.10.0.0/16 \
--apiserver-advertise-address 172.18.20.10 \
--image-repository registry.aliyuncs.com/google_containers \
--control-plane-endpoint 172.18.20.100:6443 \
--upload-certs
  • 拷贝配置文件:
1
2
3
mkdir -p /root/.kube
cp -a /etc/kubernetes/admin.conf /root/.kube/config
chown root:root /root/.kube/config
  • 继续添加Master节点:
1
2
3
4
kubeadm join 172.18.20.100:6443 \
--token zqvp2u.ausm4b9yse06vxyy \
--discovery-token-ca-cert-hash sha256:2f1acb9d0150a2bc3cb9287590b99c88da3dcaf515d97008244e4313401ba26d \
--control-plane --certificate-key ce645d03418be996c8ca12ffe6e1909513c0ca4204265a191e305b154c87697a
  • 拷贝配置文件:
1
2
3
mkdir -p /root/.kube
cp -a /etc/kubernetes/admin.conf /root/.kube/config
chown root:root /root/.kube/config
  • 获取节点信息,Master节点状态为NotReady
1
kubectl get nodes
  • 因为没有为集群部署容器网络接口CNI,所以节点状态是NotReady,基于Pod的网络插件:CalicoFlannel等。

Calico

  • 下载配置文件:
1
2
# GitHub: https://github.com/projectcalico/calico
wget https://docs.projectcalico.org/v3.13/manifests/calico.yaml
  • 应用yaml文件:
1
kubectl apply -f calico.yaml
  • 获取节点信息,Master节点状态为Ready
1
kubectl get nodes

Node

  • 将自身加入到集群中:
1
2
3
kubeadm join 172.18.20.100:6443 \
--token zqvp2u.ausm4b9yse06vxyy \
--discovery-token-ca-cert-hash sha256:2f1acb9d0150a2bc3cb9287590b99c88da3dcaf515d97008244e4313401ba26d
  • 由于令牌(Token)有效期为24小时,若过了有效期,还需添加Node节点,则需要重新创建令牌。

Master

  • 给节点设置Lable
1
2
3
kubectl label nodes node-1 node-role.kubernetes.io/node=
kubectl label nodes node-2 node-role.kubernetes.io/node=
kubectl label nodes node-3 node-role.kubernetes.io/node=
  • 获取节点信息,总共有3个节点,节点状态都为Ready
1
kubectl get nodes

Dashboard

  • 此处不部署官方的Dashboard,若需要官方的Dashboard,请参考《快速部署K8S单主集群》
  • 此处选择部署Kuboard图形化管理界面,请查看文档《Kuboard管理界面》
  • LoadBalancer上创建新的监听器,为Kuboard图形化管理界面做高可用。

请作者喝瓶肥宅快乐水