【容器化】Kubernetes部署

官网

github:https://github.com/kubernetes/kubernetes

official-website:https://kubernetes.io/

简介

官方说明:Kubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统。

官方说明:Kubernetes, also known as K8s, is an open source system for managing containerized applications across multiple hosts. It provides basic mechanisms for deployment, maintenance, and scaling of applications.

Kubernetes builds upon a decade and a half of experience at Google running production workloads at scale using a system called Borg, combined with best-of-breed ideas and practices from the community.

Kubernetes is hosted by the Cloud Native Computing Foundation (CNCF). If your company wants to help shape the evolution of technologies that are container-packaged, dynamically scheduled, and microservices-oriented, consider joining the CNCF. For details about who’s involved and how Kubernetes plays a role, read the CNCF announcement.

Kubeadm方式部署

1. 准备

a) 禁用swap虚拟内存

原因:https://github.com/kubernetes/kubernetes/issues/53533

1
2
3
4
5
6
7
8
# 查看默认是否开启swap虚拟内存,swap端不为0则说明开启
free -h
# 临时禁用swap
swapoff -a
# 永久禁用swap,需重启服务生效
sed -i 's/.*swap.*/#&/' /etc/fstab
# 再次查看swap是否已关闭
free -h

结果截图:

b) 禁用selinux

原因:(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
Setting SELinux in permissive mode by runningsetenforce 0andsed …effectively disables it. This is required to allow containers to access the host filesystem, which is needed by pod networks for example. You have to do this until SELinux support is improved in the kubelet.

1
2
3
4
5
6
7
8
# 查看默认是否已关闭
getenforce
# 临时禁用
setenforce 0
# 永久禁用,需重启服务器生效
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
# 再次查看是否已关闭
getenforce

结果截图:

c) 禁用防火墙(firewall)

原因:(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
Theiptablestooling can act as a compatibility layer, behaving like iptables but actually configuring nftables. This nftables backend is not compatible with the current kubeadm packages: it causes duplicated firewall rules and breakskube-proxy.

1
2
3
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld

结果截图:

d) 允许 iptables 检查桥接流量

说明:(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
Make sure that the br_netfilter module is loaded. This can be done by running lsmod | grep br_netfilter. To load it explicitly call sudo modprobe br_netfilter.
As a requirement for your Linux Node’s iptables to correctly see bridged traffic, you should ensure net.bridge.bridge-nf-call-iptables is set to 1 in your sysctl config, e.g.

1
2
3
4
5
6
7
8
9
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

结果截图:

e) 安装Docker

f) 配置Docker的Cgroup驱动程序

说明:https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#docker
Docker中默认的Cgroup驱动程序为cgroupfs,和Kubelet默认的systemd不一致,将会导致Kubelet安装时报错,所以修改Docker的Cgroup驱动程序为systemd。

1
vi /etc/docker/daemon.json

添加以下内容

1
2
3
4
5
6
7
8
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}

结果截图:

1
2
3
# 重启Docker
systemctl daemon-reload
systemctl restart docker

g) 配置Kubernetes的YUM源

YUM默认源是没有Kubernetes相关组件的软件的(Kubeadm、Kubectl、Kubelet),所以需要配置Kubernetes的YUM源

1
2
3
4
5
6
7
8
9
10
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
yum makecache fast

h) 查看可安装的Kuberadm、Kubelet、Kubectl版本

1
yum list kubeadm --showduplicates

2. 所有节点安装Kubeadm、Kubelet、Kubectl

1
2
3
4
# 安装最新版本
# yum install -y kubeadm kubelet kubectl
# 安装指定指定版本
yum install -y kubeadm-1.20.9 kubelet-1.20.9 kubectl-1.20.9

结果截图:

3. 所有节点配置开启自启动及服务启动

1
2
systemctl enable kubelet
systemctl start kubelet

结果截图:

3. Master节点初始化

1
2
3
4
5
6
kubeadm init --apiserver-advertise-address=192.168.10.8 \
--apiserver-bind-port=6443 \
--image-repository=google_containers \
--kubernetes-version=v1.20.9 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12

结果截图:

1
2
3
4
# 按照提示复制对应配置文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

4. Work节点初始化

