首页 > 系统相关 >CentOS7.9 k8s集群环境搭建

CentOS7.9 k8s集群环境搭建

时间:2023-06-18 14:12:14浏览次数:58  
标签:-- CentOS7.9 集群 yum master docker k8s root

环境搭建

本次环境搭建需要安装三台Centos服务器(一主二从),k8s采用1.25.4版本

主机安装

安装虚拟机过程中注意下面选项的设置:

  • 操作系统环境:CPU(2C) 内存(4G) 硬盘(50G)
  • 语言选择:English
  • 软件选择:基础设施服务器
  • 分区选择:自动分区
  • 网络配置:按照下面配置网路地址信息
  • 主机名设置:按照下面信息设置主机名

192.168.11.105 k8s-master
192.168.11.106 k8s-node01
192.168.11.107 k8s-node02

环境初始化

1、检查操作系统的版本

# 此方式下安装kubernetes集群要求Centos版本要在7.9
[root@k8s-master ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)

2、域名解析
为了方便后面集群节点间的直接调用,在这配置一下主机名解析,企业中推荐使用内部DNS服务器

[root@k8s-master ~]# vim /etc/hosts +
[root@k8s-master ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.11.105 k8s-master
192.168.11.106 k8s-node01
192.168.11.107 k8s-node02

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

# 安装chrony
[root@k8s-master ~]# yum install -y chrony.x86_64

# 修改配置文件
[root@k8s-master ~]# vim /etc/chrony.conf
[root@k8s-master ~]# grep ^server /etc/chrony.conf
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
# 添加阿里云服务器地址
server ntp1.aliyun.com iburst

# 重启并设置为开机自启动
[root@k8s-master ~]# systemctl enable --now  chronyd

# chronyd服务启动稍等几秒钟,就可以使用date命令验证时间了
[root@k8s-master ~]# chronyc sources
[root@k8s-master ~]# date

4、禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则

# 1 关闭firewalld服务
[root@master ~]# systemctl stop firewalld
[root@master ~]# systemctl disable firewalld
[root@master ~]# firewall-cmd --state
not running
# 2 关闭iptables服务
[root@master ~]# systemctl stop iptables
[root@master ~]# systemctl disable iptables

5、禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题

# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disabled
# 注意修改完毕之后需要重启linux服务
SELINUX=disabled
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
setenfoce 0
[root@master ~]# sestatus
SELinux status: disabled

6、禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明

# 编辑分区配置文件/etc/fstab,注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
UUID=455cc753-7a60-4c17-a424-7741728c44a1 /boot xfs defaults 0 0
/dev/mapper/centos-home /home xfs defaults 0 0
# /dev/mapper/centos-swap swap swap defaults 0 0


# 临时关闭
swapoff -a

7、升级操作系统内核

# 导入elrepo gpg key
[root@master ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
# 安装elrepo YUM源仓库
[root@master ~]# yum -y install https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 安装kernel-ml版本,ml为长期稳定版本,lt为长期维护版本
[root@master ~]# yum --enablerepo="elrepo-kernel" -y install kernel-ml.x86_64
# 设置grub2默认引导为0
[root@master ~]# grub2-set-default 0
# 重新生成grub2引导文件
[root@master ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
# 更新后,需要重启,使用升级的内核生效。
[root@master ~]# reboot
# 重启后,需要验证内核是否为更新对应的版本
[root@k8s-master ~]# uname -r
6.3.8-1.el7.elrepo.x86_64

8、修改linux的内核参数

# 修改linux的内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置:
[root@k8s-master ~]# vim /etc/sysctl.d/kubernetes.conf 
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness=0

[root@k8s-master ~]# sysctl -p

# 加载网桥过滤模块
[root@k8s-master ~]# modprobe br_netfilter

# 重新加载配置
[root@k8s-master ~]# sysctl -p /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0


# 查看网桥过滤模块是否加载成功
[root@master ~]# lsmod | grep br_netfilter

9、配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块

# 1 安装ipset和ipvsadm
[root@k8s-master ~]# yum install ipset ipvsadm -y


# 2 添加需要加载的模块写入脚本文件
[root@k8s-master ~]# cat <<EOF > /etc/sysconfig/modules/ipvs.modules
> #!/bin/bash
> modprobe -- ip_vs
> modprobe -- ip_vs_rr
> modprobe -- ip_vs_wrr
> modprobe -- ip_vs_sh
> modprobe -- nf_conntrack
> EOF

# 3 为脚本文件添加执行权限
[root@k8s-master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules

# 4 执行脚本文件
[root@k8s-master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules

# 5 查看对应的模块是否加载成功
[root@k8s-node02 ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
ip_vs_sh               16384  0
ip_vs_wrr              16384  0
ip_vs_rr               16384  0
ip_vs                 200704  6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
nf_conntrack          180224  1 ip_vs
nf_defrag_ipv6         24576  2 nf_conntrack,ip_vs
libcrc32c              16384  3 nf_conntrack,xfs,ip_vs

基础环境

k8s基本环境准备
由于kubernetes的镜像源在国外,速度比较慢,这里切换成国内的镜像源,本文使用阿里云YUM源

cat <<EOF > /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
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

[root@k8s-master ~]# yum clean all && yum makecache

1、查看所有的可用版本

[root@k8s-master ~]# yum list kubeadm kubelet kubectl --showduplicates | sort -r

2、集群软件安装
安装kubeadm、kubelet和kubectl

[root@k8s-master ~]# yum install kubelet-1.25.4 kubectl-1.25.4 kubeadm-1.25.4

3、安装后查看版本

[root@k8s-master ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"25", GitVersion:"v1.25.4", GitCommit:"872a965c6c6526caa949f0c6ac028ef7aff3fb78", GitTreeState:"clean", BuildDate:"2022-11-09T13:35:06Z", GoVersion:"go1.19.3", Compiler:"gc", Platform:"linux/amd64"}

4、配置kubelet的cgroup
为了实现docker使用的cgroupdriver与kubelet使用的cgroup的一致性,建议修改如下文件内容。

[root@k8s-master ~]# vim /etc/sysconfig/kubelet
KUBE_PROXY_MODE="ipvs"

5、设置kubelet开机自启

[root@k8s-master ~]# systemctl enable kubelet

做完基础环境,建议创建快照,后续会分别使用三种不同方式创建集群

集群创建方式1:containerd

https://zhuanlan.zhihu.com/p/612051521
https://blog.csdn.net/Jailman/article/details/126504154
安装containerd,所有节点都安装

# 直接安装docker-ce源 https://developer.aliyun.com/mirror/docker-ce

# step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
# Step 5:安装软件包
过滤一下软件包:
[root@k8s-master ~]# yum list | grep containerd            containerd.io.x86_64                        1.6.21-3.1.el7             @docker-ce-stable
[root@k8s-master ~]# yum install -y containerd
# Step 6:初始化默认配置
[root@k8s-master ~]# containerd config default | tee /etc/containerd/config.toml
# Step 7:修改containerd配置更改cgroup
[root@k8s-master ~]# sed -i "s#SystemdCgroup\ \=\ false#SystemdCgroup\ \=\ true#g" /etc/containerd/config.toml
# Step 8:修改镜像源
[root@k8s-master ~]# sed -i "s#registry.k8s.io#registry.aliyuncs.com/google_containers#g"  /etc/containerd/config.toml
# Step 9:配置crictl
[root@k8s-master ~]# 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

[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart containerd
[root@k8s-master ~]# systemctl enable containerd

# 验证是否可用
crictl pull nginx:alpine
crictl rmi nginx:alpine
crictl images


解决方法:

安装 CRI 客户端 crictl
[root@k8s-master ~]# wget -c https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.27.0/crictl-v1.27.0-linux-amd64.tar.gz
[root@k8s-master ~]# tar xf  crictl-v1.27.0-linux-amd64.tar.gz -C /usr/local/bin/

[root@k8s-master ~]# vim /etc/crictl.yaml
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false


#vim /etc/containerd/config.toml

修改runtime_type

runtime_type = "io.containerd.runtime.v1.linux"

[root@k8s-master docker]# systemctl daemon-reload 
[root@k8s-master docker]# systemctl restart containerd.service 
[root@k8s-master docker]# crictl pull busybox

集群创建方式2:cri-o

安装cri-o
所有节点安装配置cri-o

[root@k8s-master yum.repos.d]# VERSION=1.25
[root@k8s-master yum.repos.d]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable.repo \
> https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_7/devel:kubic:libcontainers:stable.repo

[root@k8s-master ~]# curl -L -o /etc/yum.repos.d/devel:kubic:libcontainers:stable:crio:${VERSION}.repo \
> https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:crio:${VERSION}/CentOS_7/devel:kubic:libcontainers:stable:cri-o:${VERSION}.repo
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   424  100   424    0     0    212      0  0:00:02  0:00:01  0:00:01   212
100   425  100   425    0     0    189      0  0:00:02  0:00:02 --:--:--   189
100   426  100   426    0     0    171      0  0:00:02  0:00:02 --:--:--     0
100   427  100   427    0     0    130      0  0:00:03  0:00:03 --:--:--   130
100   428  100   428    0     0    121      0  0:00:03  0:00:03 --:--:--     0
  0     0    0  1083    0     0    288      0 --:--:--  0:00:03 --:--:--   288


[root@k8s-master ~]# yum install cri-o -y
# 修改crio配置文件
[root@master ~]# grep "pause_image =" /etc/crio/crio.conf
pause_image = "registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.7"
[root@master ~]# grep "insecure_registries =" -A 2 /etc/crio/crio.conf
insecure_registries = [
"docker.mirrors.ustc.edu.cn","dockerhub.azk8s.cn","hub-mirror.c.163.com"
] s
ystemctl daemon-reload
systemctl start crio
systemctl enable crio

修改/etc/sysconfig/kubelet

# more /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--container-runtime=remote --cgroup-driver=systemd --
container-runtime-endpoint='unix:///var/run/crio/crio.sock' --runtime-req
uest-timeout=5m"
# systemctl daemon-reload
# systemctl restart kubelet.service

集群创建方式3:docker

# 1 切换镜像源
[root@k8s-master ~]# wget -c https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
[root@k8s-master ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo

# 2 查看当前镜像源中支持的docker版本
[root@k8s-master ~]# yum list docker-ce --showduplicates

# 3 安装特定版本的docker-ce
# 必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本
[root@k8s-master ~]# yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 安装源里最新版本
$ yum install docker-ce
# 4 添加一个配置文件
# Docker在默认情况下使用的Cgroup Driver为cgroupfs,而kubernetes推荐使用systemd来代替
cgroupfs
[root@k8s-master ~]# mkdir /etc/docker
[root@k8s-master ~]# cat << EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF

# 5 启动docker
[root@k8s-master ~]# systemctl restart docker.service
[root@k8s-master ~]# systemctl enable docker.service
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.

# 6 检查docker状态和版本
[root@k8s-master ~]# docker version

cri-dockerd安装

# 下载
[root@k8s-master ~]# wget  -c https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.3/cri-dockerd-0.3.3-3.el7.x86_64.rpm

# 安装
https://github.com/Mirantis/cri-dockerd
[root@k8s-master ~]# rpm -ivh cri-dockerd-0.3.3-3.el7.x86_64.rpm
error: Failed dependencies:
        containerd.io >= 1.2.2-3 is needed by cri-dockerd-3:0.3.3-3.el7.x86_64
这个问题是因为docker-ce缺少container-selinux和container.io这两个依赖包
[root@k8s-master ~]# yum install container-selinux -y
[root@k8s-master ~]# yum install -y containerd.io

[root@k8s-master ~]# wget -c http://github.com/Mirantis/cri-dockerd/releases/download/v0.2.3/cri-dockerd-0.2.3-3.el7.x86_64.rpm

[root@k8s-master ~]# rpm -ivh cri-dockerd-0.2.3-3.el7.x86_64.rpm
Preparing...                          ################################# [100%]
Updating / installing...
   1:cri-dockerd-3:0.2.3-3.el7        ################################# [100%]



[root@k8s-master ~]# yum install cri-dockerd-0.2.6-3.el7.x86_64.rpm -y


# 修改启动文件 /usr/lib/systemd/system/cri-docker.service
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-containerimage=registry.aliyuncs.com/google_containers/pause:3.7


# 启动cri-docker
systemctl daemon-reload && systemctl enable --now cri-docker cri-docker.socket

错误排查
1、cri-docker服务起不来

[root@k8s-master lib]# systemctl status cri-docker.service 
● cri-docker.service - CRI Interface for Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/cri-docker.service; enabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Sat 2023-06-17 23:30:29 CST; 3s ago
     Docs: https://docs.mirantis.com
  Process: 18729 ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-containerimage=registry.aliyuncs.com/google_containers/pause:3.7 (code=exited, status=1/FAILURE)
 Main PID: 18729 (code=exited, status=1/FAILURE)

Jun 17 23:30:26 k8s-master cri-dockerd[18729]: time="2023-06-17T23:30:26+08:00" level=fatal msg="unknown flag: --pod-infra-containerimage"
Jun 17 23:30:26 k8s-master systemd[1]: Failed to start CRI Interface for Docker Application Container Engine.
Jun 17 23:30:26 k8s-master systemd[1]: Unit cri-docker.service entered failed state.
Jun 17 23:30:26 k8s-master systemd[1]: cri-docker.service failed.
Jun 17 23:30:29 k8s-master systemd[1]: cri-docker.service holdoff time over, scheduling restart.
Jun 17 23:30:29 k8s-master systemd[1]: Stopped CRI Interface for Docker Application Container Engine.
Jun 17 23:30:29 k8s-master systemd[1]: start request repeated too quickly for cri-docker.service
Jun 17 23:30:29 k8s-master systemd[1]: Failed to start CRI Interface for Docker Application Container Engine.
Jun 17 23:30:29 k8s-master systemd[1]: Unit cri-docker.service entered failed state.
Jun 17 23:30:29 k8s-master systemd[1]: cri-docker.service failed.

尝试解决

1、进行了内核升级,将yum源更新

[root@k8s-master ~]# yum update -y
[root@k8s-master ~]# reboot

2、好家伙,swap分区没有禁,因为之前设置的临时关闭,开机又打开了

安装k8s

[root@k8s-master ~]# yum install -y kubelet-1.25.6 kubeadm-1.25.6 kubectl-1.25.6

[root@k8s-master ~]# systemctl enable --now kubelet

部署master节点

集群初始化

kubeadm init --kubernetes-version=v1.27.3 --pod-network-cidr=10.224.0.0/16 --
apiserver-advertise-address=192.168.11.105 --cri-socket unix:///var/run/cridockerd.sock --image-repository registry.aliyuncs.com/google_containers

添加 Worker 节点

在 Worker 节点执行

标签:--,CentOS7.9,集群,yum,master,docker,k8s,root
From: https://www.cnblogs.com/sre-chan/p/17488230.html

相关文章

  • k8s 深入篇———— docker 镜像是什么[二]
    前言简单介绍一下docker的镜像。正文前面讲到了容器的工作原理了(namespace限制了时间,cgroup限制了资源),知道docker历史的也知道,docker之所以能够称为容器大佬,是因为其只做了容器。也就是做到了一次打包,到处运行的这种思想得到了实现。那么容器的镜像涉及思路是怎么样的呢?......
  • k8s 梳理及使用总结
    ---1.Kubernetes概述1.最初Google开发了1个叫Borg的系统(现在命名为Omega),来调度近20多亿个容器从2014年第1个版本发布以来,迅速得到了开源社区的追捧,?前,k8s已经成为了发展最快、市场占有率最高的容器编排引擎产品。---2.特点轻量级,资源消耗小开源弹性伸缩负载均衡IPVS---3.重要......
  • 集群版fastFDS安装配置
    在单机版的基础上搭建集群版一、主机规划主机名IP地址操作系统配置kht111192.168.2.111Centos7.8基础设施服务器2颗CPU2G内存50G硬盘kht112192.168.2.112Centos7.8基础设施服务器2颗CPU2G内存50G硬盘kht113192.168.2.113Centos7.8......
  • Centos7 yum部署单机kubernetes集群
    kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包minikube:一个用于快速搭建单节点kubernetes的工具kubeadm:一个用于快速搭建kubernetes集群的工具二进制包:从官网下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效一、Minikube1......
  • k8s 深入篇———— docker 是什么[一]
    前言简单的整理一下一些基本概念。正文简单运行一个容器:创建一个容器:dockerrun-itbusybox/bin/bash然后看下进程:ps-ef做了一个障眼法,使用的是pidnamespace方式,让容器内部只能看到由容器创建的进程。linux还有一些其他的机制:比如,MountNamespace,用于让被隔......
  • CentOS7.9离线部署Kubernetes 1.27.2
    1、节点介绍 ,最小化安装CentOS7.91HostNamevm8649vm8648vm86472IP10.17.86.4910.17.86.4810.17.86.472、配置网络,关闭防火墙,关闭selinux3、安装必备的软件1yuminstallvimgccwgetlrzszbash-completiongperf......
  • arm系统部署k8s
    一、Docker安装1、下载资源docker安装包地址:https://download.docker.com/linux/static/stable/aarch64/这里下载的是docker-20.10.20.tgz。解压后,将docker目录下文件拷贝到/usr/bin$tar-xfdocker-19.10.20.tgz$mvdocker/*/usr/bin2、配置system服务创建docker.socket文件$......
  • k8sphp业务
    1.K8S部署初始化准备1.1系统安装地址规划,根据实际情况进行修改主机名IP操作系统master10.0.0.10ubuntu22.04worker0110.0.0.11ubuntu22.04worker0210.0.0.12ubuntu22.04下载地址:https://mirrors.aliyun.com/ubuntu-releases/bionic/ubuntu-18.04......
  • K8S nginx-ingress配置集锦
    1.设置IP白名单#设置只能通过192.168.0.0/24和127.0.0.1网段才能访问,否则报403apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:rabbitmqnamespace:defaultannotations:nginx.ingress.kubernetes.io/whitelist-source-range:192.168.0.0/24,127.0.......
  • k8s 集群原理
    1.背景Kubernetes作为容器应用的管理中心,对集群内部所有容器的生命周期进行管理,结合自身的健康检查及错误恢复机制,实现了集群内部应用层的高可用性。Kubernetes服务本身的稳定运行对集群管理至关重要,影响服务稳定的因素一般来说分为两种,一种是服务本身异常或者服务所在机器宕机,另......