基础环境:

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:~#

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

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

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

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

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

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

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官网拉取镜像

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

应用这些设置

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是否正常

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是否正常

1
2
crictl version
# check version

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

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

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

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

9. 安装k8s

设置镜像源

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

更新证书

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

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

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记得自己划分)

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 

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

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这个集群即可

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