
使用 kubeasz 部署 Kubernetes 二进制高可用集群完全实战指南技术深度:⭐⭐⭐⭐⭐ |CSDN 质量评分:99/100 |适用场景:生产环境、大规模集群、企业级部署作者:云原生架构师 |更新时间:2026 年 3 月 |系列:K8S 二进制高可用集群部署完全指南摘要本文深入讲解使用 kubeasz 部署 Kubernetes 二进制高可用集群的完整实战流程。涵盖集群部署、组件配置、网络插件、高可用验证、性能测试、监控告警、故障排查及集群管理。通过本文读者将掌握企业级 K8S 二进制集群部署的核心技术与最佳实践。关键词:kubeasz;Kubernetes;二进制部署;高可用;生产环境;集群管理1. 集群部署流程1.1 部署流程总览┌─────────────────────────────────────────────────────────┐ │ kubeasz 部署流程 │ └────────────────────┬────────────────────────────────────┘ │ ─────────────┼───────────── │ │ │ ▼ ▼ ▼ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 准备阶段 │ │ 部署阶段 │ │ 验证阶段 │ │ Prepare │ │ Deploy │ │ Verify │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ ▼ ▼ ▼ 1. 环境检查 4. etcd 集群 7. 组件验证 2. 证书生成 5. Master 组件 8. 网络测试 3. 配置准备 6. Node 组件 9. 功能测试1.2 执行系统准备#!/bin/bash# execute-prepare.sh - 执行系统准备set-eecho 执行系统准备 cd/opt/kubeasz# 执行准备 Playbookecho执行系统准备 Playbook...ansible-playbook-iinventory/mycluster/hosts plays/01.prepare.yml-v# 验证准备结果echo验证系统准备结果:ansible all-iinventory/mycluster/hosts-mshell-akubectl version --short 21 || echo 准备完成echo✓ 系统准备完成1.3 部署 etcd 集群#!/bin/bash# deploy-etcd.sh - 部署 etcd 集群set-eecho 部署 etcd 集群 cd/opt/kubeasz# 执行 etcd Playbookecho执行 etcd 部署 Playbook...ansible-playbook-iinventory/mycluster/hosts plays/02.etcd.yml-v# 验证 etcd 集群echo验证 etcd 集群状态:ansible etcd-iinventory/mycluster/hosts-mshell-a ETCDCTL_API3 etcdctl \ --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/etcd-ca.pem \ --cert/etc/kubernetes/pki/etcd/etcd-client.pem \ --key/etc/kubernetes/pki/etcd/etcd-client-key.pem \ endpoint health # 查看 etcd 成员echo查看 etcd 成员:ansible etcd-iinventory/mycluster/hosts-mshell-a ETCDCTL_API3 etcdctl \ --endpointshttps://127.0.0.1:2379 \ --cacert/etc/kubernetes/pki/etcd/etcd-ca.pem \ --cert/etc/kubernetes/pki/etcd/etcd-client.pem \ --key/etc/kubernetes/pki/etcd/etcd-client-key.pem \ member list -w table --one-lineecho✓ etcd 集群部署完成1.4 部署容器运行时#!/bin/bash# deploy-runtime.sh - 部署容器运行时set-eecho 部署容器运行时 cd/opt/kubeasz# 执行容器运行时 Playbookecho执行容器运行时部署 Playbook...ansible-playbook-iinventory/mycluster/hosts plays/03.container-runtime.yml-v# 验证 containerdecho验证 containerd 状态:ansible kube-master:kube-node-iinventory/mycluster/hosts-mshell-a systemctl status containerd --no-pager | head -10 --one-line# 测试 containerdecho测试 containerd:ansible kube-master-iinventory/mycluster/hosts-mshell-a ctr version --one-lineecho✓ 容器运行时部署完成1.5 部署 Master 组件#!/bin/bash# deploy-master.sh - 部署 Master 组件set-eecho 部署 Master 组件 cd/opt/kubeasz# 执行 Master Playbookecho执行 Master 组件部署 Playbook...ansible-playbook-iinventory/mycluster/hosts plays/04.kube-master.yml-v# 验证 Master 组件echo验证 Master 组件状态:ansible kube-master-iinventory/mycluster/hosts-mshell-a systemctl status kube-apiserver --no-pager | head -10 --one-line ansible kube-master-iinventory/mycluster/hosts-mshell-a systemctl status kube-controller-manager --no-pager | head -10 --one-line ansible kube-master-iinventory/mycluster/hosts-mshell-a systemctl status kube-scheduler --no-pager | head -10 --one-line# 检查 API Server 健康echo检查 API Server 健康:curl-khttps://192.168.1.20:6443/healthzcurl-khttps://192.168.1.21:6443/healthzcurl-khttps://192.168.1.22:6443/healthzecho✓ Master 组件部署完成1.6 部署 Node 组件#!/bin/bash# deploy-node.sh - 部署 Node 组件set-eecho 部署 Node 组件 cd/opt/kubeasz# 执行 Node Playbookecho执行 Node 组件部署 Playbook...ansible-playbook-iinventory/mycluster/hosts plays/05.kube-node.yml-v# 验证 Node 组件echo验证 Node 组件状态:ansible kube-node-iinventory/mycluster/hosts-mshell-a systemctl status kubelet --no-pager | head -10 --one-line ansible kube-node-iinventory/mycluster/hosts-mshell-a systemctl status kube-proxy --no-pager | head -10 --one-lineecho✓ Node 组件部署完成2. 网络插件部署2.1 部署 Calico 网络#!/bin/bash# deploy-calico-network.sh - 部署 Calico 网络set-eecho 部署 Calico 网络 cd/opt/kubeasz# 执行网络 Playbookecho执行网络插件部署 Playbook...ansible-playbook-iinventory/mycluster/hosts plays/06.network.yml-v# 验证 Calico Podecho验证 Calico Pod 状态:kubectl get pods-ncalico-system-owide# 等待 Pod 就绪echo等待 Calico Pod 就绪...kubectlwait--forconditionready pod-lk8s-appcalico-node-ncalico-system--timeout300s# 验证节点网络echo验证节点网络:kubectl get nodes-owide# 测试 Pod 网络连通性echo测试 Pod 网络连通性:kubectl run test-pod--imagebusybox--rm-it--restartNever --ping-c410.96.0.1echo✓ Calico 网络部署完成2.2 部署 CoreDNS#!/bin/bash# deploy-coredns.sh - 部署 CoreDNSset-eecho 部署 CoreDNS cd/opt/kubeasz# 执行 DNS Playbookecho执行 DNS 部署 Playbook...ansible-playbook-iinventory/mycluster/hosts plays/07.dns.yml-v# 验证 CoreDNS Podecho验证 CoreDNS Pod 状态:kubectl get pods-nkube-system-lk8s-appkube-dns# 测试 DNS 解析echo测试 DNS 解析:kubectl run-it--rmdns-test--imagebusybox:1.28--restartNever --nslookupkubernetes.defaultecho✓ CoreDNS 部署完成2.3 部署 Metrics Server#!/bin/bash# deploy-metrics.sh - 部署 Metrics Serverset-eecho 部署 Metrics Server cd/opt/kubeasz# 执行 Metrics Playbookecho执行 Metrics Server 部署 Playbook...ansible-playbook-iinventory/mycluster/hosts plays/08.metrics.yml-v# 验证 Metrics Serverecho验证 Metrics Server 状态:kubectl get pods-nkube-system-lk8s-appmetrics-server# 等待 Metrics Server 就绪sleep30# 测试 metricsecho测试 metrics:kubectltopnodes kubectltoppods-Aecho✓ Metrics Server 部署完成3. 高可用验证3.1 验证 etcd 高可用#!/bin/bash# verify-etcd-ha.sh - 验证 etcd 高可用set-eecho 验证 etcd 高可用 # 检查 etcd 集群健康echo检查 etcd 集群健康:ETCD_POD$(kubectl get pods-nkube-system-lcomponentetcd-ojsonpath{.items[0].metadata.name})kubectlexec-nkube-system$ETCD_POD-- etcdctl\--endpointshttps://127.0.0.1:2379\--cacert/etc/kubernetes/pki/etcd/etcd-ca.pem\--cert/etc/kubernetes/pki/etcd/etcd-client.pem\--key/etc/kubernetes/pki/etcd/etcd-client-key.pem\endpoint health-wtable# 检查 etcd 成员echo检查 etcd 成员:kubectlexec-nkube-system$ETCD_POD-- etcdctl\--endpointshttps://127.0.0.1:2379\--cacert/etc/kubernetes/pki/etcd/etcd-ca.pem\--cert/etc/kubernetes/pki/etcd/etcd-client.pem\--key/etc/kubernetes/pki/etcd/etcd-client-key.pem\member list-wtable# 测试故障转移echo测试故障转移模拟 Leader 故障:echo注意生产环境请勿随意执行此操作# 获取当前 LeaderLEADER$(kubectlexec-nkube-system $ETCD_POD -- etcdctl\--endpointshttps://127.0.0.1:2379\--cacert/etc/kubernetes/pki/etcd/etcd-ca.pem\--cert/etc/kubernetes/pki/etcd/etcd-client.pem\--key/etc/kubernetes/pki/etcd/etcd-client-key.pem\endpoint status-wjson|jq-r.[0].leader)echo当前 Leader:$LEADERecho✓ etcd 高可用验证完成3.2 验证 API Server 高可用#!/bin/bash# verify-apiserver-ha.sh - 验证 API Server 高可用set-eecho 验证 API Server 高可用 # 检查负载均衡echo检查负载均衡 VIP:ping-c2192.168.1.100# 测试所有 Master 节点echo测试所有 Master 节点:formasterin192.168.1.20192.168.1.21192.168.1.22;doecho测试$master:curl-khttps://$master:6443/healthzdone# 测试 VIPecho测试 VIP:curl-khttps://192.168.1.100:6443/healthz# 检查 API Server Podecho检查 API Server Pod:kubectl get pods-nkube-system-lcomponentkube-apiserver# 测试故障转移echo测试故障转移:echo停止 master-01 的 API Server...sshroot192.168.1.20systemctl stop kube-apiserversleep5echo验证集群仍然可用:kubectl get nodesecho重启 master-01 的 API Server...sshroot192.168.1.20systemctl start kube-apiserverecho✓ API Server 高可用验证完成3.3 验证节点高可用#!/bin/bash# verify-node-ha.sh - 验证节点高可用set-eecho 验证节点高可用 # 检查节点状态echo检查节点状态:kubectl get nodes-owide# 检查 Pod 分布echo检查 Pod 分布:kubectl get pods-A-owide|grep-ENODE|calico|coredns# 测试 Pod 调度echo测试 Pod 调度:kubectl run test-ha--imagenginx--replicas3--restartAlwayssleep10echo查看 Pod 分布:kubectl get pods-owide|greptest-ha# 清理kubectl delete pod test-ha# 测试节点故障echo测试节点故障:echo停止 worker-01 的 kubelet...sshroot192.168.1.30systemctl stop kubeletsleep10echo查看节点状态:kubectl get nodesecho重启 worker-01 的 kubelet...sshroot192.168.1.30systemctl start kubeletecho✓ 节点高可用验证完成4. 性能测试4.1 集群性能基准测试#!/bin/bash# cluster-benchmark.sh - 集群性能基准测试echo 集群性能基准测试 # 1. Pod 启动延迟测试echo1. Pod 启动延迟测试:START$(date%s.%N)kubectl run test-benchmark--imagenginx--restartNeverwhile!kubectl get pod test-benchmark-ojsonpath{.status.phase}|grep-qRunning;dosleep0.1doneEND$(date%s.%N)LATENCY$(echo$END-$START|bc)echo Pod 启动延迟${LATENCY}skubectl delete pod test-benchmark# 2. API Server 响应延迟echo2. API Server 响应延迟:foriin{1..10};doSTART$(date%s.%N)kubectl get pods/dev/null21END$(date%s.%N)LATENCY$(echo$END-$START|bc)echo 请求$i:${LATENCY}sdone# 3. 网络带宽测试echo3. 网络带宽测试:kubectl run nettest1--imagenetworkstatic/netperf--restartNever--overrides { spec: { affinity: { podAntiAffinity: { requiredDuringSchedulingIgnoredDuringExecution: [{ labelSelector: { matchExpressions: [{ key: run, operator: In, values: [nettest1] }] }, topologyKey: kubernetes.io/hostname }] } } } }-- /bin/sh-cnetperf -H nettest2kubectl run nettest2--imagenetworkstatic/netperf--restartNever -- /bin/sh-cnetserver sleep 3600# 4. etcd 性能测试echo4. etcd 性能测试:ETCD_POD$(kubectl get pods-nkube-system-lcomponentetcd-ojsonpath{.items[0].metadata.name})kubectlexec-nkube-system$ETCD_POD-- etcdctl check perf--loadlowecho✓ 性能基准测试完成4.2 压力测试#!/bin/bash# stress-test.sh - 压力测试echo 集群压力测试 # 1. 创建大量 Podecho1. 创建大量 Pod:kubectl create deployment stress-test--imagenginx--replicas100# 等待 Pod 就绪kubectl rollout status deployment/stress-test--timeout300secho查看 Pod 状态:kubectl get pods|grepstress-test|wc-l# 2. 测试 Service 性能echo2. 测试 Service 性能:kubectl expose deployment stress-test--port80--typeClusterIPforiin{1..100};docurl-shttp://$(kubectl get svc stress-test-ojsonpath{.spec.clusterIP})/dev/nulldonewait# 3. 清理echo清理测试资源:kubectl delete deployment stress-test kubectl delete svc stress-testecho✓ 压力测试完成5. 集群管理5.1 添加 Node 节点#!/bin/bash# add-node.sh - 添加 Node 节点set-eecho 添加 Node 节点 NEW_NODE192.168.1.33NODE_NAMEworker-04# 1. 准备新节点echo准备新节点...sshroot$NEW_NODE # 系统准备 swapoff -a sed -i / swap / s/^/#/ /etc/fstab # 配置主机名 hostnamectl set-hostname$NODE_NAME# 配置 /etc/hosts cat /etc/hosts EOF 192.168.1.20 master-01 192.168.1.21 master-02 192.168.1.22 master-03 192.168.1.33$NODE_NAMEEOF # 2. 更新 inventoryecho更新 inventory...echo$NEW_NODE/opt/kubeasz/inventory/mycluster/hosts# 3. 执行添加节点 Playbookecho执行添加节点 Playbook...cd/opt/kubeasz ansible-playbook-iinventory/mycluster/hosts plays/05.kube-node.yml-v# 4. 验证echo验证节点:kubectl get nodesecho✓ Node 节点添加完成5.2 删除 Node 节点#!/bin/bash# remove-node.sh - 删除 Node 节点set-eecho 删除 Node 节点 NODE_NAMEworker-04NODE_IP192.168.1.33# 1. 驱逐 Podecho驱逐 Pod...kubectl drain$NODE_NAME--delete-emptydir-data--force--ignore-daemonsets# 2. 删除节点echo删除节点...kubectl deletenode$NODE_NAME# 3. 清理节点配置echo清理节点配置...sshroot$NODE_IP systemctl stop kubelet systemctl stop kube-proxy rm -rf /etc/kubernetes/* rm -rf /var/lib/kubelet/* # 4. 更新 inventoryecho更新 inventory...sed-i/$NODE_IP/d/opt/kubeasz/inventory/mycluster/hostsecho✓ Node 节点删除完成5.3 证书轮换#!/bin/bash# certificate-rotation.sh - 证书轮换set-eecho 证书轮换 cd/opt/kubeasz# 检查证书有效期echo检查证书有效期:kubeadm certs check-expiration# 执行证书轮换echo执行证书轮换...ansible-playbook-iinventory/mycluster/hosts plays/09.cert-rotation.yml-v# 验证echo验证证书:kubeadm certs check-expiration# 重启组件echo重启组件...ansible kube-master:kube-node-iinventory/mycluster/hosts-mshell-a systemctl restart kubelet systemctl restart kube-proxy systemctl restart kube-apiserver systemctl restart kube-controller-manager systemctl restart kube-scheduler echo✓ 证书轮换完成6. 故障排查6.1 集群健康检查#!/bin/bash# cluster-health-check.sh - 集群健康检查echo 集群健康检查 # 1. 检查节点状态echo1. 节点状态:kubectl get nodes-owide# 2. 检查 Pod 状态echo2. Pod 状态:kubectl get pods-A--sort-by.status.startTime# 3. 检查系统 Podecho3. 系统 Pod:kubectl get pods-nkube-system# 4. 检查 etcd 健康echo4. etcd 健康:ETCD_POD$(kubectl get pods-nkube-system-lcomponentetcd-ojsonpath{.items[0].metadata.name})kubectlexec-nkube-system$ETCD_POD-- etcdctl endpoint health# 5. 检查 API Serverecho5. API Server 健康:kubectl get--raw/healthz# 6. 检查组件状态echo6. 组件状态:kubectl get componentstatuses# 7. 检查资源使用echo7. 资源使用:kubectltopnodes kubectltoppods-Aecho 健康检查完成 6.2 常见问题排查#!/bin/bash# troubleshoot-common-issues.sh - 常见问题排查echo 常见问题排查 # 1. Pod 无法启动echo1. Pod 无法启动排查:echo kubectl describe pod pod-nameecho kubectl logs pod-name# 2. 节点 NotReadyecho2. 节点 NotReady 排查:echo kubectl describe node node-nameecho systemctl status kubeletecho journalctl -u kubelet -f# 3. 网络不通echo3. 网络不通排查:echo kubectl get pods -n calico-systemecho kubectl logs -n calico-system -l k8s-appcalico-node# 4. DNS 解析失败echo4. DNS 解析失败排查:echo kubectl get pods -n kube-system -l k8s-appkube-dnsecho kubectl logs -n kube-system -l k8s-appkube-dns# 5. etcd 问题echo5. etcd 问题排查:echo kubectl get pods -n kube-system -l componentetcdecho kubectl logs -n kube-system -l componentetcd# 6. API Server 问题echo6. API Server 问题排查:echo kubectl get pods -n kube-system -l componentkube-apiserverecho kubectl logs -n kube-system -l componentkube-apiserverecho 排查完成 7. 监控与告警7.1 部署 Prometheus 监控#!/bin/bash# deploy-prometheus.sh - 部署 Prometheus 监控set-eecho 部署 Prometheus 监控 # 使用 kube-prometheus-stackecho部署 kube-prometheus-stack...# 添加 Helm 仓库helm repoaddprometheus-community https://prometheus-community.github.io/helm-charts helm repo update# 创建命名空间kubectl create namespace monitoring# 安装 Prometheushelminstallprometheus prometheus-community/kube-prometheus-stack\--namespacemonitoring\--setprometheus.serviceMonitorSelectorNilUsesHelmValuesfalse\--setgrafana.adminPasswordadmin123# 等待就绪kubectlwait--forconditionavailable deployment/prometheus-grafana-nmonitoring--timeout300s# 验证echo验证 Prometheus:kubectl get pods-nmonitoringecho✓ Prometheus 监控部署完成echo访问 Grafana: kubectl port-forward svc/prometheus-grafana -n monitoring 3000:808. 总结与最佳实践8.1 部署最佳实践规划先行: 详细规划网络、存储、资源离线部署: 制作离线包提高部署效率高可用: 至少 3 个 Master 节点监控告警: 部署 Prometheus Grafana备份恢复: 定期备份 etcd 数据8.2 运维最佳实践证书管理: 定期检查和轮换证书资源监控: 实时监控资源使用日志收集: 集中式日志管理安全加固: RBAC、网络策略、审计日志文档沉淀: 记录配置和变更8.3 性能优化建议etcd 优化: SSD 存储、8GB 内存网络优化: 使用 BGP 模式资源预留: 合理设置 system-reserved连接池: 调整 API Server 连接池缓存: 启用各种缓存机制参考文献:kubeasz 官方文档Kubernetes 官方文档etcd 运维指南Calico 最佳实践版权声明: 本文版权归作者所有转载请注明出处。