Kubeadm+Containerd部署k8s(v1.28.2)集群(非高可用版)
文章目录
一.环境准备
1.服务器准备
服务器信息(此处为同一运营商的服务器,并且处于同一网络组中)如本地搭建的服务器则需要保证在同一内网中,且最好关闭防火墙。
角色 | 主机名称 | IP | Kubernetes版本 |
---|---|---|---|
master | k8s-master1 | 192.168.0.2 | v1.28.2 |
node1 | k8s-node1 | 192.168.0.3 | v1.28.2 |
node2 | k8s-node2 | 192.168.0.4 | v1.28.2 |
为什么要用Containerd?
1.Docker Engine 没有实现 CRI, 而这是容器运行时在 Kubernetes 中工作所需要的。 为此,必须安装一个额外的服务 cri-dockerd。 cri-dockerd 是一个基于传统的内置 Docker 引擎支持的项目, 它在 1.24 版本从 kubelet 中移除。
2.不直接兼容 CRI:Docker 使用自己的运行时逻辑,与 Kubernetes的 CRI 不完全兼容。
3.性能和复杂性:Docker 包含许多 Kubernetes 不需要的额外功能(如镜像构建、CLI 工具),相比专注的运行时(如 CRI-O 或 Containerd)更重。
4.Containerd 是一个通用容器运行时,是 Docker 的核心组件之一,后来独立成为一个开源项目。它同样支持 Kubernetes,通过 CRI 插件(cri-Containerd)与 Kubernetes 集成.且被被广泛应用于生产环境(如 AWS EKS、Google GKE)
2.环境配置
确保每个节点上的MAC
地址和product_uuid
的唯一性,因为某些虚拟机的地址可能会重复。
shell
#查看MAC地址命令
ip link
#校验product_uuid
sudo cat /sys/class/dmi/id/product_uuid
如图,eth0
网卡下的,link/ether
后面的就是Mac地址。
此处输出的就是product_uuid
3.设置主机名
根据机器的规划,分布设置三台主机名为k8s-master1、k8s-node1和k8s-node2。
shell
#修改配置文件方式,
vi /etc/hostname
##文件内容为:k8s-master1或k8s-node1
#命令行方式,临时修改
# 设置 master 主机名
hostnamectl set-hostname k8s-master1 && bash
# 设置 worker 主机名
hostnamectl set-hostname k8s-node1 && bash
hostnamectl set-hostname k8s-node2 && bash
4.修改国内镜像源地址
改为华为的镜像源为例子
-
备份镜像源文件
shellsudo cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
-
修改sources.list 文件,将http://archive.ubuntu.com 和http://security.ubuntu.com 替换成http://repo.huaweicloud.com
shellsudo sed -i "s@http://.*archive.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list sudo sed -i "s@http://.*security.ubuntu.com@http://repo.huaweicloud.com@g" /etc/apt/sources.list
5.配置时间同步
采用ntpdate
命令进行时间校对,设置Crontab定时任务进行定时校对。
shell
#设置时区
timedatectl set-timezone Asia/Shanghai
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
#执行命令查看时区是否修改
timedatectl status
#安装工具
sudo apt install ntpdate
#配置Crontab定时任务
crontab -e
#添加如下内容: 0 */1 * * * ntpdate time1.aliyun.com
6.配置内核转发及网桥过滤
- 添加配置文件
shell
cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
-
加载模块
shellmodprobe overlay modprobe br_netfilter
-
添加网桥过滤及内核转发配置文件
shellcat <<EOF | tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF #然后执行 sysctl -p /etc/sysctl.d/k8s.conf
如果上述配置执行之后,执行
sysctl net.ipv4.ip_forward
输出和下图不一致。则需手动执行sysctl -w net.ipv4.ip_forward=1
-
安装Ipset及ipvsadm
shellsudo apt -y install ipset ipvsadm
-
配置ipvsadm模块,添加需要添加的模块
shellcat << EOF | tee /etc/modules-load.d/ipvs.conf ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack EOF
-
加载模块脚本
shellcat << EOF | tee ipvs.sh > /dev/null && chmod +x ipvs.sh modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack EOF ./ipvs.sh
-
关闭swap分区
swapoff -a #临时关闭
编辑
/etc/fstab
,注释如下类似的内容,重启系统并验证。如果已经关闭那么该命令不会有输出。sudo swapon --show
二.容器运行时Containerd安装(所有节点)
1.apt源安装
shell
#更新系统源
apt update
#安装必须包
apt install -y apt-transport-https ca-certificates curl software-properties-common
#添加 Docker 官方的 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
#更新包的索引
sudo apt update
#查看可安装的Containerd版本
apt-cache madison containerd.io
shell
#默认下载最新版
apt-get install containerd.io
#下载指定版本
apt-get install containerd.io=1.7.24-1
#本次安装的是1.7.24-1
为了保证环境稳定,建议锁定containerd
的版本
shell
#锁定版本
apt-mark hold containerd.io
#后续升级的解锁命令
apt-mark unhold containerd.io
配置 containerd
shell
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
#启动和设置开机自启动
systemctl start containerd && systemctl enable containerd
验证安装
systemctl status containerd
2.二进制安装文件方法
下载地址,获取Containerd的二进制版本。如下图:
通过下面的命令进行解压
shell
tar -xf cri-containerd-1.7.12-linux-amd64.tar.gz -C /
执行该命令后,这些文件和目录会被解压到根目录 / 下,并且解压后的文件会按原有的结构放置。
配置 containerd,通过以命令生成Containerd的配置文件
shell
mkdir /etc/containerd
containerd config default > /etc/containerd/config.toml
#启动和设置开机自启动
systemctl start containerd && systemctl enable containerd
3.配置Containerd镜像加速等
修改 /etc/containerd/config.toml
- 第67行
sandbox_image
的内容,从原来的registry.k8s.io/pause:3.8
修改成registry.aliyuncs.com/google_containers/pause:3.9
- 第139行
SystemdCgroup
的内容,从原来的false
改成true
。- 第162行
plugins."io.containerd.grpc.v1.cri".registry
下方的config_path
,修改为config_path = "/etc/containerd/certs.d"
- 如图:
创建相应的目录并配置加速文件
shell
#创建目录
mkdir /etc/containerd/certs.d/docker.io -pv
#配置加速文件
cat > /etc/containerd/certs.d/docker.io/hosts.toml << EOF
server = "https://docker.io"
[host."https://x46sxvnb.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
EOF
#重启containerd
systemctl restart containerd.service
注意:
shell# 所有节点都操作 cat <<EOF|tee /etc/crictl.yaml runtime-endpoint: unix:///run/containerd/containerd.sock EOF
三.K8S集群部署
1.集群软件的apt源准备
此处使用使用阿里云镜像源:
shell
#添加镜像源
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
#添加密钥
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
#更新源
apt-get update
2.K8S集群软件的安装
查看可以安装的软件列表
shell
apt-cache madison kubeadm
可以看到最新的版本是1.28.2,此处选择安装的版本是1.28.2,可自行选择。
shell
apt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00 kubectl=1.28.2-00
node节点上可以不用安装kubectl
shellapt-get install -y kubelet=1.28.2-00 kubeadm=1.28.2-00
启动kueblet,并设置开机自启动。
shell
systemctl enable --now kubelet
为求稳定,通过以下命令进行锁定定版本。
shell
apt-mark hold kubelet kubeadm kubectl
3.K8S集群初始化
shell
#创建文件夹
mkdir -p /home/k8s/init/
#生成默认配置文件
kubeadm config print init-defaults > /home/k8s/init/kubeadm-init.yaml
修改文件的一些参数:
yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.0.2 #master IP地址
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
name: k8s-master1 #master节点主机名称
taints: null
---
apiServer:
certSANs:
- 192.168.0.2
- 101.126.148.74
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers #修改镜像源
kind: ClusterConfiguration
kubernetesVersion: 1.28.2 #修版本信息
networking:
dnsDomain: cluster.local
serviceSubnet: 10.244.0.0/12 #修改Service网段信息
podSubnet: 10.96.0.0/16 #添加Pod网段信息
scheduler: {}
通过以下命令列举出需要拉取的镜像:
shell
kubeadm config images list --config /home/k8s/init/kubeadm-init.yaml
通过下面命令进行拉取:
kubeadm config images pull --config /home/k8s/init/kubeadm-init.yaml
然后通过以下命令进行初始化:
shell
kubeadm init --config=/home/k8s/init/kubeadm-init.yaml --v=6
出现如下信息则证明初始化成功:
Then you can join any number of worker nodes byrunning the following on each as root:
kubeadm join 192.168.0.2:6443 --token abcdef.69123456789abcdef
然后按照上述的提示,进行如下的操作:
shell
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
执行完上述的命令,就可以通过kubectl进行查看k8s集群的状态信息。如下图:
此处需注意,因为一开始没有安装Calico等网络插件,节点状态应该是STATUS: NotReady
。
新节点加入到集群中,在节点上通过如下命令,获取加入集群的token值:
shell
kubeadm token create --print-join-command
直接在node节点执行:
shell
kubeadm join 192.168.0.2:6443 --token xqlsab.83s9nr4w0dfmls59 --discovery-token-ca-cert-hash sha256:dc1719de42513ce9f02ad8602932eff9fc0137261553a9d6209873df73b5352b
暂时未写如何添加另一个Master节点,此处涉及高可用配置。
执行后如图:
然后可以通过如下命令来排查节点插件的安装进程:
shell
kubectl get pod -n kube-system -o wide | grep k8s-node1
如果一直未启动成功可以用如下命令来排查:
shell
kubectl describe pod -n kube-system <PodID>
#或者
kubectl logs -f -n kube-system <PodID>
在节点上还可以通过crictl ps -a
命令来排查是否有pod启动。同理,在初始化的时候也可以这样排查。
crictl
是Containerd
的命令行工具。
4.K8S集群网络插件Calico部署
此处选用科学部署方式,拉取的镜像到自己的阿里云仓库。镜像地址如下:
yaml
registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-cni:v3.27.5
registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-node:v3.27.5
registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/calico-kube-controllers:v3.27.5
分别替换name: upgrade-ipam
,name: install-cni
,name: "mount-bpffs"
,name: calico-node
,name: calico-kube-controllers
这几处的镜像地址,然后执行以下命令安装:
shell
kubectl create -f calico.yml
calico
文件地址如下calico/manifests/calico.yaml at release-v3.27 · projectcalico/calico
执行完上述的命令后,即可完成calico的部署。如下:
可以看到每个节点都有Calico
的插件,然后稍等一会,node
节点就会变成Ready
:
四.部署应用测试集群是否安装成功
以部署一个Nginx应用为例,以下是一个简单的Nginx
部署的yaml
文件:
yaml
apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: Deployment #该配置的类型,我们使用的是 Deployment
metadata: #译名为元数据,即 Deployment 的一些基本属性和信息
name: nginx-deployment #Deployment 的名称
labels: #标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
app: nginx #为该Deployment设置key为app,value为nginx的标签
spec: #这是关于该Deployment的描述,可以理解为你期待该Deployment在k8s中如何使用
replicas: 1 #使用该Deployment创建一个应用程序实例
selector: #标签选择器,与上面的标签共同作用,目前不需要理解
matchLabels: #选择包含标签app:nginx的资源
app: nginx
template: #这是选择或创建的Pod的模板
metadata: #Pod的元数据
labels: #Pod的标签,上面的selector即选择包含标签app:nginx的Pod
app: nginx
spec: #期望Pod实现的功能(即在pod中部署)
containers: #生成container,与docker中的container是同一种
- name: nginx #container的名称
image: registry.cn-hangzhou.aliyuncs.com/docker_image-ljx/nginx:1.26.0 #使用镜像nginx:1.26.0创建container,该container默认80端口可访问
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service #Service 的名称
labels: #Service 自己的标签
app: nginx #为该 Service 设置 key 为 app,value 为 nginx 的标签
spec: #这是关于该 Service 的定义,描述了 Service 如何选择 Pod,如何被访问
selector: #标签选择器
app: nginx #选择包含标签 app:nginx 的 Pod
ports:
- name: nginx-port #端口的名字
protocol: TCP #协议类型 TCP/UDP
port: 80 #集群内的其他容器组可通过 80 端口访问 Service
nodePort: 32600 #通过任意节点的 32600 端口访问 Service
targetPort: 80 #将请求转发到匹配 Pod 的 80 端口
type: NodePort #Serive的类型,ClusterIP/NodePort/LoaderBalancer
上述的资源清单创建了两种类型一个Deployment
,一个Service
,然后执行命令部署:
shell
kubectl apply -f nginx.yaml
执行成功后,如下图:
然后通过node节点IP+32600的方式进行访问:
此处是云服务器所以用的外网IP