1、内核版本要求

  • Kubernetes 1.23+ 需要内核3.10.0-1160及以上,否则无法安装和运行。
  • 这是因为最新的Kubernetes启用了新的内核特性,需要相应版本的内核支持。
  • 对于CentOS 7,其默认内核版本为3.10.x,比较老旧,无法满足新版本Kubernetes的需求。
Kubernetes单节点环境准备

IP

docker version

cri-dockerd

k8s(Kubernetes)

内核

centos

CPU/内存

hostname

39.99.151.239

25.0.3

v0.3.4

v1.28.0

3.10.0-1160.92.1.el7.x86_64

7.9

2核(vCPU) 2GiB

master

  • 设置主机名 #并添加到/etc/hosts里 39.99.151.239:

hostnamectl set-hostname master bash

#vim /etc/hosts

39.99.151.239 master

关闭swap

#临时加永久

临时
swapoff -a

永久
vim进入fstab把这行加#号注释掉
vim /etc/fstab

#/dev/mapper/centos-swap swap                    swap    defaults        0 0

关闭防火墙 Selinux

#临时加永久


systemctl stop firewalld
systemctl disable firewalld

setenforce 0
sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config

复制


配置NTP时间同步服务
yum -y install ntp
#安装ntp软件包。

systemctl enable ntpd
#设置ntp服务开机自启。

systemctl start ntpd
#启动ntp服务。

ntpdate -u cn.pool.ntp.org
#从公共ntp服务器同步一次时间。

hwclock --systohc
#将系统时间同步到硬件时钟。

timedatectl set-timezone Asia/Shanghai
#设置系统时区为上海。


内核升级(最新)

不指定版本默认就是当前最新版本

#CentOS 7 上安装最新版本 kernel-ml 内核的过程:

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
#导入 elrepo 源的 GPG 公钥,用于验证软件包的签名。

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
#安装 elrepo 源的 rpm 包,添加 elrepo 源。

yum --enablerepo=elrepo-kernel install kernel-ml -y
#启用 elrepo 源,并安装 kernel-ml 内核包。

sed -i s/saved/0/g /etc/default/grub
#编辑 /etc/default/grub 文件,设置开机从新内核启动。

grub2-mkconfig -o /boot/grub2/grub.cfg
#更新 grub 配置。

reboot
#重启系统,以使用新的内核启动。

#总结:
#该命令的作用是添加 elrepo 源、安装最新的 kernel-ml 内核包,并更新 grub 引导来使用该内核,从而升级系统的 Linux 内核。


docker安装

不指定版本默认就是当前最新版本

#CentOS 7 系统的 yum 源替换为阿里云的镜像源。
#yum update 来更新系统,-y 自动确认。
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
yum -y update


#首先卸载已安装的Docker
#如果你的操作系统没有安装过Docker就不需要执行卸载命令
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine


#建立仓库
## 安装Docker所需要的一些工具包
sudo yum install -y yum-utils


## 建立Docker yum仓库
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo


#使用yum安装了最新版本的Docker CE社区版、命令行工具包及containerd.io容器运行时,完成了Docker CE的安装。
sudo yum -y install docker-ce docker-ce-cli containerd.io

#配置加速器
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://pho7vcn8.mirror.aliyuncs.com",
"https://hub-mirror.c.163.com",
"https://reg-mirror.qiniu.com"
  ]
}
EOF

#重新加载系统管理守护进程,从而读取新的配置文件。
sudo systemctl daemon-reload


#开机自启并启动Docker
sudo systemctl enable docker --now


#测试 Docker 是否安装正常
sudo docker run hello-world


安装cri-dockerd

最新版本

#到GitHub自行手动下载并上传到服务器 
https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.4/cri-dockerd-0.3.4-3.el7.x86_64.rpm


#用rpm安装
rpm -ivh cri-dockerd-0.3.4-3.el7.x86_64.rpm


#重载系统守护进程→设置cri-dockerd自启动→启动cri-dockerd
systemctl daemon-reload 
systemctl enable cri-docker.socket cri-docker --now


