小橘子大叔

  • 1. 环境准备(在所有主机上操作)
  • 2. 安装 containerd(所有节点运行)
  • 3. 安装 kubeadm、kubelet、kubectl(所有节点执行)
  • 4. 安装集群
  • 首页
  • nginx
  • Linux
  • docker
  • Kubernetes
  • Prometheus
  • 生活
  • 文章归档
  • 友情链接
  • Instagram
  • TikTok
  • X
欢迎随时联系本人
  • Mail

K8s1.24.1高可用集群部署完整流程(弃用docker)

  • luxy
  • 2025-03-21
  • 1

前前后后也部署过几套k8s集群了,但每次都要看其他人的文档,每次又要出不同的问题,再加上想部署一套使用containerd作为容器运行时的集群环境,于是乎写下这一篇细致的参考文档。

操作系统 主机 IP 主机名 角色
CentOS7.9192.168.239.125
192.168.239.199(VIP)
k8s-master01master1
CentOS7.9192.168.239.126k8s-master01master2
CentOS7.9192.168.239.127k8s-master01master3
以上为我自己的集群信息

1. 环境准备(在所有主机上操作)

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

关闭 selinux

SELinux可能干扰容器网络接口和文件访问权限。

# 临时关闭
setenforce 0 
#永久关闭
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config

关闭 swap

# 临时
swapoff -a 
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab

修改主机名

hostnamectl set-hostname k8s-master01   在master1上操作

hostnamectl set-hostname k8s-master02   在master2上操作   

hostnamectl set-hostname k8s-master03   在master3上操作

配置 Host

cat >> /etc/hosts << EOF
192.168.239.125   k8s-master01
192.168.239.126   k8s-master02
192.168.239.127   k8s-master03
EOF

时间同步

yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources

安装依赖包


yum install -y conntrack ntpdate ntp  ipset jq iptables curl sysstat libseccomp wget vim net-tools git

升级系统内核(可选)

# 升级系统内核为 4.44(可选)
# CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的Kubernetes 不稳定,查看内核命令uname -r,升级步骤如下:
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
#安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次!
yum --enablerepo=elrepo-kernel install -y kernel-lt
#设置开机从新内核启动
grub2-set-default "CentOS Linux (4.4.182-1.el7.elrepo.x86_64) 7 (Core)"
# 重启后产看内核变化
reboot

设置内核参数

br_netfilter模块可以使 iptables 规则可以在 Linux Bridges 上面工作,用于将桥接的流量转发至iptables链
启用 bridge-nf-call-iptables 这个内核参数 (置为 1),表示 bridge 设备在二层转发时也去调用 iptables 配置的三层规则 (包含 conntrack)
具体可参考【博客515】k8s中为什么需要br_netfilter与net.bridge.bridge-nf-call-iptables=1-CSDN博客

cat > /etc/sysctl.d/99-kubernetes-cri.conf <<EOF
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
vm.swappiness=0
EOF
# 生效
sysctl --system

加载内核模块

# 加载 overlay 模块
$ modprobe overlay
# 加载 br_netfilter 模块
$ modprobe br_netfilter

安装 ipvsadm并配置 至于为什么选择ipvs而不使用iptables,可自行搜索

yum install ipvsadm -y
#由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块
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_ipv4
EOF
#运行并查看
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
若发现没有nf_conntrack_ipv4,因为新内核的原因,已经合并到了nf_conntrack

systemctl daemon-reload
systemctl enable ipvsadm
systemctl restart ipvsam

2. 安装 containerd(所有节点运行)

containerd 是从 docker 中分离出来的一个项目,可以作为一个底层容器运行时,现在它成了 Kubernete 容器运行时更好的选择。从 1.24 开始,K8S 已取消 docker 作为其默认运行时。只关心容器生命周期的话,docker太大了,containerd是个更好的选择,其次,kubelet 任何一次重要功能的更新,都不得不考虑 Docker 的处理场景,然后更新 Docker部分代码(早期dockershim 依然是 kubelet 代码的一部分)。

安装依赖

yum install yum-utils device-mapper-persistent-data lvm2 iproute-tc -y

配置yum源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装 containerd

yum install containerd.io-1.6.6-3.1.el8.x86_64 -y

如果说no pacakge,运行yum list --showduplicates containerd.io,选择适合版本。

生成配置文件

containerd config default > /etc/containerd/config.toml

修改配置文件

# 修改 cgroups 为 systemd
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 修改 pause 镜像地址(一定要保证执行成功,最好运行后去检查一下,当然,如果你肉身在国外就无妨)
sed -i 's/k8s.gcr.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml

# 修改容器存储路径到空间比较充裕的路径
root = "/var/lib/containerd"

配置 crictl

cat <<EOF> /etc/crictl.yaml 
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF

启动服务

systemctl enable containerd
systemctl daemon-reload
systemctl restart containerd
#检查一下
systemctl status containerd

3. 安装 kubeadm、kubelet、kubectl(所有节点执行)

配置 yum 源

