部署k8s集群建议将集群内部做解析,关闭swap分区:swapoff -a(临时关闭),使用的docker容器部署,所有节点准备好docker-ce。节点建议都给到4G内存,所有主机时间一定要同步。

在部署 Kubernetes 集群时,关闭 swap 分区是一种常见的做法,原因如下:

  1. 性能考虑:Swap 分区是一种虚拟内存机制,它将内存中不常用的数据写入到硬盘上,以释放内存供其他程序使用。但是,硬盘访问速度远慢于内存访问速度,因此使用 Swap 分区可能导致性能下降。而 Kubernetes 是一个高度依赖内存的平台,关闭 Swap 分区可以确保所有的节点都能够充分利用内存,并提供更好的性能。

  2. 稳定性和可预测性:Kubernetes 的调度和资源管理算法是基于内存和 CPU 等资源来进行计算和决策的。如果节点上的进程开始使用 Swap 分区,内存的可用性变得不可预测,可能会导致资源不足的情况发生,从而影响集群的稳定性。

  3. 避免OOM(Out of Memory)问题:如果节点上的进程使用了过多的内存,并且 Swap 分区被打开,那么当系统内存不足时,操作系统会将内存中的数据写入到 Swap 分区中。然而,当 Swap 分区也被耗尽时,系统可能会因为无法再分配足够的内存而发生 OOM 错误,导致进程被杀死或节点异常。

因此,为了确保 Kubernetes 集群的性能、稳定性和可预测性,关闭 Swap 分区是一个推荐的做法

配置docker加速器,获取镜像优先从阿里,华为,网易拉取,下载速度更快

cat /etc/docker/daemon.json
{
        "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn", #优先从哪些网站获取镜像
                        "https://docker.m.daocloud.io",
                        "http://hub-mirrors.c.163.com"],
        "max-concurrent-downloads": 10, #设置最大并发下载数
        "log-driver": "json-file",
        "log-level": "warn",
        "data-root": "/var/lib/docker",
				"exec-opts": ["native.cgroupdriver=systemd"] #支持跨系统版本和更好的集成性能,这可以使Docker在启动时更稳定
}

全部节点开启路由转发

cat > /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
vm.swappiness = 0
EOF
sysctl -p /etc/sysctl.d/k8s.conf

加载br_netfilter模块

modprobe br_netfilter

所有节点下载ipvs,然后添加ipvs模块,通过脚本的方式

yum -y install ipset ipvsadm
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules #给执行权限

bash /etc/sysconfig/modules/ipvs.modules #执行脚本

lsmod | grep -e ip_vs -e nf_conntrack #查看是否成功,成功会如下

ipvsadm 是一个 Linux 内核中的 IP 负载均衡器,它通常用于基于网络层 (Layer 4) 的负载均衡。在 Kubernetes 中,ipvsadm 可以搭配 kube-proxy 进行服务发现和负载均衡。具体来说,kube-proxy 可以运行在三种模式下:userspace、iptables 和 ipvs。其中 iptables 和 ipvs 模式都是通过 Linux 内核提供的相应机制来实现负载均衡。

在 Kubernetes 中选择使用 ipvs 模式时,kube-proxy 会借助 ipvsadm 来设置有效负载均衡规则。ipvsadm 通过 LVS(Linux Virtual Server)技术实现负载均衡,并能够支持 TCP、UDP、HTTP/HTTPS 等多种协议。使用 ipvsadm 可以提高负载均衡的速度和效率,并减少 kube-proxy 与内核之间通信的频率,从而降低了 CPU 的使用率和延迟。

总之,ipvsadm 是一个基于网络层的负载均衡器,可用于 Kubernetes 中的服务发现和负载均衡。

集群全部安装cri-docker

作为接替 Docker 运行时的 Containerd 在早在 Kubernetes1.7 时就能直接与 Kubelet 集成使用,只是大部分时候我们因熟悉 Docker,在部署集群时采用了默认的 dockershim。在V1.24起的版本的 kubelet 就彻底移除了dockershim,改为默认使用Containerd了,当然也使用 cri-dockerd适配器来将Docker Engine与Kubernetes

wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4.amd64.tgz #下载
tar zxvf cri-dockerd-0.3.4.amd64.tgz #解压
cp cri-dockerd/* /usr/bin/ #将二进制文件移动到环境变量,可以直接使用命令

cri-dockerd #可以直接下载这个,移动到任意一个PATH变量内即可

配置cri-dockerd的system管理,注意ExecStart的路径写入你放文件的路径,如果不是/usr/bin记得修改

vim /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
<p>[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process</p>
<p>[Install]
WantedBy=multi-user.target

配置cri-docker.socket的套接字文件system管理,cri-docker.socket是一个 systemd 的 Socket 单元,用于监听来自容器运行时接口(CRI)的连接请求。

vim /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service</p>
<p>[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker</p>
<p>[Install]
WantedBy=sockets.target
systemctl daemon-reload #修改后重新加载system
systemctl enable --now cri-docker  #设置为开启启动并且直接运行

集群安装kubelet、kubeadm、kubectl

kubelet服务

Kubelet 是 Kubernetes 中的一个核心组件,它是在每个工作节点上运行的主体进程,并负责管理该节点上的容器;同时,它还与 Kubernetes 控制平面通信,以确保集群中所有的容器都处于所需的状态。

具体而言,Kubelet 的主要职责包括:

  1. 接收 PodSpecs:Kubelet 从 Kubernetes 的 API 中获取 Pod 申请的描述信息,即 PodSpecs,包括容器镜像、命令、环境变量等信息。

  2. 容器镜像管理:Kubelet 根据 PodSpecs 中的容器镜像信息,从 Docker 镜像仓库拉取镜像,并进行本地缓存和管理。

  3. 容器生命周期管理:Kubelet 通过与 Docker API 交互,启动、停止和重启容器,并确保容器按照用户预期的方式运行。

  4. 健康检查:Kubelet 定期检查容器的健康状态,并上报给控制平面,以便及时进行故障恢复操作。

  5. 资源管理:Kubelet 监控节点资源使用情况,如 CPU、内存、磁盘空间等,并确保容器不会超出节点的可用资源范围。

Kubelet 是 Kubernetes 最基本的组件之一,它负责在 Kubernetes 集群中将 Pod 根据用户定义的规则,运行在 Kubernetes 集群中的各个工作节点上。

kubeadm服务

kubeadm 是 Kubernetes 提供的一个命令行工具,用于帮助用户快速创建和初始化一个 Kubernetes 集群。它可以自动完成一系列繁琐的配置任务,简化了集群搭建的过程。

主要功能包括:

  1. 集群初始化:kubeadm 可以在一个或多个主机上初始化一个全新的 Kubernetes 集群。它会自动配置和安装必要的组件,如 kubelet、kube-proxy、container runtime 等。

  2. 节点加入:除了初始化集群,kubeadm 还允许将其他主机作为节点加入到已有的 Kubernetes 集群中,简化了扩展集群的过程。

  3. TLS 证书生成和管理:kubeadm 负责生成所需的密钥和证书,用于加密和认证集群内部的通信,并确保集群的安全性。

  4. 默认策略和配置:kubeadm 根据最佳实践为集群设置默认的策略和配置参数,确保集群的可靠性和一致性。

  5. 扩展性和自定义:kubeadm 提供了灵活的配置选项,允许用户根据自身需求进行自定义操作,以满足特定场景的部署要求。

需要注意的是,kubeadm 只负责初始化和配置 Kubernetes 集群的控制平面组件和节点,它并不涉及部署应用程序或者管理工作负载的内容。因此,在使用 kubeadm 创建集群后,还需要使用 kubectl 或其他工具来管理和操作集群中的应用程序和资源。

kubeadm 是一个用于快速创建和初始化 Kubernetes 集群的命令行工具,它简化了集群搭建的过程,并提供了一些默认的最佳实践配置选项。

kubectl服务

kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互和管理。

kubectl 可以执行以下一些常见的操作:

  1. 创建和管理资源:通过 kubectl 可以创建、更新和删除 Kubernetes 中的各种资源,如 Pod、Deployment、Service、ConfigMap 等。可以使用 YAML 或 JSON 格式的配置文件来定义资源的规格和属性。

  2. 查看和监控集群状态:kubectl 提供了许多命令来查看集群的状态,包括获取节点信息、查看运行中的 Pod 列表、查看日志、查看事件等。这些命令能够帮助用户了解集群中资源的运行情况和健康状态。

  3. 执行命令和调试容器:kubectl 还可以在容器内执行命令或进入容器的交互终端,以便于调试和排查问题。使用 kubectl exec 和 kubectl logs 命令可以方便地在容器内部执行命令或获取容器的日志信息。

  4. 扩展集群功能:kubectl 提供了一些扩展集群功能的命令,如扩容和缩容应用程序副本数、水平自动伸缩、滚动升级等。这些命令使得管理和调整集群的能力更加灵活和高效。

  5. 认证和授权:kubectl 可以与 Kubernetes 集群进行认证和授权,以确保用户有足够的权限来执行操作。可以使用 kubectl config 命令来管理和切换不同的集群配置和凭据。

kubectl 是 Kubernetes 的主要命令行工具,用于与 Kubernetes 集群进行交互和管理,提供了创建、管理、监控和调试集群中各种资源的功能,是使用 Kubernetes 进行应用程序部署和管理的重要工具。

配置yum源

vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kubelet kubeadm kubectl

下载kubelet、kubeadm、kubectl,保持版本一致,不然会不兼容,我这里下载的1.27.4,需要修改直接在yum命令内修改版本即可

yum -y install kubelet-1.27.4-0 kubeadm-1.27.4-0 kubectl-1.27.4-0 --disableexcludes=kubernetes

--disableexcludes=kubernetes :它的作用是禁用或忽略 kubernetes 软件源中的任何 exclude 配置,这意味着即使在 kubernetes 软件源的配置文件中指定了某些软件包需要被排除(不安装),使用了 --disableexcludes=kubernetes 参数后,yum 仍然会将这些软件包包括在安装列表中进行安装。

systemctl enable --now kubelet 直接添加开机启动,并且立即启动

systemctl is-active kubelet 查看是否处于活动状态,目前应该是activating,正在启动中

master节点kubeadm初始化

输入以下命令,注意版本号,--pod-network-cidr可以自己指定容器的ip范围,初始化过程很久,耐心等待

kubeadm init <br />
--image-repository registry.aliyuncs.com/google_containers <br />
--kubernetes-version v1.27.4 <br />
--pod-network-cidr=10.10.20.0/24 <br />
--cri-socket unix:///var/run/cri-dockerd.sock

W1008 17:17:26.741695 50512 checks.go:835] detected that the sandbox image "registry.aliyuncs.com/google_containers/pause:3.7" of the container runtime is inconsistent with that used by kubeadm. It is recommended that using "registry.aliyuncs.com/google_containers/pause:3.9" as the CRI sandbox image.

初始化没多久后会出现以下内容,原因是这个警告消息是由于在 kubelet 启动过程中,检测到容器运行时所使用的沙箱镜像与 kubeadm 使用的版本不一致。不用管它,他会下载完3.7后自动下载3.9

沙箱镜像是用于 Kubernetes Pod 中容器的隔离环境,通常使用 pause 容器作为沙箱镜像。不同版本的 Kubernetes 组件可能对沙箱镜像有不同的要求,因此在使用 kubeadm 部署 Kubernetes 集群时,建议确保容器运行时所使用的沙箱镜像与 kubeadm 使用的版本一致。

初始化结束后会出现如下界面

第一个方块内提示你如果要开始使用你的集群,输入以下命令,复制粘贴就可以

第二个方块内告诉你如果需要node节点加入你的集群,输入以下命令,复制到其他节点,然后加入

--cri-socket unix:///var/run/cri-dockerd.sock参数,即可加入集群

--cri-socket 参数可以告诉 kubeadm join 命令要连接的容器运行时套接字地址和通信方式。

kubeadm join 10.8.166.240:6443 --token uq6h3m.jgrn7qffjk4e7ihi --discovery-token-ca-cert-hash sha256:ce882c56d3f55023c9859e5cdf80cab130d6613d91ab5e395d8d85506c198ccb --cri-socket unix:///var/run/cri-dockerd.sock
kubectl get node #查看集群状态,包括节点名称、状态、角色等

master配置网络插件

使用calico的方法进行网络配置

Calico 是一个在 Kubernetes 集群中提供网络和网络安全功能的开源项目。它是一个纯粹的软件定义网络(SDN)解决方案,使用标准的 Linux 路由和 iptables 技术来提供高性能、可扩展的容器网络。

需要使用到两个在calico官网的配置文件

tigera-operator.yaml

tigera-operator.yaml 是 Tigera Secure 的 Kubernetes 操作员(Operator)的 YAML 配置文件。Tigera Secure 是一个全面的网络和安全平台,用于保护 Kubernetes 集群中的应用程序和数据。

Kubernetes 操作员是一种 Kubernetes 控制器,它可以自动化集群中的应用程序和基础结构的管理和维护。Tigera Operator 用于自动部署、配置和管理 Tigera Secure 平台中各个组件的生命周期。这些组件包括 Calico 网络策略引擎、Secure 云原生防火墙(Cloud Native Firewall)、全球性可观察性、流日志记录和 Splunk 集成等。

custom-resources.yaml

custom-resources.yaml 是一个 Kubernetes 自定义资源的 YAML 配置文件。自定义资源允许集群管理员在 Kubernetes API 中添加自定义对象,对于需要在集群中部署自己的应用程序或数据存储系统非常有用。

自定义资源可以使用目标编排语言(比如 YAML 或 JSON)创建和定义。这些自定义资源与 Kubernetes API 一起使用,并可以像其他 Kubernetes 对象一样进行管理和控制。与 Kubernetes API 中的其他对象一样,自定义资源支持声明性配置、容错处理、Kubernetes 资源的生命周期管理等特性。

在集群中加载该配置文件,如果出现故障输入kubectl delete -f tigera-operator.yaml,可以删除

kubectl create -f tigera-operator.yaml 

修改custom-resources.yaml文件,找到cidr的行,将ip设置为初始化指定的网段,不可以改成别的,然后加载该配置文件

kubectl apply -f custom-resources.yaml 
kubectl get pod -n calico-system

这个命令可以获取在 calico-system 命名空间中运行的所有 Pod 的状态。你会看到正在下载的这几个镜像,直到STATUS变成Running就全部成功

其中,第一列是 Pod 的名称,第二列是 Pod 中就绪的容器数和总容器数(格式为 就绪的容器数/总容器数),第三列是 Pod 的当前状态(如 RunningCrashLoopBackOffPending 等),第四列是该 Pod 重启的次数,第五列是该 Pod 被创建的时间。

kubectl get node #Kubernetes 集群中所有节点的状态和信息。
kubectl get pod -n kube-system #可以获取 Kubernetes 集群中 "kube-system" 命名空间中所有 Pod 的状态和信息。