
家里组了台工控机可以用 esxi 划分出来几个虚拟机,想搭建 k8s 学习学习,故求一份高可用的搭建教程
|      1Lee2019      20 小时 5 分钟前  5 | 
|  |      2SuperGeorge      19 小时 57 分钟前 家里云不需要高可用,直接 kubeadm 初始化集群就行了。 | 
|      3sakurawzt OP @SuperGeorge 想学习一下 keepalived ( VRRP 漂移 VIP )+ HAProxy/Nginx (转发到多台 apiserver )这个 | 
|  |      4xiaohuangya      19 小时 51 分钟前 你的服务不多,使用不频繁,所谓的高可用没有意义。 | 
|      5sakurawzt OP @xiaohuangya 主要是想学习 | 
|  |      6evill      19 小时 44 分钟前 keepalived + Nginx 这个和 k8s 的高可用没什么关系,这个是机器不可用/网络故障的方面的高可用 例如多实例提高 SLA k8s 的高可用应该是高可用 master 、etcd 集群、外置 coreDNS 这些 | 
|  |      7SuperGeorge      19 小时 44 分钟前  1 @sakurawzt 那看看官方的 https://kubespray.io | 
|      9sakurawzt OP @SuperGeorge 好的我去看看 | 
|      10pordria      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 之类的 | 
|  |      11raptor      19 小时 14 分钟前 让 AI 手把手教你啊,这是学新技术最快的方式之一 | 
|  |      12BeautifulSoap      18 小时 57 分钟前 不懂 k8s 的话建议先从 k3s 开始快速搭个集群学习然后再慢慢接触官方的教程 虽然学习高可用是可以,但是个人使用高可用真的完全是鸡肋。反倒 k8s 里面最薄弱的一个环节etcd 经常是把你集群整死的元凶 我现在建个人集群都是直接 k3s 然后配合单点 mysql 。控制平面最多两个节点。自从这样后以前半年崩一次的集群已经好几年没蹦过了,备份集群数据更是简单到炸。只要有 mysql 的备份或原始数据直接轻松恢复整个集群 | 
|  |      13midsolo      18 小时 43 分钟前 学习的话建议从 minikube 开始,然后搭一套 k3s 环境,部署一些常见的中间件进去,再慢慢看 k8s 的官方教程。 | 
|  |      14Geon97      18 小时 40 分钟前 话说现在大家都有什么版本的 k8s?还是选择支持 dockerd 的版本吗? | 
|      15hejw19970413      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 ``` | 
|  |      16guanzhangzhang      18 小时 35 分钟前 高可用无非 tcp 和 https 层,也可以 tcp 层代理,https 层检查 real server ,思路是关键,工具哪个熟悉用哪个 我 gitbook 里容器网络里,有章节介绍了高可用思想和 k8s 的高可用相关 https://github.com/zhangguanzhang/simple-container-network-book/tree/master | 
|      17NoNewWorld      18 小时 0 分钟前 真的,家庭如果只是为了学习下 k8s 的操作,直接 k3s ,别 k8s ,搭建还好,后面万一断电宕机了,很麻烦,如果真的想搭建 k8s ,推荐 kubeasz | 
|      19willygeek007      17 小时 26 分钟前 用 sealos 来搭建 k8s 也很方便 | 
|  |      20defunct9      17 小时 12 分钟前 刚用 opnsense+kubespray 搭建了一套完整的,用于生产。 |