k8s新增Node节点 简单易上手 如何给k8s新添加node节点

发布于:2025-02-28 ⋅ 阅读:(14) ⋅ 点赞:(0)

1、集群环境初始化

机器数量: 1台、操作系统: CentosStream9 、分别设置主机名称为:no’de-3

[root@master app1]# kubectl get nodes
NAME     STATUS   ROLES           AGE     VERSION
node     Ready    control-plane   96d     v1.28.2
node-1   Ready    <none>          96d     v1.28.2
node-2   Ready    <none>          96d     v1.28.2

禁用开机启动防火墙和Selinux

# systemctl disable firewalld
# sed -i 's/SELINUX=permissive/SELINUX=disabled/' /etc/sysconfig/selinux
SELINUX=disabled

关闭Swap分区

Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。

​ 修改/etc/fstab文件,注释掉SWAP的自动挂载,使用free -m确认swap已经关闭。

[root@master /]# sed -i 's/.*swap.*/#&/' /etc/fstab
#/dev/mapper/centos-swap swap  swap   defaults     0 0

注意改完fstab先重启,再做下面的操作

2、安装和配置先决条件

在node3节点操作

2.1、转发 IPv4 并让 iptables 看到桥接流量

验证 br_netfilter 模块是否已加载

# lsmod | grep br_netfilter 

为了让 Linux 节点的 iptables 能够正确查看桥接流量,确认 sysctl 配置中的 net.bridge.bridge-nf-call-iptables 设置为 1。

# cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

# modprobe overlay
# modprobe br_netfilter

设置所需的 sysctl 参数,参数在重新启动后保持不变
# cat <<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 参数而不重新启动
# sysctl --system

3、容器运行时

安装 containerd

在node3节点操作

本文采用yum方式安装

获取阿里云docker yum源
# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

查看YUM源中Containerd软件
# yum list | grep containerd
containerd.io.x86_64    1.6.15-3.1.el9          docker-ce-stable

安装Containerd.io软件,即可安装Containerd
# yum -y install containerd.io

设置containerd服务启动及开机自启动
# systemctl enable containerd
# systemctl start containerd

验证可用性

安装Containerd后ctr命令即可使用,ctr命令主要用于管理容器及容器镜像等。
使用ctr命令查看Containerd客户端及服务端相关信息。
# ctr version
配置containerd

生成containerd配置文件

# 生成默认配置,config.toml这个文件二进制安装方式默认不存在,如果是Yum安装则直接覆盖
containerd config default > /etc/containerd/config.toml

修改sandbox_image 镜像源

修改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

配置containerd cgroup 驱动程序systemd

把SystemdCgroup = false修改为:SystemdCgroup = true,
# sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

Containerd配置镜像加速
endpoint位置添加阿里云的镜像源,https://yafixjtd.mirror.aliyuncs.com 这个地址是我自己阿里加速器地址,每个人都不一样

# vim /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://yafixjtd.mirror.aliyuncs.com" ,"https://registry-1.docker.io"]

配置crictl

因为ctr命令查看镜像非常混乱,可以用这个命令查看镜像

# cat <<EOF | tee /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

查看镜像
# crictl image list

需要稍等一下十分钟

重启containerd

# systemctl restart containerd

4、安装k8s套件

在node3节点操作

配置aliyun的yum源

# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安装kubeadm、kubelet 和 kubectl

# yum makecache
# yum install -y kubelet kubeadm kubectl ipvsadm ipset --disableexcludes=kubernetes
默认为最新版,对应最新版k8s
--disableexcludes=kubernetes 禁掉除了这个kubernetes之外的别的仓库

说明:如果想安装指定版本的kubeadmin
# yum install kubelet-1.28.2-0.x86_64 kubeadm-1.28.2-0.x86_64 kubectl-1.28.2-0.x86_64 ipvsadm ipset --disableexcludes=kubernetes -y 

查看版本
# kubectl version
# yum info kubeadm

启动kubelet
# systemctl enable --now kubelet
注意官方提示:kubelet 现在每隔几秒就会重启,因为它陷入了一个等待 kubeadm 指令的死循环。 在 crashloop 状态中等待 kubeadm 发布指令。crashloop 状态是正常现象。 初始化控制平面后,kubelet 将正常运行。

