基础环境:

Ubuntu 20.04虚拟机*1

目标环境:

k8s 1.24.0 + containerd 1.6.8

在前面的文章里我们已经介绍了 EXSI 的 Ubuntu 虚拟机联网解决方案

在联网的前提下,这篇文章将介绍: 如何在 EXSI 上的 Ubuntu 虚拟机搭建 k8s+containerd 的环境. 当然,本地的 Ubuntu 虚拟机集群也适用

我们先在本地设置好一台虚拟机,然后传到 EXSI 复制为三台的集群 (master/node1/node2)

基本步骤如下

一。本地设置

首先在你的本地虚拟机上,用 Ubuntu 安装 k8s, 步骤如下

1. 安装 Ubuntu 虚拟机

通过 Ubuntu20 的镜像安装 Ubuntu 虚拟机,这里不赘述.

PS: 记得先安装 VMtool (推荐在 VMware 的虚拟网络适配器开启 NAT+DHCP,这样会在安装系统时自动安装 vmtool,避免折腾)
如果安装 VMtool 按钮是灰色,参考这里

成功安装系统之后,进入虚拟机,操作如下

1. 关闭防火墙

注意:本文默认执行命令的方式都是 root 用户

root@master:~# ufw status
ufw 查看当前的防火墙状态:inactive 状态是防火墙关闭状态 active 是开启状态。

root@master:~# ufw disable
关闭防火墙

2. 关闭 swap

root@master:~# swapoff -a
root@master:~# free -h
如下的 Swap 为 0 显示就成功了

              total        used        free      shared  buff/cache   available
Mem:           1.8G        280M        1.2G        9.6M        286M        1.4G
Swap:            0B          0B          0B

3. 将桥接的 IPv4 流量传递到 iptables 的链

创建 k8s.conf 文件
root@master:~# touch /etc/sysctl.d/k8s.conf

往 k8s.conf 文件添加内容
root@master:~#

shell
1
2
3
4
5
6
cat >> /etc/sysctl.d/k8s.conf <<EOF              
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
vm.swappiness=0
EOF

root@master:~# sysctl --system
重新加载系统全部参数,或者使用 sysctl -p 亦可

4. 安装 containerd

有多种安装方法,如下为命令行安装, 不建议,容易出错

shell
1
2
3
apt-get update
apt-get upgrade
apt-get install containerd.io

我们使用源码安装
首先安装 containerd

shell
1
2
sudo wget https://github.com/containerd/containerd/releases/download/v1.6.8/containerd-1.6.8-linux-amd64.tar.gz
tar Cxzvf /usr/local containerd-1.6.8-linux-amd64.tar.gz

解压到 /usr/local/bin 目录下,应该会出现如下这种

bin/containerd-shim-runc-v2
bin/containerd-shim
bin/ctr
bin/containerd-shim-runc-v1
bin/containerd
bin/containerd-stress

设置 containerd.service, 并且使用 systemcd 来管理 containerd

shell
1
2
3
4
5
wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service 
mv containerd.service /usr/lib/systemd/system/
systemctl daemon-reload && systemctl enable --now containerd
systemctl status containerd
#containerd应该会显示已经是running状态了

5. 安装 runc

runc 是容器运行时,runc 实现了容器的 init,run,create,ps… 我们在运行容器所需要的 cmd

sudo curl -LO https://github.com/opencontainers/runc/releases/download/v1.1.1/runc.amd64 && install -m 755 runc.amd64 /usr/local/sbin/runc

如果下载太慢,可以用下面这个镜像替代上面的命令
sudo curl -LO https://hub.gitmirror.com/https://github.com/opencontainers/runc/releases/download/v1.1.1/runc.amd64 && install -m 755 runc.amd64 /usr/local/sbin/runc

6. 安装 CNI plugins

sh
1
2
3
4
5
6
7
wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz
根据官网的安装步骤来,创建一个目录用于存放cni插件
mkdir -p /opt/cni/bin
解压
tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz

ls /opt/cni/bin

此时应该会在 /opt/cni/bin 目录下生成下面这样可执行文件,如下即成功

./macvlan
./static
./vlan
./portmap
./host-local
./vrf
./bridge
./tuning
./firewall
./host-device
./sbr
./loopback
./dhcp
./ptp
./ipvlan
./bandwidth

7. containerd 配置

先修改 containerd 的配置,因为 containerd 默认从 k8s 官网拉取镜像

sh
1
2
3
4
5
6
7
8
mkdir -p /etc/containerd                               
#创建一个目录用于存放containerd的配置文件

containerd config default | sudo tee /etc/containerd/config.toml
#把containerd配置导出到文件

vim /etc/containerd/config.toml
#修改配置文件

vim 打开并搜索如下 (vim 的搜索快捷键是 "/")

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
......
SystemdCgroup = true                                       

搜索 SystemdCgroup,把 false 改为 true

建议用官方 ctr 源,镜像源经常出岔子
没有科学上网的条件的话,就如下配置镜像源 (官方源的就不用配置了)

[plugins."io.containerd.grpc.v1.cri"]
..................................
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.2"         
搜索sandbox_image,
把原来的k8s.gcr.io/pause:3.6改为"registry.aliyuncs.com/google_containers/pause:3.2" 


