k8s基本部署要求

  1. 每个节点的时间必须同步。
  2. 要求各节点的防火墙必须关闭
  3. 禁用swap设备,k8s要求必须关闭swap,除非安装时强行忽略此错误
  4. 确保所有节点的ID为唯一的。

准备工作

一个Master节点,三个Worker节点.

HostName IP
k8s-master01 172.16.11.71
k8s-node01 172.16.11.81
k8s-node02 172.16.11.82
k8s-node03 172.16.11.83

部署Docker

kubeadm部署k8s要求所有主机上预先安装有docker环境。

安装Docker服务

1
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

启动docker并设置为开机启动

1
systemctl start docker && systemctl enable docker

注意:若IPtables规则在安装docker前没有清除,可以在安装完docker后清除规则然后重启docker服务。

修改cgoupfs为systemd

默认安装docker的cgroup dirve为cgroupfs ,需要将其改为systemd

1
2
3
4
5
6
cat << EOF >> /etc/docker/daemon.json
{
"registry-mirrors": ["https://gy97ij1m.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

重启docker服务

1
2
systemctl daemon-reload
systemctl restart docker

部署k8s

部署k8s要求在各节点上部署以下组件:

  • master:kube-apiserver,kube-controller-manager,kube-scheduler,etcd
  • worker:kubelet,kube-proxy,docker

但是本次是以k8s官方提供的kubeadm来进行部署,kubeadm将每一个组件运行为pod的方式来部署,因此在master节点上也需要部署docker和kubelet。

所以每个节点都需要部署docker,kubelet,kubeadm。主节点上还需要部署kubectl。

配置阿里云k8s源

1
2
3
4
5
6
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update

查看所有版本的kubeadm

1
apt-cache madison kubeadm

选择出所要安装的版本,并安装

在所有节点上安装kubeadm、kubectl、kubelet

1
2
3
4
# 本次安装选择1.21.1-00版本进行安装
apt-get install kubeadm=1.21.2-00 kubectl=1.21.2-00 kubelet=1.21.2-00 -y
# 设置为开机启动
systemctl enable kubelet

初始化控制平面节点

安装完kubeadm后需要先对初始化集群的控制平面,但是在初始化之前,需要将所有节点注册到DNS中,确保主机名能被DNS解析,此处使用hosts文件直接做解析。

修改hosts文件
1
2
3
4
5
6
cat << EOF >> /etc/hosts
172.16.11.71 k8s-master01 kube-api
172.16.11.81 k8s-node01
172.16.11.82 k8s-node02
172.16.11.83 k8s-node03
EOF
初始化控制平面

使用kubeadm init初始化集群。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
kubeadm init --apiserver-advertise-address=172.16.11.71 \
--control-plane-endpoint=kube-api \
--kubernetes-version=v1.21.2 \
--pod-network-cidr=10.244.0.0/16 \
--image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers

# --image-repository:为指定镜像仓库
# --kubernetes-version:指定k8s的版本,版本需要和kubeadm版本一致
# --control-plane-endpoint:用来告诉所有客户端链接控制端时使用什么主机名。
# --apiserver-advertise-address:指定apiserver的地址和端口,端口不指定默认为6443
# --pod-network-cidr:用来指定哪段网络地址用来给容器内pod的网段地址。
# 不同的网络地址,其默认的地址也不一样。
# flannl: 默认10.244.0.0/16
# calico: 默认192.168.0.0/16

初始化集群会做很多步骤:

  1. preflight: 进行预检测,如果检测不通过操作将终止。
  2. 生成各种证书,每个组件相互间通信使用https进行。
  3. 生成kubeconfig配置文件。
  4. 启动kubelet。
  5. 创建控制平面。
  6. 上传配置
  7. 上传证书
  8. 生成引导令牌,以方便其他节点加入。
初始化控制平面后会生成以下信息
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
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
# 此为添加控制平面的命令
kubeadm join kube-api:6443 --token 4oo3c2.ur24gwcotgi9pwt8 \
--discovery-token-ca-cert-hash sha256:0a2facf32492adf109c3eb0d45fa03e27b080298e3ae7ee4ef7063052c8cd626 \
--control-plane

Then you can join any number of worker nodes by running the following on each as root:
# 此为添加worker节点的命令
kubeadm join kube-api:6443 --token 4oo3c2.ur24gwcotgi9pwt8 \
--discovery-token-ca-cert-hash sha256:0a2facf32492adf109c3eb0d45fa03e27b080298e3ae7ee4ef7063052c8cd626
按照所生成的提示信息操作

在用户家目录下创建出config

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装flannel网络插件

1
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

使用令牌将各work节点加入到k8s集群中

1
2
kubeadm join kube-api:6443 --token 4oo3c2.ur24gwcotgi9pwt8 \
--discovery-token-ca-cert-hash sha256:0a2facf32492adf109c3eb0d45fa03e27b080298e3ae7ee4ef7063052c8cd626

查看各节点状态

1
2
3
4
5
6
7
root@k8s-master01:~# kubectl  get nodes
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane,master 17m v1.21.1
k8s-node01 Ready <none> 2m51s v1.21.1
k8s-node02 Ready <none> 2m46s v1.21.1
k8s-node03 Ready <none> 2m43s v1.21.1
# 各节点STATUS状态均为Ready,k8s节点部署完毕。