官方文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/
https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

环境配置

该部分每个主机都要执行

如果你确定不需要某个特定设置,则可以跳过它。

设置root登录

sudo passwd root
sudo vim /etc/ssh/sshd_config
PermitRootLogin yes # 添加
sudo systemctl restart sshd.service

关闭防火墙

sudo ufw status  (inactive 关闭的)
ufw enable | disable	#启动、关闭防火墙
ufw disable  (关闭防火墙)

关闭虚拟交换

swapoff -a  
vim /etc/fstab (注释fstab中swap配置)  
#/swap.img      none    swap    sw      0       0  
或者 sed -ri 's/.*swap.*/#&/' /etc/fstab

关闭SELinux 关闭安全机制

getenforce

某些ubuntu版本,没有安装selinux,则可以不用配置

setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config 

修改主机名

 hostnamectl set-hostname {k8s-m|k8s-node1|k8s-node2}

配置多台主机 hosts

vim /etc/hosts
10.120.10.190   k8s-master
10.120.10.191   k8s-node1
10.120.10.192   k8s-node2

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

载入如下内核模块,

sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

配置下面的网络参数 设置所需的 sysctl 参数,参数在重新启动后保持不变:

sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF

应用 sysctl 参数而不重新启动

sudo sysctl --system

通过运行以下指令确认 br_netfilter 和 overlay 模块被加载:

lsmod | grep br_netfilter
lsmod | grep overlay

通过运行以下指令确认 net.bridge.bridge-nf-call-iptables、net.bridge.bridge-nf-call-ip6tables 和 net.ipv4.ip_forward 系统变量在你的 sysctl 配置中被设置为 1:

sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

容器运行时

该部分每个主机都要执行

本文容器运行时用containerd,如果机子上有docker,containerd已经默认安装,不在需要安装。

安装containerd:

可以安装docker-ce的方式,安装包的时候只执行:sudo apt install -y containerd.io 参考博文 docker安装

步骤一:设置 Docker 的apt存储库。步骤二:执行 sudo apt install -y containerd.io

sudo apt install -y containerd.io
systemctl status containerd

配置containerd

1、生成默认配置

containerd config default > /etc/containerd/config.toml

如果 -bash: /etc/containerd/config.toml: No such file or directory 就mkdir /etc/containerd/

2、修改CgroupDriver为systemd

k8s官方推荐使用systemd类型的CgroupDriver。

vim /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

也可以直接用命令修改:

sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml

如果你从软件包(例如,RPM 或者 .deb)中安装 containerd,你可能会发现其中默认禁止了 CRI 集成插件。

你需要启用 CRI 支持才能在 Kubernetes 集群中使用 containerd。 要确保 cri 没有出现在
/etc/containerd/config.toml 文件中 disabled_plugins列表内。如果你更改了这个文件,也请记得要重启 containerd。
可以执行:sed -i -r ‘/cri/s/(.*)/#\1/’ /etc/containerd/config.toml
如果你在初次安装集群后或安装 CNI 后遇到容器崩溃循环,则随软件包提供的 containerd 配置可能包含不兼容的配置参数。考虑按照
getting-started.md 中指定的 containerd config default >
/etc/containerd/config.toml 重置 containerd 配置,然后相应地设置上述配置参数。

3、重载沙箱(pause)镜像

正常情况下,国内你是拉取不到registry.k8s.io/pause:3.8镜像的,这个镜像是一切的pod的基础,要么自己手动导入进来,要么改成国内的镜像,通过设置以下配置来覆盖默认的沙盒镜像:
在你的 containerd 配置中, 你可以通过设置以下选项重载沙箱镜像:

[plugins."io.containerd.grpc.v1.cri"]
  sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"

可以直接用命令:

sudo sed -i 's/sandbox_image = ".*"/sandbox_image = "registry.aliyuncs.com\/google_containers\/pause:3.9"/' /etc/containerd/config.toml

4、重启containerd

systemctl restart containerd

安装 kubeadm、kubelet 和 kubectl