[plugins."io.containerd.grpc.v1.cri".registry]
    config_path = "/etc/containerd/certs.d"                        
搜索config_path,配置镜像加速地址(这是一个还没创建的目录,下面会创建)

创建镜像加速的目录 
mkdir /etc/containerd/certs.d/docker.io -pv
配置加速
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://b9pmyelo.mirror.aliyuncs.com"]
  capabilities = ["pull", "resolve"]
EOF

应用这些设置

shell
1
2
3
4
5
6
7
8
9
10
11
12
13
#加载containerd的内核模块
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

#重启containerd
systemctl restart containerd
systemctl status containerd

8. 测试环节

测试 containerd 是否正常

shell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#又到了最爱的测试环节
#拉取镜像,测试containerd是否能创建和启动成功
ctr i pull docker.io/library/nginx:alpine
#能正常拉取镜像说明没啥问题
ctr images ls
#查看镜像
ctr c create --net-host docker.io/library/nginx:alpine nginx
#创建容器
ctr task start -d nginx
#启动容器,正常说明containerd没啥问题
ctr containers ls
#查看容器
ctr tasks kill -s SIGKILL nginx
#终止容器
ctr containers rm nginx
#删除容器

测试 crictl 是否正常

shell
1
2
crictl version
# check version

如果出现 FATA [0000]…rpc error 的错,是镜像服务拉取失败
(或者是科学上网失败,可以 ping 一下 Google 试试)
请删除 config.toml 的阿里镜像源,然后开启科学上网
然后执行如下

sh
1
2
3
4
5
systemctl daemon-reload && systemctl enable --now containerd
modprobe overlay
modprobe br_netfilter
systemctl restart containerd
crictl version

如果还是不行,重启虚拟机,卸载并重新安装 containerd

shell
1
2
3
4
sudo apt-get remove containerd
sudo apt-get purge containerd
# 然后请从第一步`首先安装containerd`
# 直到第三步`修改containerd的配置`,重新试试

9. 安装 k8s

设置镜像源

sh
1
2
3
4
5
apt-get update
apt-get upgrade
apt-get install -y apt-transport-https ca-certificates curl
# 编辑镜像源文件,加入阿里云k8s镜像源配置
vim /etc/apt/sources.list

在文件末尾加入以下内容

deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main

更新证书

sh
1
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add

然后在虚拟机上安装 kubeadm、kubelet
其实只需要在 master 节点上安装 kubectl(kubeadm 和 kubectl 都是命令行工具,kubelet 才是系统服务)
这里为了测试和上传省事,就在所有节点都安装了 kubectl

sh
1
2
3
4
5
6
7
8
apt-cache madison  kubeadm                        
#查看apt可获取的kubeadm版本,这里安装1.24.0版本,不指定版本的话默认安装最新版本
apt-get install -y kubelet=1.24.0-00 kubeadm=1.24.0-00
#在所有节点上安装kubeadm、kubelet、kubectl
apt-get install -y kubectl=1.24.0-00
#在master节点上安装kubectl即可
systemctl enable kubelet
#设置kubelet开机自启(后面kubeadm init初始化master时会自动拉起kubelet)

到这里,k8s 基本配置就结束了,可以通过如下命令测试是否安装成功
kubelet --version

然后我们将配置好的虚拟机上传到 EXSI 服务器 (如果在本地测试,复制成 3 台即可)
记得配置及测试网络,可能会因为他们的 IP 设置什么的冲突

二。设置 k8s 集群

初始化 master 节点的控制面板
root@master:~# kubeadm config images list

应该会有如下的显示

k8s.gcr.io/kube-apiserver:v1.24.8
k8s.gcr.io/kube-controller-manager:v1.24.8
k8s.gcr.io/kube-scheduler:v1.24.8
k8s.gcr.io/kube-proxy:v1.24.8
k8s.gcr.io/pause:3.7
k8s.gcr.io/etcd:3.5.3-0
k8s.gcr.io/coredns/coredns:v1.8.6

初始化 master (这里 IP 记得自己划分)

sh
1
2
3
4
5
6
kubeadm init \
--apiserver-advertise-address=192.168.111.10 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.24.0 \
--service-cidr=10.128.0.0/12 \
--pod-network-cidr=10.255.0.0/16

最后 kubeadm init 初始化成功,提示信息如下:

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/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.111.10:6443 --token nrefdp.2mtcwkkshizkj1qa \
  --discovery-token-ca-cert-hash sha256:564dbb8ec1993f3e38f3b757c324ad6190950156f30f89f7f7d4b244d2b29ec7 

我们根据输入的提示信息复制粘贴照着做即可

sh
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
export KUBECONFIG=/etc/kubernetes/admin.conf

然后复制上面的 join 信息 , 进入 node 节点,join 这个集群即可

sh
1
2
kubeadm join 192.168.111.10:6443 --token nrefdp.2mtcwkkshizkj1qa \
--discovery-token-ca-cert-hash sha256:564dbb8ec1993f3e38f3b757c324ad6190950156f30f89f7f7d4b244d2b29ec7

此时集群就搭建好了,等待后续的安装插件和启动容器服务即可

参考文章:
https://blog.csdn.net/MssGuo/article/details/128149704