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