5、获取镜像

特别说明:

node-3节点下载

注意下载时把版本号修改到官方最新版,即使下载了最新版也可能版本不对应,需要按报错提示下载

每次部署都会有版本更新,具体版本要求,运行初始化过程失败会有版本提示

kubeadm的版本和镜像的版本最好是对应的

用命令查看版本当前kubeadm对应的k8s镜像版本

查看镜像
# kubeadm config images list --kubernetes-version v1.28.2
registry.k8s.io/kube-apiserver:v1.28.2
registry.k8s.io/kube-controller-manager:v1.28.2
registry.k8s.io/kube-scheduler:v1.28.2
registry.k8s.io/kube-proxy:v1.28.2
registry.k8s.io/pause:3.9
registry.k8s.io/etcd:3.5.9-0
registry.k8s.io/coredns/coredns:v1.10.1

查看国内镜像
# kubeadm config images list --kubernetes-version v1.28.2 --image-repository registry.aliyuncs.com/google_containers
registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2
registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/etcd:3.5.9-0
registry.aliyuncs.com/google_containers/coredns:v1.10.1

coredns如果下载不了可以通过docker pull coredns/coredns:v1.10.1从docker官方下载

下载镜像
# ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0
注意:必须用-n指定namespace,否则k8s和crictr都看不到镜像
下载下来的镜像名称不用重新修改,直接使用aliyun的镜像

[root@master ~]# cat pull.sh 
#!/bin/bash
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.2
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.2
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.2
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/kube-proxy:v1.28.2
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/pause:3.9
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/etcd:3.5.9-0
ctr -n=k8s.io image pull registry.aliyuncs.com/google_containers/coredns:v1.10.1

[root@node-3 ~]# bash pull.sh

[root@node-3 ~]# crictl image ls 
IMAGE                                                             TAG                 IMAGE ID            SIZE
registry.aliyuncs.com/google_containers/coredns                   v1.10.1             ead0a4a53df89       16.2MB
registry.aliyuncs.com/google_containers/etcd                      3.5.9-0             73deb9a3f7025       103MB
registry.aliyuncs.com/google_containers/kube-apiserver            v1.28.2             cdcab12b2dd16       34.7MB
registry.aliyuncs.com/google_containers/kube-controller-manager   v1.28.2             55f13c92defb1       33.4MB
registry.aliyuncs.com/google_containers/kube-proxy                v1.28.2             c120fed2beb84       24.6MB
registry.aliyuncs.com/google_containers/kube-scheduler            v1.28.2             7a5d9d67a13f6       18.8MB
registry.aliyuncs.com/google_containers/pause                     3.9                 e6f1816883972       322kB

下载flannel网络插件的镜像,与已经存在的集群节点使用的版本一样即可

[root@node-3 ~]# ctr -n=k8s.io image pull docker.io/flannel/flannel:v0.25.7
[root@node-3 ~]# ctr -n=k8s.io image pull docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2

[root@node-3 ~]# crictl image ls 
IMAGE                                                             TAG                 IMAGE ID            SIZE
docker.io/flannel/flannel-cni-plugin                              v1.5.1-flannel2     962fd97b50f9c       10.9MB
docker.io/flannel/flannel                                         v0.25.7             bc5476d21c449       83.9MB

6.master节点重新生成token

[root@master ~]# kubeadm token create --print-join-command
kubeadm join 192.168.209.131:6443 --token mi9eh2.i78xiyfr7x4aazof --discovery-token-ca-cert-hash sha256:f9d9a1d2f7ac029ee67f26d1d58719b89469f4271326b4350b826c4dd46df146

node3加入集群

[root@node-3 ~]# kubeadm join 192.168.209.131:6443 --token mi9eh2.i78xiyfr7x4aazof --discovery-token-ca-cert-hash sha256:f9d9a1d2f7ac029ee67f26d1d58719b89469f4271326b4350b826c4dd46df146

master节点检查

[root@master app1]# kubectl get nodes
NAME     STATUS   ROLES           AGE     VERSION
node     Ready    control-plane   96d     v1.28.2
node-1   Ready    <none>          96d     v1.28.2
node-2   Ready    <none>          96d     v1.28.2
node-3   Ready    <none>          3m52s   v1.28.2

到此完成