安装Kubernetes(k8s)

不指定版本默认就是当前最新版本

#安装kubectl
#kubectl是kubernetes的命令行工具,是操作、检查集群的重要组件。这里通过 curl 方式来安装 kubectl最新发行版
#通过命令行下载

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"



#下载校验文件,验证 kubectl 的可执行文件。

curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"



#安装 kubectl

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl



#测试安装是否成功和安装的版本,安装成功会返回一个WARNING,这是正常的,只要版本输出是正确的就说明kubectl安装成功

kubectl version --client




#安装kubeadm
#安装 kubeadm、kubelet 和 kubectl,配置yum文件,因为国内无法直接访问google,这里需要将官网中的google的源改为国内源,以阿里云为例:

cat <<EOF | sudo tee /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=1
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
EOF



#执行安装

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



#设置kubelet自启动

systemctl enable  kubelet  --now


下载runc
#安装runc,这是Kubernetes必须要的运行环境。
#到GitHub自行手动下载并上传到服务器 

https://github.com/opencontainers/runc/releases/download/v1.1.9/runc.amd64



#安装runc,检查是否安装成功

sudo install -m 755 runc.amd64 /usr/local/bin/runc 
runc -v 

#runc是符合OCI(开放容器 Initiative)标准的容器运行时,也可以看作是docker容器运行时的内核组件。runc提供了直接使用操作系统接口创建和运行容器的功能。

#runc的主要特征包括:

#- 它是轻量级的,只负责运行容器中的进程,不包括镜像管理、容器网络等高级功能。

#- 它可以直接通过OCI标准接口管理容器,不依赖于docker daemon。

#- 它主要用于嵌入到其他系统中,为其提供容器运行能力,如Docker、Kubernetes。

#- runc直接调用Linux内核namespace、cgroup、capabilities等接口创建容器。

#- runc可以跨平台工作,支持主流操作系统。

#- runc允许您自定义容器的配置并直接运行容器,适合自动化的容器处理。

#- runc的设计简单和专注,有利于安全审计和理解。

#总结而言,runc可以看作是实现OCI标准的简单而专注的容器运行时内核,它为其他容器系统提供了直接操作容器的基础工具。Docker和Kubernetes都使用了runc来运行容器实例。


修改配置文件
# vim到/usr/lib/systemd/system/cri-docker.service里修改 找到第10行ExecStart=

vim /usr/lib/systemd/system/cri-docker.service 

ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7



#这段配置是修改 cri-docker 系统服务的启动参数,主要作用是:

#设置 Kubernetes 使用的容器网络插件为 CNI (Container Network Interface)

#通过 --network-plugin=cni 参数指定网络插件类型为 CNI。这是 Kubernetes 默认的网络模型,需要安装额外的 CNI 插件比如 Calico、Flannel 等来提供 Pod 网络。

#设置 pause 镜像

#通过 --pod-infra-container-image 指定 pause 镜像,这个镜像用来提供 Pod 内部共享的网络和文件空间。

#默认是 k8s.gcr.io/pause,这里修改为了国内阿里云的镜像,加速获取镜像。

#修改 cri-docker 服务的启动参数

#Kubernetes 通过 docker CRI (Container Runtime Interface) 来管理容器,cri-docker 这个系统服务就是 docker 的 CRI 实现。

#通过修改服务启动参数,可以自定义 Kubernetes 使用 docker 时的网络和镜像配置。

#总结一下,这组配置主要是设置了 CNI 网络插件类型和自定义了 pause 镜像,方便后续 Kubernetes 集群使用。


重启
# 重启Docker组件
systemctl daemon-reload && systemctl restart docker cri-docker.socket cri-docker

# 检查Docker组件状态
systemctl status docker cir-docker.socket cri-docker 


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

sudo modprobe overlay
sudo modprobe br_netfilter

#启用了overlay和br_netfilter两个对Kubernetes重要的内核模块。

#这是准备Kubernetes节点的必要步骤之一,需要在所有节点上执行完成。


设置所需的 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
lsmod | grep overlay

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




master操作

