Kubernetes高可用集群部署实战与优化指南
1. Kubernetes集群搭建实战复盘
上周终于把生产环境的K8s集群部署上线了,整个过程踩了不少坑,也积累了一些实战经验。这次部署的是v1.25版本的Kubernetes,采用3个master节点+5个worker节点的高可用架构,网络插件选的Calico,存储方案用的Ceph RBD。下面就把这次部署的核心流程和关键注意事项做个完整记录。
重要提示:生产环境部署前务必做好备份方案,我在第一次部署时就因为ETCD配置错误导致需要全部重装
1.1 基础环境准备
所有节点统一使用Ubuntu 22.04 LTS系统,内核升级到5.15版本。硬件配置方面:
- Master节点:8核CPU/32GB内存/200GB SSD(需要运行ETCD)
- Worker节点:16核CPU/64GB内存/500GB SSD(运行业务容器)
先在所有节点执行基础环境配置:
# 关闭swap sudo swapoff -a sudo sed -i '/ swap / s/^/#/' /etc/fstab # 设置内核参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sudo sysctl --system1.2 关键组件安装
使用官方推荐的kubeadm工具进行安装,版本锁定为1.25.6:
# 安装docker(containerd也可) sudo apt-get install -y docker.io sudo systemctl enable docker # 安装kubeadm/kubelet/kubectl sudo apt-get install -y apt-transport-https ca-certificates curl curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.25/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.25/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt-get update sudo apt-get install -y kubelet=1.25.6-1.1 kubeadm=1.25.6-1.1 kubectl=1.25.6-1.1 sudo apt-mark hold kubelet kubeadm kubectl2. 集群初始化与高可用配置
2.1 首个Master节点初始化
创建kubeadm配置文件kubeadm-config.yaml:
apiVersion: kubeadm.k8s.io/v1beta3 kind: InitConfiguration localAPIEndpoint: advertiseAddress: "192.168.1.101" bindPort: 6443 --- apiVersion: kubeadm.k8s.io/v1beta3 kind: ClusterConfiguration kubernetesVersion: v1.25.6 controlPlaneEndpoint: "k8s-api.example.com:6443" networking: podSubnet: "10.244.0.0/16" serviceSubnet: "10.96.0.0/12" apiServer: certSANs: - "k8s-api.example.com" - "192.168.1.101" - "192.168.1.102" - "192.168.1.103" --- apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration cgroupDriver: systemd执行初始化:
sudo kubeadm init --config=kubeadm-config.yaml --upload-certs初始化完成后会输出加入集群的命令,务必保存好这些命令。配置kubectl:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config2.2 安装网络插件
选择Calico作为CNI插件:
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/tigera-operator.yaml kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/custom-resources.yaml验证网络状态:
watch kubectl get pods -n calico-system2.3 加入其他Master节点
使用初始化时生成的命令在其他两个Master节点执行:
sudo kubeadm join k8s-api.example.com:6443 --token xxxx \ --discovery-token-ca-cert-hash sha256:xxxx \ --control-plane --certificate-key xxxx验证高可用:
kubectl get nodes kubectl -n kube-system get pods3. Worker节点加入与配置
3.1 节点加入集群
在每个Worker节点执行初始化时生成的join命令:
sudo kubeadm join k8s-api.example.com:6443 --token xxxx \ --discovery-token-ca-cert-hash sha256:xxxx3.2 节点标签与污点设置
根据业务需求设置节点标签:
kubectl label nodes node1 disktype=ssd kubectl label nodes node2 gpu=true对于特殊节点设置污点:
kubectl taint nodes node3 dedicated=special:NoSchedule4. 存储与网络高级配置
4.1 Ceph RBD存储配置
先在所有节点安装ceph-common:
sudo apt-get install -y ceph-common创建StorageClass:
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: ceph-rbd provisioner: kubernetes.io/rbd parameters: monitors: 10.0.0.1:6789,10.0.0.2:6789,10.0.0.3:6789 adminId: admin adminSecretName: ceph-secret adminSecretNamespace: kube-system pool: kube userId: kube userSecretName: ceph-secret-user fsType: ext4 imageFormat: "2" imageFeatures: layering4.2 网络策略配置
示例网络策略限制命名空间间通信:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny-all namespace: production spec: podSelector: {} policyTypes: - Ingress - Egress5. 监控与日志方案
5.1 Prometheus监控部署
使用kube-prometheus-stack:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --create-namespace \ --values values.yaml5.2 EFK日志收集
部署Elasticsearch+Fluentd+Kibana:
helm install elasticsearch elastic/elasticsearch --namespace logging helm install fluentd fluent/fluentd --namespace logging helm install kibana elastic/kibana --namespace logging6. 常见问题排查记录
6.1 节点NotReady问题
可能原因及解决方案:
- 网络插件未正常运行 → 检查Calico Pod状态
- kubelet服务异常 →
journalctl -u kubelet查看日志 - 节点资源不足 → 检查内存/磁盘空间
6.2 Pod一直Pending
排查步骤:
kubectl describe pod <pod-name> kubectl get events --sort-by='.metadata.creationTimestamp'常见原因:
- 资源不足
- 不满足节点选择器/亲和性规则
- PV/PVC问题
6.3 网络连通性问题
诊断工具:
# 检查DNS解析 kubectl run -it --rm --image=busybox:1.28 test -- nslookup kubernetes.default # 检查服务连通性 kubectl run -it --rm --image=nicolaka/netshoot test -- curl http://service-name7. 生产环境优化建议
7.1 关键参数调优
kubelet配置优化:
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration maxPods: 150 kubeReserved: cpu: "1" memory: 2Gi systemReserved: cpu: "1" memory: 2Gi evictionHard: memory.available: "500Mi" nodefs.available: "10%"7.2 安全加固措施
- 启用Pod安全准入控制
- 定期轮换证书
- 限制Dashboard访问
- 启用审计日志
# 检查安全配置 kubectl get --raw=/metrics | grep apiserver_audit这次部署最大的教训是一定要先在测试环境充分验证所有配置,特别是ETCD和网络插件的参数设置。我们因为Calico的IP池配置错误导致第一次部署后全部重来,耽误了整整一天时间。另外建议使用Terraform等IaC工具管理节点配置,可以大大减少人为操作失误。
