Ubuntu20搭建K8S集群环境-基于containerd
基础环境:
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 | cat >> /etc/sysctl.d/k8s.conf <<EOF |
root@master:~# sysctl --system
重新加载系统全部参数,或者使用sysctl -p亦可
4. 安装containerd
有多种安装方法,如下为命令行安装, 不建议, 容易出错
1 | apt-get update |
我们使用源码安装
首先安装containerd
1 | sudo wget https://github.com/containerd/containerd/releases/download/v1.6.8/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 | wget https://raw.githubusercontent.com/containerd/containerd/main/containerd.service |
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 | wget https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz |
此时应该会在/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 | mkdir -p /etc/containerd |
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 | 加载containerd的内核模块 |
8. 测试环节
测试containerd是否正常
1 | 又到了最爱的测试环节 |
测试crictl是否正常
1 | crictl version |
如果出现FATA[0000]…rpc error的错, 是镜像服务拉取失败
(或者是科学上网失败,可以ping一下Google试试)
请删除config.toml的阿里镜像源, 然后开启科学上网
然后执行如下
1 | systemctl daemon-reload && systemctl enable --now containerd |
如果还是不行,重启虚拟机,卸载并重新安装containerd
1 | sudo apt-get remove containerd |
9. 安装k8s
设置镜像源
1 | apt-get update |
在文件末尾加入以下内容
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 | apt-cache madison kubeadm |
到这里,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 | kubeadm init \ |
最后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 | mkdir -p $HOME/.kube |
然后复制上面的join信息, 进入node节点, join这个集群即可
1 | kubeadm join 192.168.111.10:6443 --token nrefdp.2mtcwkkshizkj1qa \ |
此时集群就搭建好了, 等待后续的安装插件和启动容器服务即可
参考文章:
https://blog.csdn.net/MssGuo/article/details/128149704