求份搭建高可用 k8s 的教程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sakurawzt
V2EX    Kubernetes

求份搭建高可用 k8s 的教程

  •  
  •   sakurawzt 20 小时 11 分钟前 1303 次点击

    家里组了台工控机可以用 esxi 划分出来几个虚拟机,想搭建 k8s 学习学习,故求一份高可用的搭建教程

    21 条回复    2025-10-30 17:37:10 +08:00
    Lee2019
        1
    Lee2019  
       20 小时 5 分钟前   5
    SuperGeorge
        2
    SuperGeorge  
       19 小时 57 分钟前
    家里云不需要高可用,直接 kubeadm 初始化集群就行了。
    sakurawzt
        3
    sakurawzt  
    OP
       19 小时 51 分钟前
    @SuperGeorge 想学习一下 keepalived ( VRRP 漂移 VIP )+ HAProxy/Nginx (转发到多台 apiserver )这个
    xiaohuangya
        4
    xiaohuangya  
       19 小时 51 分钟前
    你的服务不多,使用不频繁,所谓的高可用没有意义。
    sakurawzt
        5
    sakurawzt  
    OP
       19 小时 49 分钟前
    @xiaohuangya 主要是想学习
    evill
        6
    evill  
       19 小时 44 分钟前
    keepalived + Nginx 这个和 k8s 的高可用没什么关系,这个是机器不可用/网络故障的方面的高可用 例如多实例提高 SLA

    k8s 的高可用应该是高可用 master 、etcd 集群、外置 coreDNS 这些
    SuperGeorge
        7
    SuperGeorge  
       19 小时 44 分钟前   1
    @sakurawzt 那看看官方的 https://kubespray.io
    sakurawzt
        8
    sakurawzt  
    OP
       19 小时 39 分钟前
    @evill 噢噢,都想学习一下
    sakurawzt
        9
    sakurawzt  
    OP
       19 小时 39 分钟前
    @SuperGeorge 好的我去看看
    pordria
        10
    pordria  
       19 小时 26 分钟前
    github 上有很多 ansible+kubeadm 的搭建方案,ansible 本质就是批量执行一些脚本,你可以照着哪些脚本去熟悉搭建流程,大概应该是这个样子,记不太清了:
    1. 安装依赖包;
    2. 系统设置(关闭交换内存,防火墙,selinux ,加载内核模块等)
    3. 安装容器运行时(常见 containerd ,或者 cri-docker+docker )
    4. 安装 kubeadm,kubectl,kubelet,crictl 等二进制
    5. 准备科学上网环境下载必要组件镜像( kubeadm config images list 应该可以拿到镜像列表)
    6. kubeadm init 创建 master 节点,kubedm join ... 加入额外 master 节点; kubeadm join 加入 worker 节点
    6. 安装容器网络 calico 之类的
    raptor
        11
    raptor  
       19 小时 14 分钟前
    让 AI 手把手教你啊,这是学新技术最快的方式之一
    BeautifulSoap
        12
    BeautifulSoap  
       18 小时 57 分钟前
    不懂 k8s 的话建议先从 k3s 开始快速搭个集群学习然后再慢慢接触官方的教程

    虽然学习高可用是可以,但是个人使用高可用真的完全是鸡肋。反倒 k8s 里面最薄弱的一个环节etcd 经常是把你集群整死的元凶
    我现在建个人集群都是直接 k3s 然后配合单点 mysql 。控制平面最多两个节点。自从这样后以前半年崩一次的集群已经好几年没蹦过了,备份集群数据更是简单到炸。只要有 mysql 的备份或原始数据直接轻松恢复整个集群
    midsolo
        13
    midsolo  
       18 小时 43 分钟前
    学习的话建议从 minikube 开始,然后搭一套 k3s 环境,部署一些常见的中间件进去,再慢慢看 k8s 的官方教程。
    Geon97
        14
    Geon97  
       18 小时 40 分钟前
    话说现在大家都有什么版本的 k8s?还是选择支持 dockerd 的版本吗?
    hejw19970413
        15
    hejw19970413  
       18 小时 38 分钟前
    自己玩可以如果企业搭建先建 ETCD ,家里玩尽量用 Debian ,Ubuntu 等用的比较多的,别弄国产
    要先弄 Keeplived + HA

    *前提:*

    ```
    1. 选择官方推荐版本并且不要选择最新版的
    2. 国内存在着镜像拉取问题
    3. 如果服务没起来需要看一下 containerd 服务
    ```

    *准备工作:*

    ```
    1. 确定机器的信息,操作系统,CPU 架构
    1. 操作系统
    2. CPU 架构
    2. 时区设置
    1. 配置系统时区: timedatectl set-timezone Asia/Shanghai
    2. 设置本地 RTC 为 0: timedatectl set-local-rtc 0
    3. 验证时区设置: timedatectl show --property=Timezone
    4. 验证 RTC 设置: timedatectl show --property=RTC
    3. 加载内核模块
    *需要加载['br_netfilter', 'overlay']*
    1. 查看/etc/modules-load.d,目录是否存在内核模块文件: ls /etc/modules-load.d/ | grep "k8s.conf"
    2. 如果不存在
    1. 创建模块加载配置文件: vi k8s.conf
    2. 写入模块加载文件:tee >

    <<EOF br_netfilter \n overlay \n EOF
    3. 临时加载模块: modprobe overlay br_netfilter
    4. 加载模块:

    5. 验证模块是否成功加载

    4. 关闭防火墙
    1. 常用的防火墙: ['firewalld', 'ufw', 'iptables']
    2. 检查服务是否运行: systemctl is-active <service-name>
    3. 禁用防火墙服务
    1. 停止服务: systemctl stop <service-name>
    2. 禁止开机自启: systemctl disable <serivce-name>
    4. 额外操作:
    firewalld: firewall-cmd --state && firewall-cmd --permanent --shutdown
    ufw: ufw disable
    iptables: iptables -F && iptables -X && iptables -t nat -F && iptables -t nat -X && iptables -t mangle -F && iptables -t manage -X
    5. 交换分区
    1. 检查交换分区: free -h && swapon --show
    2. 临时关闭交换分区: swapoff -a
    3. 永久关闭交换分区
    1. 注释掉

    文件中关于 swap 的配置:

    6. 修改内核参数:
    1. net.bridge.bridge-nf-call-ip6tables = 1
    2. net.bridge.bridge-nf-call-iptables = 1
    3. net.ipv4.ip_forward = 1
    ```

    *部署组件:*

    ````
    Dokcer [https://download.docker.com/linux/static/stable/]( https://download.docker.com/linux/static/stable/?_gl=1*1w17yhs*_ga*OTg3MzYwNS4xNzQzOTA0MTQ2*_ga_XJWPQMJYHQ*MTc0NDYwMDEwMC4zLjEuMTc0NDYwMDExNi40NC4wLjA.)

    ```
    export KUBE_VERSION=<version>
    export ARCH=<arch>
    export KUBEADM_URL=https://dl.k8s.io/release/<KUBE_VERSION>/bin/linux/<ARCH>/kubeadm
    export KUBECTL_URL=https://dl.k8s.io/release/<KUBE_VERSION>/bin/linux/<ARCH>/kubectl
    export KUBELET_URL=https://dl.k8s.io/release/<KUBE_VERSION>/bin/linux/<ARCH>/kubelet
    ```

    1. 安装 Docker:
    1. 下载安装包: curl -OL <docker_url>
    2. 解压安装包: tar -xf <tar_name> && sudo mv docker/* /usr/local/bin/
    2. 安装 kubeadm,kubectl,kubelet:
    1. 下载二进制: curl -OL $(echo $KUBEADM_URL) && curl -OL $(echo $KUBECTL_URL) && curl -OL $(echo $KUBECTL_URL)
    2. 移动文件位置: chmod +x kubeadm kubectl kubelet && sudo mv kubeadm kubectl kubelet /usr/local/bin/
    3. 创建 containerd.service:
    1. 创建 containerd 配置文件:

    2. 创建 containerd 服务文件:

    ```
    [Unit]
    Description=containerd container runtime
    Documentation=https://containerd.io
    After=network.target local-fs.target
    Wants=network.target

    [Service]
    Type=notify
    ExecStartPre=-/sbin/modprobe overlay
    ExecStart=/usr/local/bin/containerd
    TimeoutStartSec=0
    RestartSec=10
    Restart=always
    Delegate=yes
    KillMode=process
    OOMScoreAdjust=-999
    LimitNOFILE=1048576
    LimitNPROC=infinity
    LimitCORE=infinity
    TasksMax=infinity
    EnvirOnment="CGROUP_DRIVER=systemd"

    [Install]
    WantedBy=multi-user.target
    ```
    4. 创建 docker.service:
    1. 创建 docker 服务文件: /etc/systemd/system/docker.service
    ```
    [Unit]
    Description=Docker Application Container Engine
    Documentation=https://docs.docker.com
    BindsTo=containerd.service
    After=network-online.target containerd.service
    Wants=network-online.target

    [Service]
    Type=notify
    ExecStart=/usr/local/bin/dockerd --cOntainerd=/run/containerd/containerd.sock
    Restart=always
    RestartSec=5
    TimeoutStartSec=0
    Delegate=yes
    KillMode=process
    OOMScoreAdjust=-999
    LimitNOFILE=1048576
    LimitNPROC=infinity
    LimitCORE=infinity
    TasksMax=infinity
    EnvirOnmentFile=-/etc/docker/daemon.json

    [Install]
    WantedBy=multi-user.target
    ```
    5. 创建 kubeadm-kubelet 配置:
    1. 创建 kubeadm-kubelet: /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
    ```
    EnvirOnment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubecOnfig=

    /bootstrap-kubelet.conf --kubecOnfig=/etc/kubernetes/kubelet.conf"
    EnvirOnment="KUBELET_CONFIG_ARGS=--cOnfig=/var/lib/kubelet/config.yaml"
    EnvirOnmentFile=-/var/lib/kubelet/kubeadm-flags.env
    EnvirOnmentFile=-/etc/sysconfig/kubelet
    ExecStart=
    ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS
    ```
    6. 创建 kubelet.service:
    *非必须*
    1.创建 kubelet 服务文件: /etc/systemd/system/kubelet.service
    ```
    [Unit]
    Description=kubelet: The Kubernetes Node Agent
    Documentation=https://kubernetes.io/docs/home/
    Wants=network-online.target
    After=network-online.target

    [Service]
    ExecStart=/usr/local/bin/kubelet
    Restart=always
    StartLimitInterval=0
    RestartSec=10

    [Install]
    WantedBy=multi-user.target
    ```
    7. 启动服务
    1. 重载 systemd 配置: systemctl daemon-reload
    2. 组件加入开机自启:
    1. containerd: systemctl enable --now containerd.service
    2. docker: systemctl enable --now docker.service
    3. kubelet: systemctl enable --now kubelet.service
    ````

    *部署 k8s*

    ````
    ```bash
    #!/bin/bash
    # 这里因为环境的不同的只提供一个基础的模版
    # <*> 需要按环境替换
    # <cri_socket> 默认地址: unix:///run/containerd/containerd.sock
    # <controlPlaneEndpoint> 部署多 master 需要这个控制平台地址不能为空
    # <san> apiservice 通过证书 san 校验,被请求的地址是否在证书内
    # <serviceSubnet> k8s 服务网络段
    # <podSubnet> k8s Pod 网络段
    # <etcd_data_dir> etcd 存储的地址
    # 具体的配置可以仔细阅读 https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm

    tee kubeadm-init.conf << EOF
    apiVersion: kubeadm.k8s.io/v1beta4
    bootstrapTokens:
    - groups:
    - system:bootstrappers:kubeadm:default-node-token
    token: <bootstrapTokens_token>
    ttl: 24h0m0s
    usages:
    - signing
    - authentication
    kind: InitConfiguration
    localAPIEndpoint:
    advertiseAddress: <localAPIEndpoint>
    bindPort: <bind_port>
    nodeRegistration:
    criSocket: <cri_socket>
    imagePullPolicy: IfNotPresent
    imagePullSerial: true
    timeouts:
    controlPlaneComponentHealthCheck: 4m0s
    discovery: 5m0s
    etcdAPICall: 2m0s
    kubeletHealthCheck: 4m0s
    kubernetesAPICall: 1m0s
    tlsBootstrap: 5m0s
    upgradeManifests: 5m0s
    ---
    apiVersion: kubeadm.k8s.io/v1beta4
    certificatesDir: /etc/kubernetes/pki
    clusterName: kubernetes
    apiServer:
    certSANs:
    - <san>
    controlPlaneEndpoint: <controlPlaneEndpoint>
    controllerManager: {}
    dns: {}
    encryptionAlgorithm: RSA-2048
    etcd:
    local:
    dataDir: <etcd_data_dir>
    imageRepository: registry.k8s.io
    kind: ClusterConfiguration
    kubernetesVersion: 1.32.3
    networking:
    dnsDomain: cluster.local
    serviceSubnet: <serviceSubnet>
    podSubnet: <podSubnet>
    proxy: {}
    scheduler: {}
    ---
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    mode: "iptables"
    EOF

    # 启动 k8s
    kubeadm init --config kubeadm-init.conf
    ```

    # 后续: 可以根据需要部署 CNI,CSI

    # CNI:
    # export calico_version=v3.27.4
    # calico : https://raw.githubusercontent.com/projectcalico/calico/$calico_version/manifests/calico.yaml

    # CSI: NFS 这个很简单!,CEPH 部署麻烦些
    ````

    *额外的说明*

    ```
    *k8s 加入节点*
    1. 如果初始化的没有配置 controlPlaneEndpoint ,现在需要加 master 节点
    1. 配置控制平面地址: kubeadm init --control-plane-endpoint <control-plane-endpoint> --upload-certs
    2. 加入 control_plane
    1. 创建新的令牌: kubeadm token create --print-join-command --certificate-key $(kubeadm init phase upload-certs --upload-certs | tail -n 1)
    3. 加入 worker
    1. 创建新的令牌: kubeadm token create --print-join-command

    *k8s 镜像*
    1. 查看镜像:kubeadm config images list
    ```
    guanzhangzhang
        16
    guanzhangzhang  
       18 小时 35 分钟前
    高可用无非 tcp 和 https 层,也可以 tcp 层代理,https 层检查 real server ,思路是关键,工具哪个熟悉用哪个
    我 gitbook 里容器网络里,有章节介绍了高可用思想和 k8s 的高可用相关
    https://github.com/zhangguanzhang/simple-container-network-book/tree/master
    NoNewWorld
        17
    NoNewWorld  
       18 小时 0 分钟前
    真的,家庭如果只是为了学习下 k8s 的操作,直接 k3s ,别 k8s ,搭建还好,后面万一断电宕机了,很麻烦,如果真的想搭建 k8s ,推荐 kubeasz
    coefu
        18
    coefu  
       17 小时 58 分钟前
    @sakurawzt #3 keepalived 方案是过时的 v1 方案。成熟的是 v2,在 node 上用 nginx 对 master 做反向代理。
    willygeek007
        19
    willygeek007  
       17 小时 26 分钟前
    用 sealos 来搭建 k8s 也很方便
    defunct9
        20
    defunct9  
       17 小时 12 分钟前
    刚用 opnsense+kubespray 搭建了一套完整的,用于生产。
    aispring
        21
    aispring  
       17 小时 11 分钟前
    @coefu 不是过时,只是方案不一样,这里的 nginx 要不要支持高可用,如果挂了呢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5639 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 02:48 PVG 10:48 LAX 19:48 JFK 22:48
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86