每个机器都执行

更新 apt 包索引并安装使用 Kubernetes apt 仓库所需要的包:

sudo apt-get update
# apt-transport-https 可能是一个虚拟包(dummy package);如果是的话,你可以跳过安装这个包
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

下载签名秘钥及添加apt仓库

curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.31/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/ /" |
    tee /etc/apt/sources.list.d/kubernetes.list

如果是国外机器,可以按照官方的方式:

# 如果 `/etc/apt/keyrings` 目录不存在,则应在 curl 命令之前创建它,请阅读下面的注释。
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.31/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

# 此操作会覆盖 /etc/apt/sources.list.d/kubernetes.list 中现存的所有配置。
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.31/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list

在k8s-master上:

更新 apt 包索引,安装 kubelet、kubeadm 和 kubectl,并锁定其版本:

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

用 kubeadm 初始化集群

# 初始化集群控制台 Control plane
# 失败了可以用 kubeadm reset 重置
kubeadm init --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16

# 记得把 kubeadm join xxx 保存起来 你需要此命令将节点加入集群。
# 忘记了重新获取:kubeadm token create --print-join-command

#要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init 输出的一部分:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

–kubernetes-version 指定版本
–apiserver-advertise-address 为通告给其它组件的IP,一般应为master节点的IP地址
–service-cidr 指定service网络,不能和node网络冲突
–pod-network-cidr 指定pod网络,不能和node网络、service网络冲突
–image-repository registry.aliyuncs.com/google_containers 指定镜像源,由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。如果k8s版本比较新,可能阿里云没有对应的镜像,就需要自己从其它地方获取镜像了。
–control-plane-endpoint 标志应该被设置成负载均衡器的地址或 DNS 和端口(可选)

查看集群是否处于健康状态:

kubectl get cs

如果遇到错误的情况,可使用 kubeadm reset 重置,然后重启主机,再次进行 初始化。

  kubectl get node    #查看集群节点状态
  kubectl get ns     #查看命名空间
  kubectl get pods -n kube-system   #查看pod状态 -n 指定命名空间

在master节点配置pod网络

在master上执行kubectl get nodes发现状态是NotReady,因为还没有部署CNI网络插件,在k8s系统上Pod网络的实现依赖于第三方插件进行,这类插件有近数十种之多,较为著名的有flannel、calico、canal和kube-router等。

安装 flannel:

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#如果不行 就:
wget https://mirror.ghproxy.com/https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

kube-flannel.yml 的Network,要和 pod-network-cidr保持一致 ,这里不用修改了
在这里插入图片描述

等一会再看 kubectl get node 变成Ready了

在各个slave上:

node节点无需安装 kubectl 客户端工具。

安装包

sudo apt-get install -y kubelet kubeadm

加入集群

命令是上面在master上执行 kubeadm init时生成的

kubeadm join 192.168.0.21:6443 --token zle96a.xd9dlgl8l784sztm --discovery-token-ca-cert-hash sha256:7443840d39139b48f64c948c54cd926b3f9818d7bf07dcb74ce9f31126b0a668

在这里插入图片描述
在master上查看:
在这里插入图片描述

20240913更新 kubernetes更新

master节点服务器今天被重置了,在maser上重新安装了所有必要的Kubernetes组件(如kubelet、kubeadm、kubectl)在从节点上首先,您需要重置这个节点,以便它可以重新加入新的集群

sudo kubeadm reset

删除旧的Kubernetes配置文件:

sudo rm -rf /etc/kubernetes/
sudo rm -rf ~/.kube/

重新加入集群:

使用在主节点初始化时得到的加入命令,让子节点重新加入集群。这个命令通常看起来像这样:

sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>

请保持每个机器的主机名不一致,不然会报错:

error execution phase kubelet-start: a Node with name "ubuntu" and status "Ready" already exists in the cluster. You must delete the existing Node or change the name of this new joining Node
To see the stack trace of this error execute with --v=5 or higher

