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
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