k8s 探索3:使用 kubeadm 安装集群

k8s 探索3:使用 kubeadm 安装集群

🎈「k8s 探索」系列:

操作系统安装完成后,我们可以说是「万事俱备」了!

1 安装 docker

第一步,我们先来安装 dockerdocker 是最常用的容器,k8s 是容器的编排工具。打个比方,如果说应用是货物,而docker就是集装箱,k8s则是就是码头。

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
43
44
45
46
47
48
49
50
51
# 安装相关依赖
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release

# 添加 docker 官方 GPG key
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

# 安装最新版本
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

# 创建 docker 用户组
sudo groupadd docker
# 然后将当前用户加入到 docker 的用户组里
sudo gpasswd -a $USER docker
# 最后更新用户组
newgrp docker

# 查看 docker 版本
docker -v
# Docker version 20.10.11, build dea9396

# 测试 Hello World
sudo docker run hello-world

# 配置 Docker 守护程序,尤其是使用 systemd 来管理容器的 cgroup
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF

# 配置 cgroup
sudo vi /boot/firmware/cmdline.txt
cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1 swapaccount=1 net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc

# 重新启动 Docker 并在启动时启用
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker

# 固定版本
sudo apt-mark hold docker-ce docker-ce-cli containerd.io docker-ce-rootless-extras

2 安装 kubeadm

都说 k8s 配置复杂,但 kubeadm 改变了这一切!它把 k8s 操作封装起来,变得极其易用,像我这样的小白也可以轻松运行起来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 允许 iptables 检查桥接流量
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

# 添加 k8s 的 apt 仓库(官方镜像太慢,这里换成了阿里云的镜像)
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

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

# 查看版本
kubeadm version
# kubeadm version: &version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.2", GitCommit:"8b5a19147530eaac9476b0ab82980b4088bbc1b2", GitTreeState:"clean", BuildDate:"2021-09-15T21:37:34Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"linux/arm64"}

3 使用 kubeadm 创建集群

这一步会遇到很多网络问题,出现问题也比较多,所以需要耐心一点。

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# 官方 repo 无法访问,我们先把需要镜像找到,手动从第三方仓库中下载
# 查看需要下载镜像
sudo kubeadm config images list
# k8s.gcr.io/kube-apiserver:v1.22.2
# k8s.gcr.io/kube-controller-manager:v1.22.2
# k8s.gcr.io/kube-scheduler:v1.22.2
# k8s.gcr.io/kube-proxy:v1.22.2
# k8s.gcr.io/pause:3.5
# k8s.gcr.io/etcd:3.5.0-0
# k8s.gcr.io/coredns/coredns:v1.8.4

# 创建脚本
vi get_k8s_config_images.sh
# 添加下方内容,images 中镜像名称来自上文的命令
# images=(
# kube-apiserver:v1.22.2
# kube-controller-manager:v1.22.2
# kube-scheduler:v1.22.2
# kube-proxy:v1.22.2
# pause:3.5
# etcd:3.5.0-0
# coredns:v1.8.4
# )

# for imageName in ${images[@]}
# do
# sudo docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
# sudo docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
# done

# 运行脚本,开始下载
bash get_k8s_config_images.sh

# 现在可以开始真正的安装(手动保存一下 kubeadm join 的命令,在最后会提示出来)
sudo kubeadm init

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

# 初始化完成后,看下 node 有没有正常运行
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# server1 NotReady control-plane,master 20m v1.22.2
# STATUS: NotReady 说明并没有成功

# 意外总是眷顾着我,通过 describe 命令看下具体原因
kubectl describe node server1
Ready False Mon, 20 Sep 2021 01:22:22 +0800 Mon, 20 Sep 2021 01:01:25 +0800 KubeletNotReady container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
# 原因是还未部署任何网络插件

# 部署网络插件,以 Weave 为例
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

# 过一分钟后,再看下 node
NAME STATUS ROLES AGE VERSION
server1 Ready control-plane,master 22m v1.22.2
# 成功!

现在我们已经完成了第一个主节点的部署,接下来只要把剩余节点加入进来,整个集群就搭建完成了!

4 添加其他节点

另外两个节点也是一样的步骤,先安装 docker 和 kubeadm。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 这里不是 kubeadm init 而是 kubeadm join,这些会在前面 kubeadm init 执行完后打印出来
sudo kubeadm join 192.168.2.101:6443 --token xxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx

# 如果提示无法加入,则先需要重置再加入
sudo kubeadm reset
sudo kubeadm join 192.168.2.101:6443 --token xxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx

# 我现在已经把另外两个节点都加入进去了,我们来看下 node 的情况
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# server1 Ready control-plane,master 1h v1.22.2
# server2 Ready <none> 1h v1.22.2
# server3 Ready <none> 1h v1.22.2

# 可能出现的错误:
# The connection to the server localhost:8080 was refused - did you specify the right host or port?
# 需要把 server1 节点下面的 ~/.kube/config 文件复制到 server2 和 sever3 节点下面

现在,一个运行在树莓派上的 k8s 集群,就搭建完成了!🎉

除了 k8s 以外,你还可以选择 microk8sk3s 这样的 k8s 替代品,它们针对资源受限的设备进行了优化。

参考

🎈「k8s 探索」系列:

作者

Ailln

发布于

2021-08-03

更新于

2024-03-02

许可协议

评论