基于Ubuntu安装部署Kubernetes集群

环境准备

  1. 安装 Ubuntu 虚拟机
    通过 Parallels Desktop 安装了 3 台虚拟机,并对虚拟机进行如下规划:

    Hostname IP OS Specs
    k8s-master-01 192.168.11.190 Ubuntu 20.04 2GB Ram, 2vcpus
    k8s-node-01 192.168.11.191 Ubuntu 20.04 2GB Ram, 2vcpus
    k8s-node-02 192.168.11.192 Ubuntu 20.04 2GB Ram, 2vcpus
  2. 科学上网

  3. 关闭swap

    编辑 /etc/fstab 文件,注释掉引用 swap

1
2
3
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
sudo swapoff -a

安装和配置 Docker

在每台虚拟机上安装 Docker, 参考Install Docker Engine on Ubuntu

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
# 更正 apt 包索引和安装GPG证书
sudo apt update

sudo apt install -y \
ca-certificates \
curl \
gnupg \
lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 更新 apt 包索引并安装 Docker
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io

# 配置 Docker 服务
sudo mkdir -p /etc/systemd/system/docker.service.d

sudo tee /etc/docker/daemon.json <<EOF
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

# 重启 Docker 服务
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker

安装和配置 Kubernetes

在每台虚拟机上安装 kubeadm、kubelet 和 kubectl, 参考 Installing kubeadm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl

# 下载 Google Cloud 公开签名秘钥:
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

# 添加 Kubernetes apt 仓库:
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# 更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

如果 packages.cloud.google.com 无法访问的话,可以更换换国内的源:

1
2
3
4
5
sudo curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt update

配置节点

初始化 Master 节点

1
2
3
4
5
6
7
8
9
sudo kubeadm reset

sudo systemctl enable kubelet

sudo kubeadm init \
--pod-network-cidr=192.168.0.0/16 \
--upload-certs \
--node-name=k8s-master-01 \
--image-repository registry.aliyuncs.com/google_containers
  • –-pod-network-cidr: 指定pod网络的IP地址范围,它的值取决于你在下一步选择的哪个网络网络插件,这里使用 Calico, 参考 Quickstart for Calico on Kubernetes
  • –dry-run 当使用kubeadm命令初始化集群时,会去官方镜像仓库(k8s.gcr.io)拉取镜像。但是国内网络无法访问官方镜像仓库,导致集群初始化失败,可以使用其他镜像仓库。

kubeadm init 输出的token用于master和加入节点间的身份认证,token是机密的,需要保证它的安全,因为拥有此标记的人都可以随意向集群中添加节点。

配置 kubectl:

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

安装 Calico 网络插件

1
2
3
kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
kubectl create -f https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml

修改Docker及kubelet的Cgroup Driver

在安装kubernetes的过程中,经常会遇见如下错误

failed to create kubelet: misconfiguration: kubelet cgroup driver: “cgroupfs” is different from docker cgroup driver: “systemd”

原因是 docker 的 Cgroup Driver 和 kubelet 的 Cgroup Driver 不一致。
有两种方式解决问题,一种是修改docker,,另一种是修改kubelet;

  1. 修改 Docker 的 Cgroup Driver
    修改/etc/docker/daemon.json文件
1
2
3
{
"exec-opts": ["native.cgroupdriver=systemd"]
}

重启docker

1
2
systemctl daemon-reload
systemctl restart docker
  1. 修改 kubelet 的 Cgroup Driver

修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件,增加–cgroup-driver=cgroupfs

1
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=cgroupfs"

重启kubelet

1
2
systemctl daemon-reload
systemctl restart kubelet

卸载集群

在主节点上运行:

1
2
3
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
kubectl delete node <node name>

然后在需要移除的节点上,重置kubeadm的安装状态:

1
kubeadm reset