1. 项目概述:为什么选择k3d部署K3s高可用集群?
在云原生技术快速发展的今天,轻量级Kubernetes发行版K3s凭借其精简的二进制和低资源消耗,成为边缘计算和开发测试环境的热门选择。而k3d作为官方推荐的Docker化部署工具,能够让我们在单机环境下快速构建多节点K3s集群,特别适合以下场景:
- 本地开发环境快速搭建
- CI/CD流水线测试
- 教学演示环境构建
- 生产环境的高可用方案验证
传统的高可用K3s部署需要至少3台物理机或虚拟机,而通过k3d我们可以在单台机器上用Docker容器模拟出完整的HA环境,大幅降低学习和测试成本。实测下来,在一台16G内存的开发机上,完整的高可用集群启动时间不超过2分钟。
2. 环境准备与工具安装
2.1 基础环境要求
- 操作系统:Linux/macOS/Windows WSL2(推荐Ubuntu 20.04+)
- Docker版本:20.10.0+
- 磁盘空间:至少10GB可用
- 内存:建议8GB+(运行3个server节点需要约4GB)
注意:Windows用户建议使用WSL2后端,Docker Desktop的Hyper-V模式可能存在网络兼容性问题
2.2 核心组件安装
首先确保Docker已正确安装并运行:
# Ubuntu安装示例 sudo apt-get update sudo apt-get install -y docker.io sudo systemctl enable --now docker安装k3d命令行工具(建议版本v5.4.6+):
# 使用官方安装脚本 curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash # 验证安装 k3d --version3. 高可用集群部署实战
3.1 集群创建命令解析
完整的HA集群创建命令如下:
k3d cluster create my-ha-cluster \ --servers 3 \ --agents 2 \ --k3s-arg "--disable=traefik@server:*" \ --k3s-arg "--disable=metrics-server@server:*" \ --port 80:80@loadbalancer \ --port 443:443@loadbalancer \ --api-port 6443 \ --volume /path/to/your/kubeconfig:/etc/rancher/k3s/k3s.yaml关键参数说明:
--servers 3:创建3个server节点组成etcd集群--agents 2:创建2个worker节点--k3s-arg:传递给K3s的自定义参数--port:端口映射规则--volume:将kubeconfig文件挂载到容器内
3.2 高可用架构详解
通过k3d创建的HA集群包含以下核心组件:
- 负载均衡器:自动创建的nginx容器,负责API Server流量分发
- Server节点:运行k3s server的容器,默认使用嵌入式etcd存储
- Agent节点:运行k3s agent的容器,执行工作负载
graph TD A[LoadBalancer] --> B[Server1] A --> C[Server2] A --> D[Server3] B --> E[Agent1] B --> F[Agent2] C --> E C --> F D --> E D --> F4. 集群验证与运维
4.1 基础状态检查
获取集群节点状态:
kubectl get nodes -o wide检查组件健康状态:
kubectl get pods -n kube-system4.2 高可用性测试
- 随机停止一个server节点:
docker stop k3d-my-ha-cluster-server-0- 观察API Server自动切换:
kubectl get nodes -w- 恢复节点后验证数据一致性:
kubectl get all --all-namespaces4.3 证书管理
K3s自动处理证书轮换,但需要了解关键证书位置:
- CA证书:
/var/lib/rancher/k3s/server/tls/client-ca.crt - Server证书:
/var/lib/rancher/k3s/server/tls/serving-kube-apiserver.crt - 查看证书有效期:
sudo k3s kubectl get --raw /metrics | grep apiserver_certificate_expiration5. 常见问题排查指南
5.1 节点启动失败
现象:节点状态为NotReady
排查步骤:
- 查看容器日志:
docker logs k3d-my-ha-cluster-server-0- 检查网络连通性:
docker exec -it k3d-my-ha-cluster-server-0 ping 10.43.0.1- 常见原因:
- 端口冲突(特别是6443)
- 内核参数未正确设置
- Docker存储驱动不兼容
5.2 网络问题排查
现象:Pod间无法通信
解决方案:
- 检查Flannel网络:
kubectl -n kube-system logs -l app=flannel- 验证CNI配置:
docker exec k3d-my-ha-cluster-server-0 cat /var/lib/rancher/k3s/agent/etc/cni/net.d/10-flannel.conflist5.3 存储配置技巧
默认使用local-path-provisioner,如需持久化存储:
- 创建hostPath卷:
k3d cluster create mycluster --volume /mnt/data:/data@all- 在PVC中指定:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: local-path-pvc spec: storageClassName: local-path accessModes: - ReadWriteOnce resources: requests: storage: 2Gi6. 生产环境优化建议
6.1 性能调优参数
在创建集群时添加这些k3s参数:
--k3s-arg "--kubelet-arg=eviction-hard=memory.available<500Mi@agent:*" \ --k3s-arg "--kubelet-arg=max-pods=100@agent:*" \ --k3s-arg "--kube-apiserver-arg=api-audiences=https://kubernetes.default.svc@server:*"6.2 监控方案部署
推荐使用轻量级监控组合:
- 安装Prometheus Operator:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install prometheus prometheus-community/kube-prometheus-stack- 配置资源限制:
# values.yaml示例 prometheus: prometheusSpec: resources: limits: memory: 1Gi6.3 备份与恢复
- 定期备份etcd数据:
docker exec k3d-my-ha-cluster-server-0 etcdctl \ --endpoints=https://127.0.0.1:2379 \ --cacert=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt \ --cert=/var/lib/rancher/k3s/server/tls/etcd/client.crt \ --key=/var/lib/rancher/k3s/server/tls/etcd/client.key \ snapshot save /tmp/etcd-snapshot.db- 恢复快照:
k3d cluster stop my-ha-cluster docker cp etcd-snapshot.db k3d-my-ha-cluster-server-0:/tmp/ # 在容器内执行恢复操作 k3d cluster start my-ha-cluster7. 进阶使用场景
7.1 多集群管理
使用k3d创建多个独立集群:
k3d cluster create dev --servers 1 --agents 2 k3d cluster create staging --servers 3 --agents 3通过kubectx快速切换:
kubectl config use-context k3d-dev7.2 自定义组件配置
替换Traefik为Nginx Ingress:
k3d cluster create custom-cluster \ --k3s-arg "--disable=traefik@server:*" \ --volume ./nginx-ingress.yaml:/var/lib/rancher/k3s/server/manifests/nginx-ingress.yaml7.3 与CI/CD集成
GitLab Runner示例配置:
test: stage: test image: docker:20.10 services: - docker:20.10-dind before_script: - apk add --no-cache curl - curl -s https://raw.githubusercontent.com/k3d-io/k3d/main/install.sh | bash script: - k3d cluster create pipeline-cluster - kubectl apply -f deployment.yaml - kubectl rollout status deployment/myapp在实际使用中发现,k3d的快速重置特性特别适合CI环境。每次流水线执行后可以完全销毁集群,确保测试环境绝对干净。对于有状态应用的测试,可以配合前面提到的备份恢复方案实现持久化数据的保留。