Kubernetes1.26集群环境搭建

集群环境准备

先准备三台虚拟主机(一主二从),虚拟机配置为(master节点2CPU3G内存20G硬盘,node节点1CPU2G内存20G硬盘),虚拟机安装软件为VirtualBox7.0

1.环境初始化

主机名解析,为了方便后续三台虚拟机可以直接通过主机名访问,企业中推荐使用内部DNS服务器

编辑三台虚拟机的/etc/hosts文件

vi /etc/hosts

Kubernetes1.26集群环境搭建_第1张图片

时间同步

kubernetes要求集群中的节点必须精确一致,这里所以chronyd服务从网络同步时间
企业中建议配置内部的时间同步服务器

# 启动chronyd服务
systemctl start chronyd
# 设置chronyd服务开机自启
systemctl enable chronyd
# chronyd服务启动几秒钟后使用date命令验证时间
date

禁用firewalld服务

kuberbetes和docker在运行中会产生大量的iptables规则,为了不让系统规则和它们混淆,直接关闭系统的规则

# 关闭firewalld服务
systemctl stop firewalld
# 禁止firewalld服务开机自启
systemctl disable firewalld

禁用selinux服务

selinux是Liunx系统下的一个安全服务,如果不关闭它,在安装集群中会出现各种问题

# 执行命令
setenforce 0
# 执行命令
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

禁用swap分区

kubernetes要求每个节点都需要禁用swap分区,不然会对集群造成极大的性能影响
编辑/etc/fstab文件,注释掉swap分区一行

vi /etc/fstab

Kubernetes1.26集群环境搭建_第2张图片
我这里安装虚拟机的时候选的手动分区,我没有使用swap分区,所以可以省略这一步

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

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

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

sudo modprobe overlay
sudo modprobe br_netfilter

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

查看网桥过滤模块是否加载成功

lsmod | grep br_netfilter

配置ipvs功能

在kubernetes中service有两种代理模型,一种是iptables一种是ipvs
两者比较的话,ipvs性能要更好一点,但是如果要使用它,需要手动载入ipvs模块
确保 IPVS 所需的内核模块
(用于 Linux 内核 4.19 及更高版本)nf_conntrack
(用于 Linux 内核 4.19 以下版本)nf_conntrack_ipv4
查看内核版本

uname -a

在这里插入图片描述
在使用 IPVS 模式之前,还应在节点上安装诸如 之类的软件包。ipset
如果不满足这些要求,Kube-proxy 将回退到 IPTABLES 模式。
参见IPVS官方说明

# 安装ipset和ipvsadm
dnf install ipset ipvsadm -y
# 编写启动模块脚本
vi ipvs.modules

添加内容如下

modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack
# 启动模块
chmod +x ipvs.modules
/bin/bash ipvs.modules
# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack

2.设置容器运行时

安装containerd.io

Kubernetes从1.24开始移除了dockershim,所以这里用官方推荐的containerd.io,具体说明看一看官方文档容器运行时
这里用docker的仓库安装容器运行时,比较方便,但是这种方式不会安装CNI插件,具体参见容器入门

# 配置镜像源
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装
dnf install containerd.io-1.6.15-3.1.el9 -y

安装containerd.io的CNI插件

https://github.com/containernetworking/plugins/releases 下载压缩包,然后执行以下命令

$ mkdir -p /opt/cni/bin
$ tar Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.1.1.tgz

修改containerd配置文件

这里记录一下下面配置文件的说明文档CRI 插件配置指南

# 创建containerd默认配置目录,并将现有的默认配置导出
containerd config default | sudo tee /etc/containerd/config.toml
#
vi /etc/containerd/config.toml

sandbox_image修改为registry.aliyuncs.com/google_containers/pause:3.9或者registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9,总之和下面拉取集群镜像的仓库保持一致就行
SystemdCgroup修改为true

修改完启动或重启containerd服务

systemctl enable --now containerd

3.安装Kubernetes组件

由于kubernetes镜像仓库在国外,所以这里采用阿里云镜像仓库

# 编辑/etc/yum.repos.d/kubernetes.repo
vi /etc/yum.repos.d/kubernetes.repo

添加下面的配置

[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
# 安装kubeadm,kubectl,kubelet
dnf install kubelet-1.26.0-0 kubeadm-1.26.0-0 kubectl-1.26.0-0 -y

crictl 是 CRI 兼容的容器运行时命令行接口,你可以使用它来检查和调试 Kubernetes 节点上的容器运行时和应用程序。使用 crictl 对 Kubernetes 节点进行调试

vi /etc/crictl.yaml

设置为如下内容:

runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false

设置kubelet开机自启

systemctl enable --now kubelet

4.准备集群镜像

在安装kubernetes集群之前,需要先准备好集群需要的镜像,所需镜像可以通过下面命令查看

kubeadm config images list

上面命令展示出来的都是k8s官方仓库的镜像,没有梯子拉不下来,所以从阿里云的镜像仓库中拉取,写个脚本,内容如下:

#!/bin/bash

images=(
kube-apiserver:v1.26.0 
kube-controller-manager:v1.26.0 
kube-scheduler:v1.26.0 
kube-proxy:v1.26.0 
pause:3.9 
etcd:3.5.6-0 
coredns:v1.9.3)

for imageName in ${images[@]};
do
	crictl pull registry.aliyuncs.com/google_containers/$imageName
done

然后执行这个脚本

5.集群初始化

下面的操作只需要在master集群上执行即可

先写个配置文件来代替命令参数,导出默认参数然后修改(可以使用 kubeadm config print 命令打印出默认配置。

如果你的配置没有使用最新版本, 推荐使用 kubeadm config migrate 命令进行迁移。)

# 导出默认参数为kubeadm.yml
kubeadm config print init-defaults --component-configs KubeletConfiguration >   kubeadm.yml
# 根据实际情况修改一些参数
vi kubeadm.yml
localAPIEndpoint:
  # 修改为虚拟机地址
  advertiseAddress: 192.168.31.100
  bindPort: 6443
nodeRegistration:
  # 修改为安装的容器运行时
  criSocket: unix:///run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  # 修改为master节点的主机名
  name: rocky1
# 修改镜像源为阿里的镜像源
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.26.0
networking:
  serviceSubnet: "10.96.0.0/16"
  # 配置一个没有使用的网段
  podSubnet: "10.244.0.0/16"
  dnsDomain: "cluster.local"

在最后加上这段内容,设置kublet的代理模式为IPVS

---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
# kube-proxy specific options here
mode: ipvs

kubeadm命令都可以用上--config 配置文件地址来代替一些额外的运行参数,参考官网kubeadm配置说明

# 初始化集群
kubeadm init --config kubeadm.yml

集群创建完成后执行下列命令

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

6.安装网络插件

集群启动后在master节点上执行安装网络插件的命令,否则nodes状态为NotReady

在这里插入图片描述

一般来都是从网页上拉取并应用,也可以提前准备一个网络插件的资源文件,这里用的是Flannel
执行下列命令

kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

建议提前下载kube-flannel.yml文件然后上传到服务器中执行

kubectl apply -f kube-flannel.yml

稍等几分钟再执行kubectl get nodes,等到所有Node状态都是Ready时,执行下列命令清除污点

kubectl taint nodes --all node-role.kubernetes.io/control-plane-

7.最后测试环境是否可用,执行下列命令

kubectl create deployment nginx --image=nginx:1.14
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pod
kubectl get service

Kubernetes1.26集群环境搭建_第3张图片
Kubernetes1.26集群环境搭建_第4张图片

你可能感兴趣的:(kubernetes,linux,运维)