K8S - 安装篇 centos7.9安装k8s v1.23.6
·
K8S - 安装篇 centos7.9安装k8s v1.23.6
kubernetes组件架构图

一、Kubernetes 集群架构
Kubernetes 集群主要由以下节点组成:
| 主机名 | IP | 角色 | 组件 | 配置 |
|---|---|---|---|---|
| master | 192.168.80.10 | 管理节点 | kube-apiserver、kube-controller-manager、etcd、docker/containerd | 2C2G |
| wokr01 | 192.168.80.11 | 工作节点1 | kube-proxy、calico、docker/containerd | 2C2G |
| wokr02 | 192.168.80.12 | 工作节点2 | kube-proxy、calico、docker/containerd | 2C2G |
| harbor(非必须) | 192.168.80.15 | 私有镜像仓库 | harbor、docker | 2C2G |
二、kubernetes安装前设置(源、镜像及相关配置)
2.1 基础环境配置(所有节点)
hostnamectl set-hostname master && bash
hostnamectl set-hostname work01 && bash
hostnamectl set-hostname work02 && bash
cat >> /etc/hosts <<EOF
192.168.1.10 master
192.168.1.11 work01
192.168.1.12 work02
192.168.1.15 harbor
EOF
2.2 验证mac地址uuid
保证各节点mac和uuid唯一,避免克隆虚拟机后uuid一致导致加入集群异常。
cat /sys/class/net/ens160/address
cat /sys/class/dmi/id/product_uuid
2.3 时间同步
2.3.1 master节点设置
yum -y install chrony
vim /etc/chrony.conf
*# Use public servers from the pool.ntp.org project.# Please consider joining the pool (http://www.pool.ntp.org/join.html).*
server ntp.aliyun.com iburst
systemctl start chronyd
systemctl enable chronyd
timedatectl set-timezone Asia/Shanghai
chronyc sources
2.3.2 node节点配置
yum -y install chrony
vim /etc/chrony.conf
*# Use public servers from the pool.ntp.org project.# Please consider joining the pool (http://www.pool.ntp.org/join.html).*
server 192.168.80.10
systemctl start chronyd
systemctl enable chronyd
chronyc sources
2.3.3 设置防火墙规则
所有节点配置
systemctl stop firewalld
systemctl disable firewalld
yum -y install iptables-services
systemctl start iptables
systemctl enable iptables
iptables -F
service iptables save
2.4 关闭selinux
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
2.5 关闭swap分区
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2.6 其他配置(所有节点)
2.6.1 修改内核相关参数
vm.swappiness = 0 # 最大限度避免使用 swap net.bridge.bridge-nf-call-ip6tables = 1 # 内核在桥接设备上让IPv6流量经过 Netfilter(iptables)过滤。 net.bridge.bridge-nf-call-iptables = 1 # 内核在桥接设备上让IPv4流量经过 Netfilter(iptables)过滤。 net.ipv4.ip_forward = 1 # 允许 IPv4 数据包从一个网络接口转发到另一个网络接口。
cat > /etc/sysctl.d/kubernetes.conf << EOF
vm.swappiness = 0
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p /etc/sysctl.d/kubernetes.conf
加载上面这个模块
modprobe br_netfilter
echo "br_netfilter" > /etc/modules-load.d/k8s.conf
lsmod |grep br_netfilter
# br_netfilter 24576 0
# bridge 290816 1 br_netfilter
2.6.2 kube-proxy开启ipvs的前置条件
yum -y install ipset ipvsadm
mkdir -p /etc/sysconfig/modules/
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF
==================================================================================
该脚本用于在系统启动时加载 Kubernetes kube-proxy 使用 IPVS 模式所需的内核模块
# 加载 IPVS 核心模块(提供负载均衡基础功能)
modprobe -- ip_vs
# 加载 IPVS 调度算法模块(轮询)
modprobe -- ip_vs_rr
# 加载 IPVS 调度算法模块(加权轮询)
modprobe -- ip_vs_wrr
# 加载 IPVS 调度算法模块(哈希一致性)
modprobe -- ip_vs_sh
# 加载连接跟踪模块(用于 NAT 和状态跟踪)
# 注意:在较新内核(如 5.x+)中,此模块可能已改名为 nf_conntrack,
# 或者需要加载 nf_conntrack_ipv4 来支持 IPv4 连接跟踪。
# 如果你的内核不支持 nf_conntrack,可尝试替换为 nf_conntrack_ipv4。
modprobe -- nf_conntrack
==================================================================================
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash
# 执行 IPVS 模块加载脚本,并在成功后过滤显示当前已加载的 IPVS 和连接跟踪相关内核模块
/etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack
# ip_vs_sh 16384 0
# ip_vs_wrr 16384 0
# ip_vs_rr 16384 0
# ip_vs 172032 6 ip_vs_rr,ip_vs_sh,ip_vs_wrr
# nf_conntrack 172032 1 ip_vs
# nf_defrag_ipv6 20480 2 nf_conntrack,ip_vs
# nf_defrag_ipv4 16384 1 nf_conntrack
# libcrc32c 16384 4 nf_conntrack,nf_tables,xfs,ip_vs
*# 添加开机自动加载模块*
echo "/etc/sysconfig/modules/ipvs.modules" >> /etc/rc.local
chmod +x /etc/rc.local
*# 启用网桥过滤器模块*
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
- linux kernel 4.19版本已经将nf_conntrack_ipv4 更新为 nf_conntrack
2.6.3 升级内核
可选,建议4.18及+以上即可
echo "========== 1. 升级前环境 ==========" && \
uname -r && cat /etc/redhat-release && \
echo -e "\n========== 2. 准备离线安装包 ==========" && \
mkdir -p /opt/kernel && cd /opt/kernel && \
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.213-1.el7.elrepo.x86_64.rpm && \
wget http://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.213-1.el7.elrepo.x86_64.rpm && \
echo -e "\n========== 3. 安装新内核 ==========" && \
rpm -ivh kernel-lt-5.4.213-1.el7.elrepo.x86_64.rpm && \
rpm -ivh kernel-lt-devel-5.4.213-1.el7.elrepo.x86_64.rpm && \
echo -e "\n========== 4. 确认已安装内核 ==========" && \
rpm -qa | grep kernel && \
echo -e "\n========== 5. GRUB 启动菜单 ==========" && \
awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg && \
echo -e "\n========== 6. 设置默认启动项(索引0) ==========" && \
grub2-set-default 0 && \
echo -e "\n========== 7. 重新生成GRUB配置 ==========" && \
grub2-mkconfig -o /boot/grub2/grub.cfg && \
echo -e "\n========== 8. 验证默认内核路径 ==========" && \
grubby --default-kernel && \
echo -e "\n========== 9. 系统将在10秒后重启 ==========" && \
sleep 10 && reboot
2.6.4 配置阿里云yum源
k8s版本1.28前,使用如下命令配置yum源。
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
k8s版本1.28以后,例如安装1.30,则修改对应的版本号即可。
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/rpm/repodata/repomd.xml.key
EOF
2.6.5 安装kubeadm、kubectl、kubelet
*# 1. 添加 Kubernetes yum 源(如果还没配置)*
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
*# 2. 安装指定版本 1.23.6*
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6 --disableexcludes=kubernetes
*# 3. 设置开机自启并启动*
systemctl enable kubelet
systemctl start kubelet
systemctl status kubelet
kubelet 运行在集群所有节点上,用于启动Pod和容器等对象的工具
kubeadm 用于初始化集群,启动集群的命令工具
kubectl 用于和集群通信的命令行,通过kubectl可以部署和管理应用,查看各种资源,创建、删除和更新各种组件
- 默认安装最新版,也可以指定老版本安装
yum list kubeadm --showduplicates | sort -r
yum install -y kubelet-1.26.3 kubeadm-1.26.3 kubectl-1.26.3
2.7 安装容器运行时(Docker)
2.7.1 版本选择
每个k8s版本都有对应的docker版本范围,具体参考官方文档https://github.com/kubernetes/kubernetes/releases
2.7.2 docker安装
*# 安装前源准备*
yum install -y yum-utils device-mapper-persistent-data lvm2
*# 配置yum源*
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
*# 查看可安装的docker版本*
yum list docker-ce --showduplicates | sort -r
*# 安装20.10.6版本docker*
yum install -y docker-ce-20.10.7
mkdir -p /etc/docker
curl -L udong.top/docker/daemon.json > /etc/docker/daemon.json
systemctl restart docker
systemctl enable docker
2.7.3 禁用iptables的forward调用链
docker 1.13以上版本默认禁用iptables的forward调用链,因此需要执行开启命令:
iptables -P FORWARD ACCEPT
2.7.4 修改docker cgroup driver为systemd
systemd 是 Kubernetes 自带的 cgroup 管理器,负责为每个进程分配 cgroupfs,但 Docker 的 cgroup driver 默认是 cgroupfs,这样就同时运行了两个 cgroup 控制管理器。当资源有压力时,有可能会出现不稳定的情况。
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.1panel.live",
"https://docker.xuanyuan.me",
"https://hub.rat.dev",
"https://dhub.kubesre.xyz",
"https://docker.m.daocloud.io",
"https://hub.amingg.com",
"https://hub1.nat.tf",
"https://docker.amingg.com",
"https://docker.sunzishaokao.com",
"https://image.cloudlayer.icu",
"https://docker-0.unsee.tech",
"https://docker.hlmirror.com",
"https://docker.kejilion.pro",
"https://docker.tbedu.top"
],
"exec-opts": [
"native.cgroupdriver=systemd"
]
}
EOF
systemctl daemon-reload
systemctl enable docker
systemctl start docker
docker info | grep Driver
# Storage Driver: overlay2
# Logging Driver: json-file
# Cgroup Driver: systemd
三、kubeadm部署(master)
kubeadm init \
--apiserver-advertise-address=192.168.80.10 \
--image-repository=registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.23.6 \
--pod-network-cidr=10.244.0.0/16
# 作为普通用户开始使用集群的步骤:
mkdir -p $HOME/.kube # 创建 .kube 隐藏目录(如果不存在)
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # 将集群管理员配置文件复制为用户配置,-i 覆盖前提示
sudo chown $(id -u):$(id -g) $HOME/.kube/config # 将配置文件的所有者修改为当前用户的 UID 和 GID,使普通用户有权限读取
# 如果是 root 用户,可以直接设置环境变量来使用 kubectl:
export KUBECONFIG=/etc/kubernetes/admin.conf # 临时指定 kubectl 使用的配置文件,仅当前会话有效
# 接下来需要部署 Pod 网络插件:
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
# 运行 kubectl apply 安装 Pod 网络,具体 yaml 文件从官方文档中选择(如 Calico、Flannel 等)
# 其他节点加入集群的命令(在每个 worker 节点上以 root 执行):
kubeadm join 192.168.80.10:6443 \ # 加入控制平面地址及端口,此处为主节点 IP 和 API Server 端口
--token lhgu93.zaahfulul0ijged9 \ # 用于节点加入的一次性引导令牌,前6位为 token ID,后面为 token 密钥
--discovery-token-ca-cert-hash sha256:a7695cc8b1a2444e87ae59f4684e254531afe8d9480ef96a189656ef4341ce93
# 指定 CA 证书哈希值,用于验证 API Server 证书,防止中间人攻击;\ 表示命令换行
kubeadm init \ # 指明用 Master 的哪个 interface 与 Cluster 的其他节点通信。如果 Master 有多个 interface, # 建议明确指定,如果不指定,kubeadm 会自动选择有默认网关的 interface。 --apiserver-advertise-address=192.168.1.100 \ # 指定 Pod 网络的范围。Kubernetes 支持多种网络方案,而且不同网络方案对 --pod-network-cidr # 有自己的要求,这里设置为 10.244.0.0/16 是因为我们将使用 flannel 网络方案,必须设置成这个 CIDR。 --pod-network-cidr=10.244.0.0/16 \ # Kubernetes 默认 Registries 地址是 k8s.gcr.io,在国内并不能访问 gcr.io, # 将其指定为阿里云镜像地址:registry.aliyuncs.com/google_containers。 --image-repository=registry.aliyuncs.com/google_containers \ # 指定 Kubernetes 版本号 --kubernetes-version=v1.23.6
四、启用基于calico的Pod网络
# 下载配置文件calico.yaml
wget https://raw.githubusercontent.com/projectcalico/calico/v3.24.5/manifests/calico.yaml
# 修改两个地方,原文中这两个地方是注释的,修改时注意格式
# /CALICO_IPV4POOL_CIDR
- name: CALICO_IPV4POOL_CIDR
value: "10.244.0.0/16"
# kubeadm init 初始化集群,Pod 网段必须与 Calico 的 CALICO_IPV4POOL_CIDR 保持一致(10.10.0.0/16)
# 修改 IP_AUTODETECTION_METHOD(网卡指定)
# /autodetect
# 在该行下面插一行 value: "autodetect"
- name: IP_AUTODETECTION_METHOD
value: "interface=ens32"
# CALICO_IPV4POOL_IPIP(IPIP 模式)
# /CALICO_IPV4POOL_IPIP
- name: CALICO_IPV4POOL_IPIP
value: "Always"
# 直接把 calico.yaml 中所有 docker.io/calico 修改为国内镜像仓库
sed -i 's#docker.io/calico#docker.m.daocloud.io/calico#g' calico.yaml
[root@master calico]# sed -i 's#docker.io/calico#docker.m.daocloud.io/calico#g' calico.yaml
[root@master calico]# grep "image:" calico.yaml
image: docker.m.daocloud.io/calico/cni:v3.24.5
image: docker.m.daocloud.io/calico/cni:v3.24.5
image: docker.m.daocloud.io/calico/node:v3.24.5
image: docker.m.daocloud.io/calico/node:v3.24.5
image: docker.m.daocloud.io/calico/kube-controllers:v3.24.5
五、kubeadm加入node节点
kubeadm join 192.168.80.10:6443 \ # 加入控制平面地址及端口,此处为主节点 IP 和 API Server 端口
--token lhgu93.zaahfulul0ijged9 \ # 用于节点加入的一次性引导令牌,前6位为 token ID,后面为 token 密钥
--discovery-token-ca-cert-hash sha256:a7695cc8b1a2444e87ae59f4684e254531afe8d9480ef96a189656ef4341ce93
更多推荐




所有评论(0)