1
2
3
kubeadm join 192.168.10.8:6443 \
--token rbmgap.cdmqe0c25613a8yr \
--discovery-token-ca-cert-hash sha256:b1dacd2a9ec2205aa80ad09f80e8a44eee43f6527aa2ea5745e405bb1c5ca2bd

结果截图:

5. Master查看节点信息

集群节点当前处于NotReady状态,原因是coredns服务还没启动成功,而coredns服务依赖Kubernetes集群中的网络插件,常用的网络插件为Flannel、Calico。

1
kubectl get node -owide

结果截图:

6. Master节点配置网络插件(Flannel)

说明

官方地址:https://github.com/flannel-io/flannel
网络插件只需要安装一个即可,即安装了Flannel就不需要安装Calico了。

下载并修改服务配置

1
2
3
4
# 下载Flannel部署YAML文件
curl -o /usr/local/src/kube-flannel.yaml https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 修改部分属性
vi /usr/local/src/kube-flannel.yaml
1
2
3
4
5
6
7
# 修改其中的net-conf.json中的Network属性,改为初始化命令中的pod-network-cidr参数
"Network": "10.244.0.0/16",
# (若存在多网卡)新增指定网卡属性
args:
- --ip-masq
- --kube-subnet-mgr
- --iface=enp0s8

部署服务

1
2
# 部署网络插件Flannel服务
kubectl create -f /usr/local/src/kube-flannel.yaml

结果截图:

查看结果

1
2
3
4
# 定时查看Kubernetes集群中pod运行状态,若全部处于Running状态则表明网络插件Flannel部署成功了
watch -n 1 "kubectl get pod -A"
# 再次查看节点状态,若都处于Ready状态则表明网络插件Flannel配置成功了
kubectl get node -owide

结果截图:

7. Master节点配置网络插件(Calico)

说明

官方地址:https://www.tigera.io/project-calico/
网络插件只需要安装一个即可,即安装了Calico就不需要安装Flannel了。

下载并修改服务配置

1
2
3
4
5
# 下载calico部署YAML文件
curl -o /usr/local/src/tigera-operator.yaml https://docs.projectcalico.org/manifests/tigera-operator.yaml
curl -o /usr/local/src/custom-resources.yaml https://docs.projectcalico.org/manifests/custom-resources.yaml
# 修改部分属性
vi /usr/local/src/custom-resources.yaml
1
2
# 修改其中的cidr属性,改为初始化命令中的pod-network-cidr参数
cidr: 10.244.0.0/16

部署服务

1
2
3
# 部署网络插件Calico服务
kubectl create -f /usr/local/src/tigera-operator.yaml
kubectl create -f /usr/local/src/custom-resources.yaml

结果截图:

查看结果

1
2
3
4
# 定时查看Kubernetes集群中pod运行状态,若全部处于Running状态则表明网络插件Calico部署成功了
watch -n 1 "kubectl get pod -A"
# 再次查看节点状态,若都处于Ready状态则表明网络插件Calico配置成功了
kubectl get node -owide

结果截图:

8. Master节点配置网络插件(Calico)(方式2)

说明

官方地址:https://www.tigera.io/project-calico/
网络插件只需要安装一个即可,即安装了Calico就不需要安装Flannel了。
此方式关键在于直接使用一个配置文件即可

下载并修改服务配置

1
2
3
4
# 下载Calico部署YAML文件
curl -o /usr/local/src/calico.yaml https://docs.projectcalico.org/manifests/calico.yaml
# 修改部分属性
vi /usr/local/src/calico.yaml
1
2
3
# 修改其中的CALICO_IPV4POOL_CIDR环境变量(默认是被注释的了),改为初始化命令中的pod-network-cidr参数
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"

部署服务

1
2
# 部署网络插件Calico服务
kubectl create -f /usr/local/src/calico.yaml

结果截图:

查看结果

1
2
3
4
# 定时查看Kubernetes集群中pod运行状态,若全部处于Running状态则表明网络插件Calico部署成功了
watch -n 1 "kubectl get pod -A"
# 再次查看节点状态,若都处于Ready状态则表明网络插件Calico配置成功了
kubectl get node -owide

结果截图:

(•̀ᴗ•́)و ̑̑

Share