Kubernetes1.26.0集群环境搭建

集群环境准备

先准备三台虚拟主机(一主二从),阿里云ECS配置为(master节点2CPU4G内存40G硬盘,node节点2CPU4G内存40G硬盘)

证书快捷登录参考方法

1.环境初始化

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

确认主机名和IP地址

hostname
ip addr show

设置三台主机主机名

hostnamectl set-hostname master   # k1

hostnamectl set-hostname worker1  #k2

hostnamectl set-hostname worker2  #k3

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

vi /etc/hosts
172.26.197.226 master-node
172.26.197.227 worker1
172.26.197.228 worker2

时间同步

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

转发 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

在使用 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_ipv4
# 启动模块
chmod +x ipvs.modules
/bin/bash ipvs.modules
# 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4

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会报如下错误

 dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Traceback (most recent call last):
  File "/usr/bin/dnf", line 57, in <module>
    from dnf.cli import main
  File "/usr/lib/python2.7/site-packages/dnf/__init__.py", line 30, in <module>
    import dnf.base
  File "/usr/lib/python2.7/site-packages/dnf/base.py", line 29, in <module>
    import libdnf.transaction
  File "/usr/lib64/python2.7/site-packages/libdnf/__init__.py", line 3, in <module>
    from . import conf
  File "/usr/lib64/python2.7/site-packages/libdnf/conf.py", line 17, in <module>
    _conf = swig_import_helper()
  File "/usr/lib64/python2.7/site-packages/libdnf/conf.py", line 16, in swig_import_helper
    return importlib.import_module('_conf')
  File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
    __import__(name)
ImportError: No module named _conf 

#重新安装 dnf
sudo dnf reinstall libdnf

#如果这个方法不起作用,你也可以尝试升级 libdnf:
sudo dnf upgrade libdnf

#我这里还是不行接下来就逐步排查
#1、确认已经安装了python
python --version

#2、更新pip:
python -m pip install --upgrade pip

#3、安装缺失的包:
python -m pip install <package-name>

#您可以根据错误提示中缺失的包的名称来替换 <package-name>。

#升级后还是一样,尝试另外一种解决方法:
#1、确认已经安装了EPEL源
sudo yum install epel-release
#2、安装Python 3的相关依赖包:
sudo yum install python3 python3-pip python3-devel
#3、升级dnf到最新版本:
sudo dnf upgrade dnf
#4、清除dnf缓存并重建缓存:
sudo dnf clean all
sudo dnf makecache
#5、如果还是出现同样的问题,可以尝试重新安装dnf:

sudo yum remove dnf
sudo yum install dnf
#如果还是不能解决问题,可以尝试使用以下命令更新系统所有的包:
sudo yum update
#反正我到这里才解决掉………………………………

 安装containerd.io:

#添加 Docker CE repo:
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

sudo dnf install -y containerd.io

[root@master-node ~]# dnf install containerd.io-1.6.15-3.1.el9 -y
上次元数据过期检查:0:01:45 前,执行于 2023年03月15日 星期三 13时42分06秒。
未找到匹配的参数: containerd.io-1.6.15-3.1.el9
错误:没有任何匹配: containerd.io-1.6.15-3.1.el9 

提示:这个错误提示是因为你在CentOS 7上使用了CentOS 9的软件包源。请使用正确的版本号。你可以尝试以下命令来安装containerd.io的最新版本:

出现上面提示的错误才执行如下命令: 

dnf install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
dnf install -y containerd.io

启动 containerd:

sudo systemctl enable --now containerd

验证 containerd 是否正确安装并运行:

sudo ctr version

 安装containerd.io的CNI插件

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


mkdir -p /opt/cni/bin
#下载安装包
wget https://github.com/containernetworking/plugins/archive/refs/tags/v1.1.1.tar.gz
tar Cxzvf /opt/cni/bin v1.1.1.tar.gz

修改containerd配置文件

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

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

以上是目前机子上显示需要的镜像,但是我还是安装v1.26.0的版本 

 上面命令展示出来的都是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

并把脚本命名为`crictl_pull.sh`,然后执行这个脚本

sudo bash /root/crictl_pull.sh

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: 172.26.197.226
  bindPort: 6443
nodeRegistration:
  # 修改为安装的容器运行时
  criSocket: unix:///run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  # 修改为master节点的主机名
  name: master-node
# 修改镜像源为阿里的镜像源
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

 这里需要记录下:

kubeadm join 172.26.197.226:6443 --token abcdef.0123456789abcdef \

    --discovery-token-ca-cert-hash sha256:39e2d377d3xxxxxxx258b42c8a0703adb7cf861a

的值,然后在worker节点上执行该命令

6.安装网络插件

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

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

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

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

#提前下载文件
wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml

#执行命令
kubectl apply -f kube-flannel.yml

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

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

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

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

 

 参考地址:https://blog.csdn.net/junyi52/article/details/128449124

推荐学习参考项目(这个是二进制部署的):https://github.com/easzlab/kubeasz/tree/master

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值