Master初始化
#执行初始化命令,这一步只在主节点master执行
kubeadm init --node-name=master --image-repository=registry.aliyuncs.com/google_containers --cri-socket=unix:///var/run/cri-dockerd.sock --apiserver-advertise-address=39.99.151.239 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12
初始化命令注释
# 将下载容器镜像源替换为阿里云,否则因为网络原因会导致镜像拉不下来,一定会执行不成功。
--image-repository=registry.aliyuncs.com/google_containers 

# 这是指定容器运行时,因为containerd也是Docker的组件之一,下载Docker会一并将containerd下载下来,在执行初始化时当Kubernetes检测到有多个容器运行时环境,就必须要手动选择一个。这里也可以看出containerd实际上比Docker更轻量得多。
--cri-socket=unix:///var/run/cri-dockerd.sock 

# 为API server设置广播地址,这里选择本机的ipv4地址,这里不希望API SERVER设置在其他node上的话就不要改为其他地址。
--apiserver-advertise-address=39.99.151.239

# 指明 pod 网络可以使用的 IP 地址段
--pod-network-cidr=10.244.0.0/16 

# 为服务的虚拟 IP 地址另外指定 IP 地址段
--service-cidr=10.96.0.0/12 

初始化成功会有以下提示

将kubeadm join那一段用一个文本文档记下,后面node节点执行加入就是依靠这一条指令


mkdir -p $HOME/.kube
#在当前用户的HOME目录下创建.kube配置目录。

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#将默认的admin.conf文件拷贝到.kube/config文件,这个admin.conf文件包含了管理集群的凭证和相关配置。

sudo chown $(id -u):$(id -g) $HOME/.kube/config
#将.kube/config文件的ownership修改为当前用户,否则可能因为权限问题无法访问集群。
  • 完成这些步骤后,当前用户就可以通过kubectl工具管理该Kubernetes集群了。
  • 这是Kubernetes集群安装完成后,在master节点上配置kubectl命令行工具访问集群的常用方法。
  • 需要注意kubeconfig文件包含权限敏感信息,要确保其文件权限只对当前用户可读可写。
# 永久生效,执行kubeadm reset后再次init也无需再次执行这条命令
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >>  ~/.bash_profile 

# 执行永久生效命令之后需要source一下使其生效
source ~/.bash_profile 

# 检测配置是否生效
echo $KUBECONFIG
/etc/kubernetes/admin.conf


#这两条命令的作用是设置KUBECONFIG环境变量,以配置kubectl命令行工具访问Kubernetes集群。

#1. echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
#这行将export KUBECONFIG的配置命令追加到当前用户的bash profile文件中。这里将KUBECONFIG变量指定为admin.conf的路径。

#2. source ~/.bash_profile
#运行source命令重新加载bash profile,以立即生效其对环境变量的更改。

#这样就设置了KUBECONFIG变量指向admin.conf文件,kubectl将会使用这个配置文件访问Kubernetes集群。

#admin.conf文件包含访问Kubernetes集群所需的认证信息,是在master初始化时生成的,通常位于/etc/kubernetes/目录下。

#将其路径 export到KUBECONFIG变量是一个简单的方式,来配置kubectl与指定集群的连接。

#将这些命令添加到profile文件中,可以使设置持久化,方便长期使用。

flannel

kube-flannel.yml

#安装配置网络插件——这里使用flannel,将kube-flannel.yml文件下载并上传到server上。
#到GitHub自行手动下载并上传到服务器
https://github.com/flannel-io/flannel/releases/download/v0.22.2/kube-flannel.yml


#apply kube-flannel.yml文件,为Kubernetes配置flannel网络插件
kubectl apply -f kube-flannel.yml



cat /run/flannel/subnet.env

FLANNEL_NETWORK=10.244.0.0/16
FLANNEL_SUBNET=10.244.0.1/24
FLANNEL_MTU=1450
FLANNEL_IPMASQ=true

#执行完kubectl apply -f kube-flannel.yml这条命令之后,等待一会,才可以查看cat /run/flannel/subnet.env这个文件

Logo

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

更多推荐