V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sakurawzt
V2EX  ›  Kubernetes

求份搭建高可用 k8s 的教程

  •  
  •   sakurawzt · 1 天前 · 1537 次点击

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

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

    k8s 的高可用应该是高可用 master 、etcd 集群、外置 coreDNS 这些
    SuperGeorge
        7
    SuperGeorge  
       1 天前   ❤️ 1
    @sakurawzt 那看看官方的 https://kubespray.io
    sakurawzt
        8
    sakurawzt  
    OP
       1 天前
    @evill 噢噢,都想学习一下
    sakurawzt
        9
    sakurawzt  
    OP
       1 天前
    @SuperGeorge 好的我去看看
    pordria
        10
    pordria  
       1 天前   ❤️ 1
    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  
       1 天前
    让 AI 手把手教你啊,这是学新技术最快的方式之一
    BeautifulSoap
        12
    BeautifulSoap  
       1 天前   ❤️ 1
    不懂 k8s 的话建议先从 k3s 开始快速搭个集群学习然后再慢慢接触官方的教程

    虽然学习高可用是可以,但是个人使用高可用真的完全是鸡肋。反倒 k8s 里面最薄弱的一个环节————etcd 经常是把你集群整死的元凶
    我现在建个人集群都是直接 k3s 然后配合单点 mysql 。控制平面最多两个节点。自从这样后以前半年崩一次的集群已经好几年没蹦过了,备份集群数据更是简单到炸。只要有 mysql 的备份或原始数据直接轻松恢复整个集群
    midsolo
        13
    midsolo  
       1 天前   ❤️ 1
    学习的话建议从 minikube 开始,然后搭一套 k3s 环境,部署一些常见的中间件进去,再慢慢看 k8s 的官方教程。
    Geon97
        14
    Geon97  
       1 天前
    话说现在大家都有什么版本的 k8s?还是选择支持 dockerd 的版本吗?
    hejw19970413
        15
    hejw19970413  
       1 天前   ❤️ 1
    自己玩可以如果企业搭建先建 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  
       1 天前   ❤️ 1
    高可用无非 tcp 和 https 层,也可以 tcp 层代理,https 层检查 real server ,思路是关键,工具哪个熟悉用哪个
    我 gitbook 里容器网络里,有章节介绍了高可用思想和 k8s 的高可用相关
    https://github.com/zhangguanzhang/simple-container-network-book/tree/master
    NoNewWorld
        17
    NoNewWorld  
       1 天前   ❤️ 1
    真的,家庭如果只是为了学习下 k8s 的操作,直接 k3s ,别 k8s ,搭建还好,后面万一断电宕机了,很麻烦,如果真的想搭建 k8s ,推荐 kubeasz
    coefu
        18
    coefu  
       1 天前   ❤️ 1
    @sakurawzt #3 keepalived 方案是过时的 v1 方案。成熟的是 v2,在 node 上用 nginx 对 master 做反向代理。
    willygeek007
        19
    willygeek007  
       1 天前
    用 sealos 来搭建 k8s 也很方便
    defunct9
        20
    defunct9  
       1 天前
    刚用 opnsense+kubespray 搭建了一套完整的,用于生产。
    aispring
        21
    aispring  
       1 天前
    @coefu 不是过时,只是方案不一样,这里的 nginx 要不要支持高可用,如果挂了呢
    coefu
        22
    coefu  
       10 小时 10 分钟前
    @aispring 引入 VIP ,是一件得力不讨好的事情,你肯定没有在真实的场景里实践过,k8s 的网络已经是分层的复杂状态了,引入了会来回飘荡的 VIP ,一旦出现网络故障的时候,给网络问题的排查增加了复杂度,就是过时的方案。当 node 上的 nginx crack ,排查问题的复杂度,比 引入 VIP 之后,排查问题的复杂度,低很多。毕竟,可以给 nginx 用 static pod 拉起,再加上 livenessprobe 。vip 切换之后,node 上的网络状态中 iptables 那些看的人头皮发麻的 规则,你估计没怎么经历过。
    GoRoad
        23
    GoRoad  
       10 小时 1 分钟前   ❤️ 1
    kubespray 一把梭,好用的,网上能搜到一堆教程
    hancai2
        24
    hancai2  
       7 小时 24 分钟前
    @coefu 好像公有云也不给开 VIP 了
    sakurawzt
        25
    sakurawzt  
    OP
       4 小时 53 分钟前
    @pordria 好的,感谢
    sakurawzt
        26
    sakurawzt  
    OP
       4 小时 52 分钟前
    @raptor ai 不行,试过很多次了,k8s 更新迭代太快,包括他的一些网络插件这些,很多次他自己也迷糊了
    sakurawzt
        27
    sakurawzt  
    OP
       4 小时 50 分钟前
    @BeautifulSoap 好的,感谢老哥指点
    sakurawzt
        28
    sakurawzt  
    OP
       4 小时 49 分钟前
    @midsolo 好的,感谢老哥的指点
    sakurawzt
        29
    sakurawzt  
    OP
       4 小时 46 分钟前
    @hejw19970413 感谢老哥,十分感谢,我去照着研究研究,我一直习惯的都是 ubuntu24.04 这个
    sakurawzt
        30
    sakurawzt  
    OP
       4 小时 44 分钟前
    @guanzhangzhang 感谢老哥,star 奉上
    sakurawzt
        31
    sakurawzt  
    OP
       4 小时 42 分钟前
    @NoNewWorld 好的,我听劝,去多了解一下再下手
    vivisidea
        32
    vivisidea  
       4 小时 11 分钟前
    家庭集群建议轻量级的 k3s ,功能也够用,你 k8s 跑起来一堆组件,内存都吃差不多了 ……
    raptor
        33
    raptor  
       28 分钟前
    @sakurawzt 那你这边问的信息也很多是过时的经验,要最新的只能看官方文档……我的经验是看文档先搞,碰到问题问 AI ,还是有点帮助的
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2560 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 13:55 · PVG 21:55 · LAX 06:55 · JFK 09:55
    ♥ Do have faith in what you're doing.