配置清单
真正生产集群是需要高可用的,所以以下就来演示一个生产高可用集群当前最新版本Kubernetes v1.32.2,为了后续部分演示所以这里启用了3个Node节点,如果只验证高可用实际上不用Node也可以。
kubernetes集群部署组建清单
这里我们使用了一个VIP来作为统一入口,避免单点风险,这个VIP实现功能要求的所有IP二层互通。
由于CentOS系列已经停止维护了所以这里使用Rocky Linux系统安装Kubernetes,
下载并安装Rocky 9.5操作系统
具体配置如下:
操作系统:Rocky Linux9.5。
配置:6GB内存/6vCPU/80G硬盘
网络:桥接或者NAT模式均可。
开启虚拟机的虚拟化
1.进入内核选择界面时,按上下方向键,取消自动选择
2.输入tab键,复制粘贴进去如下代码
#centos7默认是 ens33
#按照如下操作,修改为eth0
net.ifnames=0 biosdevname=0
3.输入回车,启动
4.请注意,必须是英文,以后再也别用中文了,因为你要看日志
5.只需要修改亚洲上海时区,其他全部默认
6.网络设置、修改静态ip地址、设置主机名
模板机,主机名 template-10
ip,192.168.31.100
网关,192.168.31.254
环境初始化
配置静态IP地址
服务器或者虚拟机的IP地址默认是DHCP动态分配的,这样重启机器IP地址就会发生变化,为了让IP地址固定不变,需要变成静态IP地址,这样机器重启IP地址也不会变化。
Rocky9以前版本配置
我们可以使用vim编辑器打开网络设置文件/etc/sysconfig/network-scripts/ifcfg-ens33
,对该文件进行编辑:
/etc/sysconfig/network-scripts是网络设置文件所在的目录。
ifcfg-eth0是一个网络接口文件,它指定了网络参数,例如IP地址、子网掩码、网关等。
配置文件如下
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.31.100
PREFIX=24
GATEWAY=192.168.31.254
DNS1=223.5.5.5
重启网络服务让配置生效
service network restart
Rocky9以后版本配置
Rocky9以后的版本更改了网络配置文件地址
我们可以使用vim编辑器打开网络设置文件/etc/NetworkManager/system-connections/ens160.nmconnection
,对该文件进行编辑:
/etc/NetworkManager/system-connections是网络设置文件所在的目录。
ens160.nmconnection是一个网络接口文件,它指定了网络参数,例如IP地址、子网掩码、网关等。
配置文件如下
[connection]
id=ens160
uuid=5f163b9e-b3fb-3e43-80d6-5cd5e80537e5
type=ethernet
autoconnect-priority=-999
interface-name=ens160
timestamp=1747583486
[ethernet]
[ipv4]
address1=192.168.31.100/24,192.168.31.254
dns=192.168.31.254;
method=manual
[ipv6]
addr-gen-mode=eui64
method=auto
[proxy]
重启网络服务让配置生效
nmcli connection reload
nmcli connection up ens160
注意:DNS1需要与网关一致
修改主机名
把192.168.31.100~2主机名设置成k8smaster1~3:
hostnamectl set-hostname k8smaster01 && bash
hostnamectl set-hostname k8smaster02 && bash
hostnamectl set-hostname k8smaster03 && bash
把192.168.31.111~3主机名设置成 k8snode1~3:
hostnamectl set-hostname k8snode01 && bash
hostnamectl set-hostname k8snode02 && bash
hostnamectl set-hostname k8snode03 && bash
把192.168.31.105主机名设置成 k8svip-105:
hostnamectl set-hostname k8svip-105 && bash
配置hosts解析,通过主机名访问不同的机器
cat > /etc/hosts <<EOF
# 外网地址 主机名
192.168.31.100 k8smaster01
192.168.31.101 k8smaster02
192.168.31.102 k8smaster03
192.168.31.111 k8snode01
192.168.31.112 k8snode02
192.168.31.113 k8snode03
192.168.31.105 k8svip-105
EOF
关闭网络配置图形化界面、防火墙、selinux
关闭网络配置图形化界面
systemctl stop firewalld NetworkManager
systemctl disable firewalld NetworkManager
#Rocky9以后版本不用关闭
关闭防火墙、selinux
临时关闭内置防火墙
setenforce 0
[root@k8smaster01 ~]# getenforce
Permissive
1.永久关闭内置防火墙selinux
sed -i '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config
[root@k8smaster01 ~]# grep -i 'selinux=' /etc/selinux/config
# SELINUX= can take one of these three values:
SELINUX=disabled
#需要reboot重启服务器,可以先把外置防火墙关闭后重启。
2.清空防火墙规则
iptables -F
关闭firewalld防火墙服务
[root@k8smaster01 ~]# systemctl stop firewalld
[root@k8smaster01 ~]# systemctl disable firewalld
iptables -X
iptables -Z
3.最后检查
[root@k8smaster01 ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@k8smaster01 ~]# systemctl is-enabled firewalld NetworkManager
disabled
disabled
#Rocky9以后版本不用关闭firewalld NetworkManager
关闭交换分区
#临时关闭交换分区
swapoff -a
#永久关闭swap,并取消开启启动(如果没有可忽略)
vim /etc/fstab
#/dev/mapper/rl-swap none swap defaults 0 0
安装tab补齐工具(安装基础软件部分里有)
因为最小化安装没有tab补齐工具
1.检查是否安装tab补齐软件包(如果是最小化安装,默认没有)
rpm -q bash-completion
2.yum安装bash-completion
yum -y install bash-completion
3.立即生效配置
source /etc/profile.d/bash_completion.sh
配置yum源
备份原有源配置
mkdir /etc/yum.repos.d/backup #创建备份文件夹
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup #移动所以得repo后缀的文件到bak目录下
替换为国内镜像源
1. 阿里云镜像源(推荐)
Rocky Linux 8.x/9.x
# 替换所有 .repo 文件的镜像地址
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/rocky-*.repo
2.清华大学镜像源
Rocky Linux 8.x/9.x
sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
-e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.tuna.tsinghua.edu.cn/rockylinux|g' \
-i.bak \
/etc/yum.repos.d/rocky-*.repo
更新缓存并验证
# 清理旧缓存
sudo dnf clean all
# 生成新缓存
sudo dnf makecache
# 验证配置是否生效(检查仓库地址)
sudo dnf repolist
配置 EPEL 扩展源
# 安装 EPEL 仓库
sudo dnf install -y epel-release
# 替换 EPEL 镜像源(阿里云)
sudo sed -e 's|^metalink|#metalink|g' \
-e 's|^#baseurl=https://download.example/pub/epel|baseurl=https://mirrors.aliyun.com/epel|g' \
-i.bak \
/etc/yum.repos.d/epel*.repo
# 更新缓存
sudo dnf clean all && sudo dnf makecache
sudo vim /etc/yum.repos.d/cisco-openh264.repo
[cisco-openh264]
name=Cisco OpenH264 Repository
baseurl=http://example.com/repo/path/
enabled=1
gpgcheck=0
补充:epel-cisco-openh264.repo 即 Cisco OpenH264 仓库似乎暂无国内镜像,速度慢禁用即可。
# 或者编辑 /etc/yum.repos.d/epel-cisco-openh264.repo 修改 enabled=0
yum -y install yum-utils
yum-config-manager --enable epel-cisco-openh264
清理并重新生成软件包信息缓存
# 备注:yum=dnf
yum clean all
rm -rf /var/cache/yum
yum makecache
#此命令需要已经 makecache, 删除软件包的同时将系统中该软件包不需要的依赖项全部移除
#yum autoremove
安装常用软件包
# 启用名为 "crb" 的配置管理器, 安装一些官方源不提供的软件包
sudo dnf config-manager --set-enabled crb
# 安装 EPEL 存储库
sudo yum -y install epel-release
sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
sudo yum install https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
# dnf group list
# “Development Tools”软件包组,包含了大部分基础开发所需要的软件包
sudo yum -y group install "Development Tools"
安装基础软件
yum install -y tree wget bash-completion bash-completion-extras lrzsz net-tools sysstat iotop iftop htop unzip telnet ntpdate lsof vim
关闭邮件告警
echo 'unset mailcheck' >> /etc/profile
source /etc/profile
配置安装Docker和Containerd需要的阿里云的在线yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
配置安装Kubernetes组件需要的阿里云的在线yum源
Kubernetes命令包在本地源是不存在的,需要配置阿里云在线源用于安装Kubernetes命令行工具。配置步骤如下:
[root@k8smaster01 ~]#vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
如用需要可以将k8smaster01上的kubernetes.repo源通过scp远程复制工具复制到k8snode01服务器的/etc/yum.repos.d/目录下:
scp /etc/yum.repos.d/kubernetes.repo k8snode01:/etc/yum.repos.d/
配置时间同步
安装ntpdate命令
yum install ntpdate -y
与网络时间同步
ntpdate time1.aliyun.com
把时间同步做成计划任务
检查时间同步服务是否运行
[root@k8smaster01 ~]#systemctl status crond
写入时间同步信息
[root@k8smaster01 ~]#crontab -e
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
检查定时任务、
[rootk8smaster01 ~]#crontab -l
* * * * * /usr/sbin/ntpdate time1.aliyun.com > /dev/null 2>&1
#或者
[root@k8smaster01 ~]#cat /var/spool/cron/root
重启crond服务
service crond restart
linux(rocky)设置更新服务器时间
CentOS8(或rocky8)系统中,原有的时间同步服务 ntp/ntpdate服务已经无法使用,使用yum安装,提示已不存在。如下:
root@k8smaster01 ~]# sudo dnf install ntpdate
正在忽略仓库:epel-cisco-openh264
上次元数据过期检查:0:00:15 前,执行于 2025年05月18日 星期日 20时51分55秒。
未找到匹配的参数: ntpdate
错误:没有任何匹配: ntpdate
要解决更新服务器时间问题,按下列步骤进行:
首先安装chrony
#使用dnf安装
dnf install -y chrony
# 也可以用yum安装
yum install -y chrony
下列是一些chrony相关的命令:
1.1 开启chronyd服务 systemctl start chronyd
1.2 设置开机自启动 systemctl enable chronyd
1.3 设置开机自启动从配置文件中保存退出后,重启chronyd服务 systemctl restart chronyd
编辑配置文件
[root@localhost ~]# vim /etc/chrony.conf
pool ntp1.aliyun.com iburst
pool ntp.tencent.com iburst
pool ntp1.bce.baidu.com iburst
重启网络时间服务chrony,并设置服务后台运行
systemctl restart chronyd
systemctl enable chronyd
克隆部署其他几台虚拟机
修改机器内核参数
加载br_netfilter模块
br_netfilter叫作透明防火墙(Transparent Firewall),又称桥接模式防火墙(Bridge Firewall)。简单来说,就是在网桥设备上加入防火墙功能。透明防火墙具有部署能力强、隐蔽性好、安全性高的优点。开启ip6tables和iptables需要加载透明防火墙。可以使用modprobe命令加载Linux机器的内核模块:
#添加内核模块自启动,Dcoekr版本不需要,但是Containerd需要
[root@k8smaster01 ~]# modprobe br_netfilter
#以上操作7台虚拟机均需要
以上配置完成以后,所有机器都重启一次,然后检查内核模块是否正常加载,确保所有准备工作都是符合预期的。
启用相关内核参数
开启内核参数的代码清单:
[root@k8smaster01 ~]# cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward = 1
EOF
[root@k8smaster01 ~]# sysctl -p /etc/sysctl.d/k8s.conf
[root@k8smaster01 ~]# sysctl --system
#以上操作7台虚拟机均需要,
#重启,重启是为了让哪些参数能够自动生效。
reboot
部署
安装Containerd
从Kubernetes 1.20版本开始,Kubernetes官方已经将默认的容器运行时从Docker改为Containerd。因此,从Kubernetes 1.20开始,Kubernetes官方将支持使用Docker和Containerd作为容器运行时,同时也意味着Kubernetes从Docker的依赖中解耦了出来。在Kubernetes 1.24及之后的版本中,Docker作为容器运行时已经被官方弃用,Containerd成为唯一推荐的容器运行时。具体安装步骤如下:
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum install -y containerd.io
#以上操作7台虚拟机均需要
接下来生成Containerd的配置文件:
[root@k8smaster01 ~]#mkdir -p /etc/containerd
[root@k8smaster01 ~]#containerd config default > /etc/containerd/config.toml
#修改配置文件:
vi /etc/containerd/config.toml
把SystemdCgroup = false修改成SystemdCgroup = true
把sandbox_image = "k8s.gcr.io/pause:3.6"修改成sandbox_image="registry.aliyuncs.com/google_containers/pause:3.10"
#创建/etc/crictl.yaml文件:
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
#启动containerd
systemctl start containerd
systemctl enable containerd
#以上操作7台虚拟机均需要
配置镜像加速器
注:Kubernetes所有节点均按照以下步骤配置镜像加速器:
编辑
vim /etc/containerd/config.toml
文件。找到
config_path = ""
,指定证书存放目录:config_path = "/etc/containerd/certs.d"
。config_path = "/etc/containerd/certs.d"用于指定Containerd的证书目录路径。该目录用于存储容器镜像仓库的证书和密钥,以便Containerd可以在与远程仓库通信时进行身份验证和加密通信。默认情况下,Containerd使用/etc/containerd目录来存储其所有的配置和数据文件,其中包括镜像、容器、事件、日志等。/etc/containerd/certs.d则是该目录下的一个子目录,用于存储容器镜像仓库的证书和密钥。如果需要与受信任的私有镜像仓库通信,就需要将其证书和密钥复制到这个目录中。
mkdir /etc/containerd/certs.d/docker.io/ -p
编辑hosts.toml文件:
vim /etc/containerd/certs.d/docker.io/hosts.toml
#Hosts.toml写入如下内容:
[host."https://uzjaa0ie.mirror.aliyuncs.com",host."https://registry.docker-cn.com"]
capabilities = ["pull","push"]
#重启Containerd使配置生效:
systemctl restart containerd
Docker也要安装,Docker跟Containerd不冲突,安装Docker是为了能基于Dockerfile构建镜像:
yum install docker-ce -y
systemctl enable docker
配置Docker镜像加速器,Kubernetes所有节点均按照以下配置进行:
vim /etc/docker/daemon.json
#写入如下内容:
{
"registry-mirrors":["https://uzjaa0ie.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
}
#执行以下命令,重启Docker使配置生效:
systemctl restart docker
安装kubernetes基础软件
#安装必要的软件
yum -y install kubelet kubeadm kubectl
systemctl start kubelet && systemctl enable kubelet
#Kubernetes所有节点均按照以下步骤配置
Kubelet、Kubeadm和Kubectl都是Kubernetes的组件,其具体解释如下。
Kubelet:Kubernetes的一个核心组件,负责在每个节点上运行Pod并管理其生命周期,它通过容器运行时(如Docker或Containerd)来运行容器。Kubelet负责监控容器的状态、资源使用情况和网络连接情况,并将这些信息报告给Kubernetes的其他组件,以便它们可以协调容器在整个集群中的运行。
Kubeadm:用于启动Kubernetes集群的命令行工具。它负责在集群中的每个节点上初始化Kubernetes控制面和工作负载节点的各种资源。Kubeadm还可以协调集群组件之间的相互依赖关系,并配置默认的网络插件和其他功能。
Kubectl:Kubernetes的命令行工具,可用于管理Kubernetes集群的各个方面,包括创建、部署、管理和监控应用程序、服务和资源。Kubectl可以与Kubernetes API服务器交互,以管理集群的各个方面。
配置VIP
这里我们选择100和101这2台服务器来承担vip的责任,因为3节点的集群只允许挂1台,挂2台集群是不可用的。本小节操作只在100和101服务器执行。
yum -y install keepalived
#100服务配置vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state MASTER # 设置为主节点
interface ens3 # 网络接口,根据实际情况修改
virtual_router_id 51 # VRRP 路由ID,主备节点必须相同
priority 100 # 优先级,主节点必须高于备份节点
advert_int 1 # VRRP通告间隔,单位秒
authentication {
auth_type PASS # 认证类型
auth_pass 123123 # 认证密码,主备节点必须相同
}
virtual_ipaddress {
192.168.31.105 # 虚拟IP地址,可以根据实际情况修改
}
}
#101服务配置vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL
}
vrrp_instance VI_1 {
state BACKUP # 设置为备份节点
interface ens3 # 确保使用正确的网络接口名称
virtual_router_id 51 # VRRP 路由ID,主备节点必须相同
priority 50 # 优先级,备份节点必须低于主节点
advert_int 1 # VRRP通告间隔,单位秒
authentication {
auth_type PASS # 认证类型
auth_pass 123123 # 认证密码,主备节点必须相同
}
virtual_ipaddress {
192.168.31.105 # 虚拟IP地址,与主节点相同
}
}
#启动服务
systemctl start keepalived
systemctl enable keepalived
Kubeadm初始化Kubernetes集群
因为这里需要把证书加到100年,所以只能通过配置文件形式,命令行方式不能直接实现,根据资料这个支持是从v1.31开始支持。
这里主要指定了一些临时token,并指定了容器运行时,和证书路径及VIP信息,etcd路径,和镜像下载地址,版本,默认域名,Pod和Service的IP地址段,证书包含的IP地址(也可以用域名替代,避免后面出现IP更换的问题)CA和签发证书的时间。
kubeadm config print init-defaults > kubeadm.yaml
kubeadm.yaml配置文件如下:
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: ufw2x5.c255p8a0437pxp0x
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
imagePullSerial: true
---
apiVersion: kubeadm.k8s.io/v1beta4
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: 192.168.31.105:6443
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.32.2
networking:
dnsDomain: cluster.local
podSubnet: 10.20.0.0/16
serviceSubnet: 10.10.0.0/16
proxy: {}
scheduler: {}
apiServer:
certSANs:
- 192.168.31.105
- 192.168.31.100
- 192.168.31.101
- 192.168.31.102
- 127.0.0.1
caCertificateValidityPeriod: 876000h0m0s
certificateValidityPeriod: 876000h0m0s
基于kubeadm.yaml初始化Kubernetes集群
kubeadm init --config=kubeadm.yaml --upload-certs
如图所示说明安装完成
配置Kubectl的配置文件config
默认安装Kubernetes之后,Kubectl是没有权限访问Kubernetes API的,所以需要有一个config文件,相当于对Kubectl进行授权,这样kubectl命令可以使用config文件中的用户和证书对Kubernetes集群进行管理。
具体操作步骤如下:
(1)在当前家(HOME)目录下创建一个目录.kube,用来存放安全上下文config文件。
mkdir -p $HOME/.kube
.kube
目录是Kubernetes中非常重要的目录,它存储了集群的配置信息和其他资源,例如,kubectl命令使用kubeconfig配置文件访问Kubernetes API Server。
(2)把/etc/kubernetes/admin.conf复制到.kube下并重命名成config。
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
(3)修改属主和属组。
sudo chown $(id -u):$(id -g) $HOME/.kube/config
该命令将当前用户的家目录下的.kube目录中的config文件所有者更改为当前用户。
chown命令表示更改文件或目录的所有者和所属组。
$(id -u)和$(id -g)表示从id命令中获取当前登录用户的用户ID(UserID,UID)和所属组ID(GroupID,GID)。
config文件必须由当前用户或由具有该文件的所有权的用户修改。上述命令可以确保该配置文件始终由当前用户所有,以确保当前用户拥有对此文件的完全访问权限,以便在必要时进行更改、编辑或更新。
(4)查看Kubernetes集群。
kubectl get nodes
该命令用来查看Kubernetes集群状态。
显示结果如下:
NAME STATUS ROLES AGE VERSION
k8smaster01 NotReady control-plane,master 60s v1.32.2
添加网络插件
#由于我配置修改了Pod的ip地址,所以需要下下载,然后修改
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
sed -i 's/10.244/10.20/g' kube-flannel.yml
kubectl apply -f kube-flannel.yml
检查集群状态
kubectl get node
#node节点链接使用vip
cat /etc/kubernetes/kubelet.conf |grep server
server: https://192.168.31.105:6443
检查高可用&证书
这里我们关闭了k8smaster01节点,这个时候显示k8smaster01已经是NotReady,VIP也飘逸到了k8smaster02节点。并且集群也可以正常使用。
#无论是CA证书,还是CA签发的证书都是100年
kubeadm certs check-expiration
#kubelet的证书也是100年
[root@master01 ~]# openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -enddate
notAfter=Feb 16 15:47:21 2125 GMT