二十、Kubernetes基础-63-kubeasz-deployment-complete-guide
·
使用 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 -e
echo "=== 执行系统准备 ==="
cd /opt/kubeasz
# 执行准备 Playbook
echo "执行系统准备 Playbook..."
ansible-playbook -i inventory/mycluster/hosts plays/01.prepare.yml -v
# 验证准备结果
echo "验证系统准备结果:"
ansible all -i inventory/mycluster/hosts -m shell -a "kubectl version --short 2>&1 || echo '准备完成'"
echo "✓ 系统准备完成"
1.3 部署 etcd 集群
#!/bin/bash
# deploy-etcd.sh - 部署 etcd 集群
set -e
echo "=== 部署 etcd 集群 ==="
cd /opt/kubeasz
# 执行 etcd Playbook
echo "执行 etcd 部署 Playbook..."
ansible-playbook -i inventory/mycluster/hosts plays/02.etcd.yml -v
# 验证 etcd 集群
echo "验证 etcd 集群状态:"
ansible etcd -i inventory/mycluster/hosts -m shell -a "
ETCDCTL_API=3 etcdctl \
--endpoints=https://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 -i inventory/mycluster/hosts -m shell -a "
ETCDCTL_API=3 etcdctl \
--endpoints=https://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-line
echo "✓ etcd 集群部署完成"
1.4 部署容器运行时
#!/bin/bash
# deploy-runtime.sh - 部署容器运行时
set -e
echo "=== 部署容器运行时 ==="
cd /opt/kubeasz
# 执行容器运行时 Playbook
echo "执行容器运行时部署 Playbook..."
ansible-playbook -i inventory/mycluster/hosts plays/03.container-runtime.yml -v
# 验证 containerd
echo "验证 containerd 状态:"
ansible kube-master:kube-node -i inventory/mycluster/hosts -m shell -a "
systemctl status containerd --no-pager | head -10
" --one-line
# 测试 containerd
echo "测试 containerd:"
ansible kube-master -i inventory/mycluster/hosts -m shell -a "
ctr version
" --one-line
echo "✓ 容器运行时部署完成"
1.5 部署 Master 组件
#!/bin/bash
# deploy-master.sh - 部署 Master 组件
set -e
echo "=== 部署 Master 组件 ==="
cd /opt/kubeasz
# 执行 Master Playbook
echo "执行 Master 组件部署 Playbook..."
ansible-playbook -i inventory/mycluster/hosts plays/04.kube-master.yml -v
# 验证 Master 组件
echo "验证 Master 组件状态:"
ansible kube-master -i inventory/mycluster/hosts -m shell -a "
systemctl status kube-apiserver --no-pager | head -10
" --one-line
ansible kube-master -i inventory/mycluster/hosts -m shell -a "
systemctl status kube-controller-manager --no-pager | head -10
" --one-line
ansible kube-master -i inventory/mycluster/hosts -m shell -a "
systemctl status kube-scheduler --no-pager | head -10
" --one-line
# 检查 API Server 健康
echo "检查 API Server 健康:"
curl -k https://192.168.1.20:6443/healthz
curl -k https://192.168.1.21:6443/healthz
curl -k https://192.168.1.22:6443/healthz
echo "✓ Master 组件部署完成"
1.6 部署 Node 组件
#!/bin/bash
# deploy-node.sh - 部署 Node 组件
set -e
echo "=== 部署 Node 组件 ==="
cd /opt/kubeasz
# 执行 Node Playbook
echo "执行 Node 组件部署 Playbook..."
ansible-playbook -i inventory/mycluster/hosts plays/05.kube-node.yml -v
# 验证 Node 组件
echo "验证 Node 组件状态:"
ansible kube-node -i inventory/mycluster/hosts -m shell -a "
systemctl status kubelet --no-pager | head -10
" --one-line
ansible kube-node -i inventory/mycluster/hosts -m shell -a "
systemctl status kube-proxy --no-pager | head -10
" --one-line
echo "✓ Node 组件部署完成"
2. 网络插件部署
2.1 部署 Calico 网络
#!/bin/bash
# deploy-calico-network.sh - 部署 Calico 网络
set -e
echo "=== 部署 Calico 网络 ==="
cd /opt/kubeasz
# 执行网络 Playbook
echo "执行网络插件部署 Playbook..."
ansible-playbook -i inventory/mycluster/hosts plays/06.network.yml -v
# 验证 Calico Pod
echo "验证 Calico Pod 状态:"
kubectl get pods -n calico-system -o wide
# 等待 Pod 就绪
echo "等待 Calico Pod 就绪..."
kubectl wait --for=condition=ready pod -l k8s-app=calico-node -n calico-system --timeout=300s
# 验证节点网络
echo "验证节点网络:"
kubectl get nodes -o wide
# 测试 Pod 网络连通性
echo "测试 Pod 网络连通性:"
kubectl run test-pod --image=busybox --rm -it --restart=Never -- ping -c 4 10.96.0.1
echo "✓ Calico 网络部署完成"
2.2 部署 CoreDNS
#!/bin/bash
# deploy-coredns.sh - 部署 CoreDNS
set -e
echo "=== 部署 CoreDNS ==="
cd /opt/kubeasz
# 执行 DNS Playbook
echo "执行 DNS 部署 Playbook..."
ansible-playbook -i inventory/mycluster/hosts plays/07.dns.yml -v
# 验证 CoreDNS Pod
echo "验证 CoreDNS Pod 状态:"
kubectl get pods -n kube-system -l k8s-app=kube-dns
# 测试 DNS 解析
echo "测试 DNS 解析:"
kubectl run -it --rm dns-test --image=busybox:1.28 --restart=Never -- nslookup kubernetes.default
echo "✓ CoreDNS 部署完成"
2.3 部署 Metrics Server
#!/bin/bash
# deploy-metrics.sh - 部署 Metrics Server
set -e
echo "=== 部署 Metrics Server ==="
cd /opt/kubeasz
# 执行 Metrics Playbook
echo "执行 Metrics Server 部署 Playbook..."
ansible-playbook -i inventory/mycluster/hosts plays/08.metrics.yml -v
# 验证 Metrics Server
echo "验证 Metrics Server 状态:"
kubectl get pods -n kube-system -l k8s-app=metrics-server
# 等待 Metrics Server 就绪
sleep 30
# 测试 metrics
echo "测试 metrics:"
kubectl top nodes
kubectl top pods -A
echo "✓ Metrics Server 部署完成"
3. 高可用验证
3.1 验证 etcd 高可用
#!/bin/bash
# verify-etcd-ha.sh - 验证 etcd 高可用
set -e
echo "=== 验证 etcd 高可用 ==="
# 检查 etcd 集群健康
echo "检查 etcd 集群健康:"
ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -o jsonpath='{.items[0].metadata.name}')
kubectl exec -n kube-system $ETCD_POD -- etcdctl \
--endpoints=https://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 -w table
# 检查 etcd 成员
echo "检查 etcd 成员:"
kubectl exec -n kube-system $ETCD_POD -- etcdctl \
--endpoints=https://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
# 测试故障转移
echo "测试故障转移(模拟 Leader 故障):"
echo "注意:生产环境请勿随意执行此操作"
# 获取当前 Leader
LEADER=$(kubectl exec -n kube-system $ETCD_POD -- etcdctl \
--endpoints=https://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 -w json | jq -r '.[0].leader')
echo "当前 Leader: $LEADER"
echo "✓ etcd 高可用验证完成"
3.2 验证 API Server 高可用
#!/bin/bash
# verify-apiserver-ha.sh - 验证 API Server 高可用
set -e
echo "=== 验证 API Server 高可用 ==="
# 检查负载均衡
echo "检查负载均衡 VIP:"
ping -c 2 192.168.1.100
# 测试所有 Master 节点
echo "测试所有 Master 节点:"
for master in 192.168.1.20 192.168.1.21 192.168.1.22; do
echo "测试 $master:"
curl -k https://$master:6443/healthz
done
# 测试 VIP
echo "测试 VIP:"
curl -k https://192.168.1.100:6443/healthz
# 检查 API Server Pod
echo "检查 API Server Pod:"
kubectl get pods -n kube-system -l component=kube-apiserver
# 测试故障转移
echo "测试故障转移:"
echo "停止 master-01 的 API Server..."
ssh root@192.168.1.20 "systemctl stop kube-apiserver"
sleep 5
echo "验证集群仍然可用:"
kubectl get nodes
echo "重启 master-01 的 API Server..."
ssh root@192.168.1.20 "systemctl start kube-apiserver"
echo "✓ API Server 高可用验证完成"
3.3 验证节点高可用
#!/bin/bash
# verify-node-ha.sh - 验证节点高可用
set -e
echo "=== 验证节点高可用 ==="
# 检查节点状态
echo "检查节点状态:"
kubectl get nodes -o wide
# 检查 Pod 分布
echo "检查 Pod 分布:"
kubectl get pods -A -o wide | grep -E "NODE|calico|coredns"
# 测试 Pod 调度
echo "测试 Pod 调度:"
kubectl run test-ha --image=nginx --replicas=3 --restart=Always
sleep 10
echo "查看 Pod 分布:"
kubectl get pods -o wide | grep test-ha
# 清理
kubectl delete pod test-ha
# 测试节点故障
echo "测试节点故障:"
echo "停止 worker-01 的 kubelet..."
ssh root@192.168.1.30 "systemctl stop kubelet"
sleep 10
echo "查看节点状态:"
kubectl get nodes
echo "重启 worker-01 的 kubelet..."
ssh root@192.168.1.30 "systemctl start kubelet"
echo "✓ 节点高可用验证完成"
4. 性能测试
4.1 集群性能基准测试
#!/bin/bash
# cluster-benchmark.sh - 集群性能基准测试
echo "=== 集群性能基准测试 ==="
# 1. Pod 启动延迟测试
echo "1. Pod 启动延迟测试:"
START=$(date +%s.%N)
kubectl run test-benchmark --image=nginx --restart=Never
while ! kubectl get pod test-benchmark -o jsonpath='{.status.phase}' | grep -q "Running"; do
sleep 0.1
done
END=$(date +%s.%N)
LATENCY=$(echo "$END - $START" | bc)
echo " Pod 启动延迟:${LATENCY}s"
kubectl delete pod test-benchmark
# 2. API Server 响应延迟
echo "2. API Server 响应延迟:"
for i in {1..10}; do
START=$(date +%s.%N)
kubectl get pods >/dev/null 2>&1
END=$(date +%s.%N)
LATENCY=$(echo "$END - $START" | bc)
echo " 请求 $i: ${LATENCY}s"
done
# 3. 网络带宽测试
echo "3. 网络带宽测试:"
kubectl run nettest1 --image=networkstatic/netperf --restart=Never --overrides='
{
"spec": {
"affinity": {
"podAntiAffinity": {
"requiredDuringSchedulingIgnoredDuringExecution": [{
"labelSelector": {
"matchExpressions": [{
"key": "run",
"operator": "In",
"values": ["nettest1"]
}]
},
"topologyKey": "kubernetes.io/hostname"
}]
}
}
}
}' -- /bin/sh -c "netperf -H nettest2" &
kubectl run nettest2 --image=networkstatic/netperf --restart=Never -- /bin/sh -c "netserver && sleep 3600"
# 4. etcd 性能测试
echo "4. etcd 性能测试:"
ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -o jsonpath='{.items[0].metadata.name}')
kubectl exec -n kube-system $ETCD_POD -- etcdctl check perf --load=low
echo "✓ 性能基准测试完成"
4.2 压力测试
#!/bin/bash
# stress-test.sh - 压力测试
echo "=== 集群压力测试 ==="
# 1. 创建大量 Pod
echo "1. 创建大量 Pod:"
kubectl create deployment stress-test --image=nginx --replicas=100
# 等待 Pod 就绪
kubectl rollout status deployment/stress-test --timeout=300s
echo "查看 Pod 状态:"
kubectl get pods | grep stress-test | wc -l
# 2. 测试 Service 性能
echo "2. 测试 Service 性能:"
kubectl expose deployment stress-test --port=80 --type=ClusterIP
for i in {1..100}; do
curl -s http://$(kubectl get svc stress-test -o jsonpath='{.spec.clusterIP}') >/dev/null &
done
wait
# 3. 清理
echo "清理测试资源:"
kubectl delete deployment stress-test
kubectl delete svc stress-test
echo "✓ 压力测试完成"
5. 集群管理
5.1 添加 Node 节点
#!/bin/bash
# add-node.sh - 添加 Node 节点
set -e
echo "=== 添加 Node 节点 ==="
NEW_NODE="192.168.1.33"
NODE_NAME="worker-04"
# 1. 准备新节点
echo "准备新节点..."
ssh root@$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_NAME
EOF
"
# 2. 更新 inventory
echo "更新 inventory..."
echo "$NEW_NODE" >> /opt/kubeasz/inventory/mycluster/hosts
# 3. 执行添加节点 Playbook
echo "执行添加节点 Playbook..."
cd /opt/kubeasz
ansible-playbook -i inventory/mycluster/hosts plays/05.kube-node.yml -v
# 4. 验证
echo "验证节点:"
kubectl get nodes
echo "✓ Node 节点添加完成"
5.2 删除 Node 节点
#!/bin/bash
# remove-node.sh - 删除 Node 节点
set -e
echo "=== 删除 Node 节点 ==="
NODE_NAME="worker-04"
NODE_IP="192.168.1.33"
# 1. 驱逐 Pod
echo "驱逐 Pod..."
kubectl drain $NODE_NAME --delete-emptydir-data --force --ignore-daemonsets
# 2. 删除节点
echo "删除节点..."
kubectl delete node $NODE_NAME
# 3. 清理节点配置
echo "清理节点配置..."
ssh root@$NODE_IP "
systemctl stop kubelet
systemctl stop kube-proxy
rm -rf /etc/kubernetes/*
rm -rf /var/lib/kubelet/*
"
# 4. 更新 inventory
echo "更新 inventory..."
sed -i "/$NODE_IP/d" /opt/kubeasz/inventory/mycluster/hosts
echo "✓ Node 节点删除完成"
5.3 证书轮换
#!/bin/bash
# certificate-rotation.sh - 证书轮换
set -e
echo "=== 证书轮换 ==="
cd /opt/kubeasz
# 检查证书有效期
echo "检查证书有效期:"
kubeadm certs check-expiration
# 执行证书轮换
echo "执行证书轮换..."
ansible-playbook -i inventory/mycluster/hosts plays/09.cert-rotation.yml -v
# 验证
echo "验证证书:"
kubeadm certs check-expiration
# 重启组件
echo "重启组件..."
ansible kube-master:kube-node -i inventory/mycluster/hosts -m shell -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. 检查节点状态
echo "1. 节点状态:"
kubectl get nodes -o wide
# 2. 检查 Pod 状态
echo "2. Pod 状态:"
kubectl get pods -A --sort-by='.status.startTime'
# 3. 检查系统 Pod
echo "3. 系统 Pod:"
kubectl get pods -n kube-system
# 4. 检查 etcd 健康
echo "4. etcd 健康:"
ETCD_POD=$(kubectl get pods -n kube-system -l component=etcd -o jsonpath='{.items[0].metadata.name}')
kubectl exec -n kube-system $ETCD_POD -- etcdctl endpoint health
# 5. 检查 API Server
echo "5. API Server 健康:"
kubectl get --raw='/healthz'
# 6. 检查组件状态
echo "6. 组件状态:"
kubectl get componentstatuses
# 7. 检查资源使用
echo "7. 资源使用:"
kubectl top nodes
kubectl top pods -A
echo "=== 健康检查完成 ==="
6.2 常见问题排查
#!/bin/bash
# troubleshoot-common-issues.sh - 常见问题排查
echo "=== 常见问题排查 ==="
# 1. Pod 无法启动
echo "1. Pod 无法启动排查:"
echo " kubectl describe pod <pod-name>"
echo " kubectl logs <pod-name>"
# 2. 节点 NotReady
echo "2. 节点 NotReady 排查:"
echo " kubectl describe node <node-name>"
echo " systemctl status kubelet"
echo " journalctl -u kubelet -f"
# 3. 网络不通
echo "3. 网络不通排查:"
echo " kubectl get pods -n calico-system"
echo " kubectl logs -n calico-system -l k8s-app=calico-node"
# 4. DNS 解析失败
echo "4. DNS 解析失败排查:"
echo " kubectl get pods -n kube-system -l k8s-app=kube-dns"
echo " kubectl logs -n kube-system -l k8s-app=kube-dns"
# 5. etcd 问题
echo "5. etcd 问题排查:"
echo " kubectl get pods -n kube-system -l component=etcd"
echo " kubectl logs -n kube-system -l component=etcd"
# 6. API Server 问题
echo "6. API Server 问题排查:"
echo " kubectl get pods -n kube-system -l component=kube-apiserver"
echo " kubectl logs -n kube-system -l component=kube-apiserver"
echo "=== 排查完成 ==="
7. 监控与告警
7.1 部署 Prometheus 监控
#!/bin/bash
# deploy-prometheus.sh - 部署 Prometheus 监控
set -e
echo "=== 部署 Prometheus 监控 ==="
# 使用 kube-prometheus-stack
echo "部署 kube-prometheus-stack..."
# 添加 Helm 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 创建命名空间
kubectl create namespace monitoring
# 安装 Prometheus
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set prometheus.serviceMonitorSelectorNilUsesHelmValues=false \
--set grafana.adminPassword=admin123
# 等待就绪
kubectl wait --for=condition=available deployment/prometheus-grafana -n monitoring --timeout=300s
# 验证
echo "验证 Prometheus:"
kubectl get pods -n monitoring
echo "✓ Prometheus 监控部署完成"
echo "访问 Grafana: kubectl port-forward svc/prometheus-grafana -n monitoring 3000:80"
8. 总结与最佳实践
8.1 部署最佳实践
- 规划先行: 详细规划网络、存储、资源
- 离线部署: 制作离线包,提高部署效率
- 高可用: 至少 3 个 Master 节点
- 监控告警: 部署 Prometheus + Grafana
- 备份恢复: 定期备份 etcd 数据
8.2 运维最佳实践
- 证书管理: 定期检查和轮换证书
- 资源监控: 实时监控资源使用
- 日志收集: 集中式日志管理
- 安全加固: RBAC、网络策略、审计日志
- 文档沉淀: 记录配置和变更
8.3 性能优化建议
- etcd 优化: SSD 存储、8GB 内存
- 网络优化: 使用 BGP 模式
- 资源预留: 合理设置 system-reserved
- 连接池: 调整 API Server 连接池
- 缓存: 启用各种缓存机制
参考文献:
版权声明: 本文版权归作者所有,转载请注明出处。
更多推荐
所有评论(0)