cat > /etc/yum.repos.d/kubernetes.repo << EOF
[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

安装

# 安装组件
yum install kubectl-1.24.1-0.x86_64 kubelet-1.24.1-0.x86_64 kubeadm-1.24.1-0.x86_64 -y

# 设置开机启动
systemctl enable kubelet
systemctl daemon-reload
systemctl restart kubelet

4. 安装集群

安装 Keepalived 服务,安装完后ip a检查一下

yum install keepalived -y

修改配置文件:

vim /etc/keepalived/keepalived.conf

# 参考如下配置,<strong>若发现ping不通vip,关闭vrrp_strict</strong>
global_defs {
   router_id GA_K8S
}

vrrp_instance VI_1 {
    # 节点类型(master或 backup,1 个集群只有 1 个 MASTER角色,其它为 BACKUP角色)
    state MASTER
    # 绑定的网卡
    interface eth0
    virtual_router_id 200
    # 优先级,值越大,优先级越高
    priority 100
    nopreempt
    advert_int 1
    # authentication三个节点都一样
    authentication {
        auth_type PASS
        auth_pass jdvm2vm8weiyhlwa
    }
    virtual_ipaddress {
        # VIP 地址
        192.168.239.199
    }
}

systemctl daemon-reload
systemctl restart keepalived
systemctl enable keepalived

安装 Haproxy

yum install -y haproxy

修改配置文件(参考如下)

#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend  main *:5000
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js

    use_backend static          if url_static
    default_backend             app

frontend kubernetes-frontend <strong>#注意</strong>
    bind *:16443
    mode tcp
    default_backend kubernetes-backend

#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static
    balance     roundrobin
    server      static 127.0.0.1:4331 check

#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app
    balance     roundrobin
    server  app1 127.0.0.1:5001 check
    server  app2 127.0.0.1:5002 check
    server  app3 127.0.0.1:5003 check
    server  app4 127.0.0.1:5004 check

backend kubernetes-backend <strong>#注意</strong>
  mode tcp
  timeout queue 1h
  timeout server 1h
  timeout connect 1h
  log global
  balance roundrobin
  server rancher01 192.168.239.125:6443  
  server rancher02 192.168.239.126:6443  
  server rancher03 192.168.239.127:6443


systemctl daemon-reload
systemctl enable haproxy  
# 检查一下
systemctl restart haproxy

初始化 Master 节点(参考如下,可复制过去修改一下ip)

# 生成并修改配置文件
mkdir /app
kubeadm config print init-defaults > kubeadm.yaml
#可参考我的kubeadm.yaml
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
bootstrapTokens:
  - groups:
      - system:bootstrappers:kubeadm:default-node-token
    token: abcdef.0123456789abcdef
    ttl: 24h0m0s
    usages:
      - signing
      - authentication
localAPIEndpoint:
  # 控制平面的 IP 地址
  advertiseAddress: 192.168.239.125 <strong>#注意</strong>
  bindPort: 6443
nodeRegistration:
  # 容器运行时 socket 文件地址
  criSocket: unix:///var/run/containerd/containerd.sock
  imagePullPolicy: IfNotPresent
  # 控制平面主机名(可选)
  name: k8s-master01
  taints:
    - effect: NoSchedule
      key: node-role.kubernetes.io/master

---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
apiServer:
  timeoutForControlPlane: 4m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "192.168.239.199:16443" <strong># 注意</strong>
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
# 镜像服务地址
imageRepository: registry.aliyuncs.com/google_containers
# Kubernetes 版本
kubernetesVersion: 1.24.1 <strong># 注意</strong>
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16 <strong># 注意</strong>
  # Service 的网段
  serviceSubnet: 10.96.0.0/16
scheduler: {}

---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd

拉取镜像并初始化master节点

# 查看所需镜像列表
kubeadm config images list --config /app/kubeadm.yml
# 拉取镜像
kubeadm config images pull --config /app/kubeadm.yml
# 根据配置文件启动 kubeadm 初始化 k8s <strong>(只在master1节点执行)</strong>
kubeadm init --config=/root/app/kubeadm.yml --upload-certs

若初始化失败

kubeadm reset
rm -rf /etc/kubernetes/

根据概率来说,你可能会遇到部署失败问题,运行journalctl -u kubelet得到如下问题

检查一下kubeadm.yaml,是否ip填写错误。检查一下sed -i 's/k8s.gcr.io/registry.aliyuncs.com\/google_containers/g' /etc/containerd/config.toml是否执行成功。

如果部署成功,会显示两个命令,一个加入worker节点的,一个是加入control-plane节点的,请选择将master节点加入,如

kubeadm join 192.168.239.199:16443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:3708c507fb572724d7d85c2f738826d5028f26165120a6bfaec1a67265b01bae --control-plane --certificate-key 293f6d84152b6f98aa8e20bda478a0cda506482b58cd4bb1bb0db7d8524469b8
<strong>#上面命令在其他两个节点执行</strong>

下面的命令在执行完后需要在所有节点执行,会有提示,如

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

安装fannel网络插件

需要mirrored-flannelcni-flannel.tar mirrored-flannelcni-flannel-cni-plugin.tar flannel.tar flannel.yaml这四个文件,请自行搜索并下载,若需要,联系wuhongyu191@gmail.com。

下载好后,执行

ctr -n k8s.io i import mirrored-flannelcni-flannel-cni-plugin.tar
ctr -n k8s.io i import mirrored-flannelcni-flannel.tar
ctr -n k8s.io i import flannel.tar 
# 看看镜像是否有
crictl images

移除污点

# master1节点执行
kubectl taint nodes k8s-master01 node-role.kubernetes.io/master:NoSchedule-
# master2节点执行
kubectl taint nodes k8s-master02 node-role.kubernetes.io/master:NoSchedule-
# master3节点执行
kubectl taint nodes k8s-master03 node-role.kubernetes.io/master:NoSchedule-

最后执行

kubectl apply -f flannel.yaml

查看集群状态

kubectl get nodes
kubectl get pods -A

OVER!!!

© 2025 小橘子大叔
Theme by Wing
  • {{ item.name }}
  • {{ item.name }}