自己点加入之后,发现子节点版本(v1.31.1)和主节点(v1.28.2)不一致,可以升级子节点Kubernetes 版本:

虽然 Kubernetes 升级通常不会影响数据,但为了安全起见,建议提前备份数据(例如 ETCD 数据)和配置文件。

检查可用的Kubernetes版本:

root@k8s-node1:~# apt-cache madison kubeadm
   kubeadm | 1.28.14-2.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.13-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.12-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.11-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.10-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.9-2.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.8-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.7-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.6-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.5-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.4-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.3-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.2-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.1-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages
   kubeadm | 1.28.0-1.1 | https://pkgs.k8s.io/core:/stable:/v1.28/deb  Packages

发现没有最新版本

root@k8s-node1:~# apt-get install -y kubeadm=1.31.1
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Package kubeadm is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Version '1.31.1' for 'kubeadm' was not found

这里就需要按照安装k8s的方法,从新下载签名秘钥及添加apt仓库,以及 更新 apt 包索引 跳转过去
在这里插入图片描述

然后在执行apt-get update
在查看:

root@k8s-node1:/etc/apt/sources.list.d# apt-cache madison kubeadm
   kubeadm | 1.31.1-1.1 | https://pkgs.k8s.io/core:/stable:/v1.31/deb  Packages
   kubeadm | 1.31.0-1.1 | https://pkgs.k8s.io/core:/stable:/v1.31/deb  Packages
root@k8s-node1:/etc/apt/sources.list.d# 

更新kubeadm和 kubelet。

apt-get install -y kubeadm
apt-get install -y kubelet

查看版本

root@k8s-node1:/etc/apt/sources.list.d# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"31", GitVersion:"v1.31.1", GitCommit:"948afe5ca072329a73c8e79ed5938717a5cb3d21", GitTreeState:"clean", BuildDate:"2024-09-11T21:26:49Z", GoVersion:"go1.22.6", Compiler:"gc", Platform:"linux/amd64"}
root@k8s-node1:/etc/apt/sources.list.d# kubelet --version
Kubernetes v1.31.1

去master查看

root@k8s-master:/opt/k8s# kubectl get node
NAME        STATUS   ROLES           AGE     VERSION
k8s-node1   Ready    <none>          87m     v1.31.1
ubuntu      Ready    control-plane   4h21m   v1.31.1

从节点是否需要安装kubelet和kubectl?

1. kubelet(必选)

  • kubelet 是 Kubernetes 集群中每个节点上的关键组件,它负责:

    • 监听主节点的指令(通过 API Server),确保容器运行在节点上。
    • 根据 pod 规范(PodSpec)启动和停止容器。
    • 监控容器的健康状况,并确保其与期望状态一致。

    在从节点上,kubelet 必须安装并保持运行,这样节点才能加入集群,并能够接受主节点的管理任务。

2. kubectl(可选)

  • kubectl 是 Kubernetes 的命令行工具,用来和 Kubernetes API Server 进行交互,管理集群资源(如部署、pod 等)。
    • 在从节点上,kubectl 不是必须的。如果你不在从节点上直接运行 Kubernetes 命令,你可以选择不安装 kubectl
    • 但如果你希望在从节点上使用 kubectl 进行一些调试操作(如查看 pod、查看节点状态等),那就需要安装 kubectl

安装建议

  • kubelet:从节点必须安装,这是 Kubernetes 的核心组件,用于与主节点通信,管理 pod 和容器。
  • kubectl:不强制要求在从节点上安装,但可以根据需要安装,以方便调试和管理。
  • kubeadm:推荐安装(用于集群操作和管理)kubeadm 用于初始化集群和加入节点。在从节点上,它用于将节点加入到集群中。在初始设置后,可以保留 kubeadm 以便将来升级,但它不是节点正常运行所必需的。

总结来说,从节点必须安装 kubelet,而 kubectl 是可选的工具。如果你只在主节点或其他管理终端上操作 Kubernetes,kubectl 可以不在从节点上安装。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