k8s-1.25.4部署笔记(containerd)
背景
本次我们部署1.25.4最新版本,Kubernetes实践-部署 18年的笔记作为参考。不同之处大概就是docker换成了containerd.
前期准备(所有节点)
Host | Ip | Description |
---|---|---|
k8s | 10.8.111.200 | CentOS7 模板机,用于克隆下面几个节点 |
k8s-master1 | 10.8.111.202 | CentOS7 |
k8s-node1 | 10.8.111.203 | CentOS7 |
k8s-node2 | 10.8.111.204 | CentOS7 |
本次搭建采用虚拟机,先制作了一个k8s的虚拟机,完成了所有节点都要操作的内容,然后进行克隆3台进行修改,分别配置每台需要操作的内容
每台服务器修改静态ip
1 | vi /etc/sysconfig/network-scripts/ifcfg-ensXXX |
模板机
1 | ONBOOT="yes" |
各节点根据各自ip规划
1 | systemctl restart network |
修改主机名和配置 hosts
1 | # 在10.8.111.200执行 |
配置 hosts
1 | 10.8.111.200 k8s |
升级操作系统内核
1 | # 导入elrepo gpg key |
ipvs 设置
1 |
|
时间同步
1 | yum install chrony -y |
关闭防火墙
1 | systemctl stop firewalld |
关闭 swap
1 | # 临时关闭;关闭swap主要是为了性能考虑 |
禁用 SELinux
1 | # 临时关闭 |
允许 iptables 检查桥接流量
为了让 Linux 节点的 iptables 能够正确查看桥接流量,请确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。例如:
1 | cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf |
装容器 containerd(所有节点)
安装 containerd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
sudo yum install -y yum-utils
sudo yum-config-manager \才
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 或
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
sudo yum install containerd.io -y
systemctl enable containerd
systemctl start containerd配置containerd,修改sandbox_image 镜像源
1
2
3
4
5
6
7
8
9
10
11# 导出默认配置,config.toml这个文件默认是不存在的
containerd config default > /etc/containerd/config.toml
# 修改前检查
grep sandbox_image /etc/containerd/config.toml
# 修改sandbox_image 镜像源,1.24以下k8s.gcr.io 、1.25 改成了registry.k8s.io
sed -i "s#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g" /etc/containerd/config.toml
# 修改后检查
grep sandbox_image /etc/containerd/config.toml配置containerd cgroup 驱动程序systemd
kubernets自v1.24.0后,就不再使用docker.shim,替换采用containerd作为容器运行时端点
1
2# 把SystemdCgroup = false修改为:SystemdCgroup = true,
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.tomlContainerd配置镜像加速
endpoint位置添加阿里云的镜像源1
2
3
4
5$ vi /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".registry]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://xxxxxxxx.mirror.aliyuncs.com" ,"https://registry-1.docker.io"]重启 containerd
1
2
3systemctl daemon-reload
systemctl enable --now containerd
systemctl restart containerd
配置 k8s yum 源(所有节点)
1 | cat > /etc/yum.repos.d/kubernetes.repo << EOF |
Kubernetes 安装
开始安装kubeadm,kubelet和kubectl (master节点)
1 | # 不指定版本就是最新版本,当前最新版就是1.25.4 |
查看日志,发现有报错,报错如下:
1 | Nov 30 06:02:22 k8s-200 kubelet[1922]: E1130 06:02:22.353853 1922 run.go:74] "command failed" err="failed to load kubelet config file, error: failed to load Kubelet config |
解释:未经过 kubeadm init 或者 kubeadm join 后,kubelet 会不断重启,这个是正常现象……,执行 init 或 join 后问题会自动解决,对此官网有如下描述,也就是此时不用理会 kubelet.service。
查看版本
1 | kubectl version |
查看 Kubernetes 初始化所需镜像
1 | kubeadm config images list --kubernetes-version v1.25.4 |
集群初始化
1 | kubeadm init \ |
–image-repository
string: 这个用于指定从什么位置来拉取镜像(1.13版本才有的),默认值是k8s.gcr.io,我们将其指定为国内镜像地址:registry.aliyuncs.com/google_containers
–kubernetes-version
string: 指定kubenets版本号,默认值是stable-1,会导致从https://dl.k8s.io/release/stable-1.txt
下载最新的版本号,我们可以将其指定为固定版本(v1.25.4)来跳过网络请求。–apiserver-advertise-address
指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface,建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。这里的ip为master节点ip,记得更换。–pod-network-cidr
指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 –pod-network-cidr有自己的要求,这里设置为10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。--control-plane-endpoint
cluster-endpoint 是映射到该 IP 的自定义 DNS 名称,这里配置hosts映射:10.8.111.202 cluster-endpoint。 这将允许你将–control-plane-endpoint=cluster-endpoint 传递给 kubeadm init,并将相同的 DNS 名称传递给 kubeadm join。 稍后你可以修改 cluster-endpoint 以指向高可用性方案中的负载均衡器的地址。--service-cidr
集群内部虚拟网络,Pod统一访问入口【温馨提示】kubeadm 不支持将没有 –control-plane-endpoint 参数的单个控制平面集群转换为高可用性集群
重置再初始化
1 | kubeadm reset |
成功后
1 | Your Kubernetes control-plane has initialized successfully! |
根据成功后的提示,做kubectl认证,配置环境变量
1 | mkdir -p $HOME/.kube |
发现节点还是有问题,查看日志 cat /var/log/messages
,因为没有安装网络插件
“Container runtime network not ready” networkReady=”NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized”
我们先让node加入进来集群,然后安装 Pod 网络插件
node 节点加入 k8s 集群
Host | Ip | Description |
---|---|---|
k8s | 10.8.111.200 | CentOS7 模板机,用于克隆下面几个节点 |
k8s-master1 | 10.8.111.202 | CentOS7 |
k8s-node1 | 10.8.111.203 | CentOS7 |
k8s-node2 | 10.8.111.204 | CentOS7 |
我们分别将k8s-node1
、k8s-node2
部署加入集群
先安装 kubelet
1 | yum install -y kubelet-1.25.4 kubeadm-1.25.4 kubectl-1.25.4 --disableexcludes=kubernetes |
加入集群
1 | kubeadm join cluster-endpoint:6443 --token 2gaeoh.fq98xja5pkj7n98g \ |
如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:
1 | kubeadm token list |
默认情况下,令牌会在24小时后过期。如果要在当前令牌过期后将节点加入集群, 则可以通过在控制平面节点上运行以下命令来创建新令牌:
1 | kubeadm token create |
如果你没有 –discovery-token-ca-cert-hash 的值,则可以通过在控制平面节点上执行以下命令链来获取它:
1 | openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' |
如果执行 kubeadm init 时没有记录下加入集群的命令,可以通过以下命令重新创建(推荐)一般不用上面的分别获取 token 和 ca-cert-hash 方式,执行以下命令一气呵成:
1 | kubeadm token create --print-join-command |
查看节点:
1 | kubectl get pod -n kube-system |
安装 Pod 网络插件
你必须部署一个基于 Pod 网络插件的 容器网络接口 (CNI),以便你的 Pod 可以相互通信。
Flannel
一般来说,在初期使用Flannel是一个稳妥安全的选择,直到你开始需要一些它无法提供的东西。
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
1 | kubectl apply -f kube-flannel.yml |
因为墙原因,应该是会安装失败,我们可以ctr image pull
将镜像拉下来先,
1 | ctr image pull docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0 |
或者ctr image import
导入准备好的离线文件。
Calico
Calico是一个纯三层的数据中心网络方案,Calico支持广泛的平台,包括Kubernetes、OpenStack等。
Calico 在每一个计算节点利用 Linux Kernel 实现了一个高效的虚拟路由器( vRouter) 来负责数据转发,而每个 vRouter 通过 BGP 协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络内传播。
此外,Calico 项目还实现了 Kubernetes 网络策略,提供ACL功能。
1.下载Calico
wget https://docs.projectcalico.org/manifests/calico.yaml --no-check-certificate
vim calico.yaml
1 | - name: CALICO_IPV4POOL_CIDR |
1 | kubectl apply -f calico.yaml |
问题
问题:
1 | Warning FailedScheduling 80s (x13 over 61m) default-scheduler 0/1 nodes are available: 1 node(s) had untolerated taint {node.kubernetes.io/not-ready: }. preemption: 0/1 nodes are available: 1 Preemption is not helpful for scheduling. |
使用kubeadm初始化的集群,出于安全考虑Pod不会被调度到Master Node上,不参与工作负载。允许master节点部署pod即可解决问题,命令如下:
1 | kubectl taint nodes --all node-role.kubernetes.io/master- |
实际加入node节点即解决了。不建议只有master
退出集群重新加入
master节点
注意:以下操作都是在master下操作。
一:先将节点设置为维护模式(k8s-node1是节点名称)
1 | kubectl drain k8s-node1 --delete-local-data --force --ignore-daemonsets node/k8s-node1 |
二:删除节点
1 | kubectl delete node k8s-node1 |
三:确认是否已经删除
1 | kubectl get nodes |
三:生成永久Token(node加入的时候会用到)
1 | kubeadm token create --ttl 0 --print-join-command |
四:查看Token确认
1 | kubeadm token list |
node重新加入
注意:以下操作在node下操作
一:停掉kubelet
1 | systemctl stop kubelet |
二:删除之前的相关文件
1 | rm -rf /etc/kubernetes/* |
三:加入集群
1 | kubeadm join 192.168.233.3:6443 --token rpi151.qx3660ytx2ixq8jk --discovery-token-ca-cert-hash sha256:5cf4e801c903257b50523af245f2af16a88e78dc00be3f2acc154491ad4f32a4 |
相关链接
保姆级 Kubernetes 1.24 高可用集群部署中文指南
【云原生】K8S master节点更换IP以及master高可用故障模拟测试