1. 为什么需要Kubernetes部署
在当今云原生时代,应用部署方式已经发生了翻天覆地的变化。记得2015年我刚接触容器技术时,还在用Docker Compose管理微服务,但随着服务数量突破20个,手动管理容器生命周期、网络配置和存储卷就变得异常痛苦。这正是Kubernetes(简称k8s)诞生的背景——它解决了容器编排的核心痛点。
Kubernetes本质上是一个分布式系统的操作系统,它抽象了底层硬件资源,让开发者可以像操作单机一样管理整个集群。我特别喜欢它的声明式API设计——你只需要告诉k8s"我想要什么状态",而不是"如何达到这个状态"。这种设计哲学让系统具有极强的自愈能力,比如当某个节点宕机时,k8s会自动在其他节点重建Pod。
与传统的部署方式相比,k8s带来了三个维度的提升:
- 资源利用率:通过精细的CPU/内存请求配置,我们的服务器资源利用率从30%提升到了65%
- 部署效率:原本需要2小时的部署流程,现在通过kubectl apply只需30秒
- 系统稳定性:滚动更新机制让我们的服务可用性从99.9%提升到了99.99%
2. 单节点Kubernetes环境搭建
2.1 环境准备与依赖安装
在CentOS 8上部署单节点k8s集群,我推荐使用kubeadm工具。这是官方提供的集群引导工具,相比minikube更适合生产环境的学习和测试。以下是经过多次实践验证的准备工作:
# 关闭Swap(k8s v1.8+要求) sudo swapoff -a sed -i '/ swap / s/^/#/' /etc/fstab # 设置防火墙规则 sudo firewall-cmd --permanent --add-port=6443/tcp sudo firewall-cmd --permanent --add-port=10250/tcp sudo firewall-cmd --reload # 安装容器运行时(containerd比Docker更轻量) sudo yum install -y containerd.io sudo systemctl enable --now containerd注意:如果使用WSL环境,需要特别处理systemd支持问题。建议在Ubuntu WSL中先执行:
sudo apt install -y daemonize && sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
2.2 kubeadm初始化实战
初始化集群时,这几个参数最容易踩坑:
sudo kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=192.168.1.100 \ --cri-socket=unix:///var/run/containerd/containerd.sock \ --ignore-preflight-errors=Swap关键参数解析:
--pod-network-cidr:必须与后续安装的CNI插件匹配,Flannel默认用10.244.0.0/16--apiserver-advertise-address:如果是云服务器,要填内网IP--cri-socket:指定容器运行时接口位置
初始化成功后,务必执行这三条命令:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config3. 生产级Kubernetes集群部署
3.1 高可用控制平面搭建
生产环境必须部署多master节点实现高可用。我们采用3节点方案,使用keepalived+haproxy实现API Server负载均衡:
graph TD A[VIP: 192.168.1.200] --> B[Master1] A --> C[Master2] A --> D[Master3] B --> E[Worker Nodes] C --> E D --> E具体配置要点:
- 每个master节点安装keepalived和haproxy
- 配置/etc/keepalived/keepalived.conf实现VIP漂移
- haproxy配置中需要特别处理健康检查:
backend k8s-api balance roundrobin option tcp-check server k8s-master1 192.168.1.101:6443 check fall 3 rise 2 server k8s-master2 192.168.1.102:6443 check fall 3 rise 2 server k8s-master3 192.168.1.103:6443 check fall 3 rise 2
3.2 节点调优与内核参数
生产环境必须调整的Linux内核参数:
# /etc/sysctl.d/k8s.conf net.ipv4.ip_forward = 1 net.bridge.bridge-nf-call-iptables = 1 fs.inotify.max_user_watches = 1048576 vm.swappiness = 0 kernel.panic = 10 kernel.panic_on_oops = 1这些参数直接影响k8s网络性能和稳定性。特别是vm.swappiness=0,能有效减少kubelet因内存压力误杀Pod的情况。
4. Spring Boot应用部署实战
4.1 容器化改造要点
将Spring Boot应用部署到k8s需要特别注意:
JVM内存配置:必须显式设置-Xmx,且要小于容器内存限制的80%
FROM eclipse-temurin:17-jre ENV JAVA_OPTS="-Xmx768m -XX:+UseG1GC" COPY target/*.jar app.jar ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"]健康检查配置:
livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 60 # 等待应用完全启动 periodSeconds: 15 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 5
4.2 金丝雀发布策略
通过Ingress+Deployment实现流量灰度:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: canary-demo annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "20" # 20%流量到新版本 spec: rules: - host: demo.example.com http: paths: - path: / pathType: Prefix backend: service: name: demo-service port: number: 80805. 日常运维与问题排查
5.1 集群监控方案
推荐使用Prometheus-Operator全家桶:
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts helm install kube-prometheus prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --set grafana.adminPassword=secret \ --set prometheus.prometheusSpec.retentionSize=20GB关键监控指标:
- Kubernetes集群:API请求延迟、etcd写入延迟
- 节点:CPU饱和度、内存压力、磁盘IOPS
- 应用:JVM堆内存使用率、GC次数、HTTP错误率
5.2 常见故障排查命令
Pod启动失败:
kubectl describe pod <pod-name> | grep -A10 Events kubectl logs <pod-name> --previous # 查看前一个容器的日志网络连通性问题:
kubectl run -it --rm debug-tools --image=nicolaka/netshoot -- bash curl -v http://service-name.namespace.svc.cluster.local:8080资源不足排查:
kubectl top nodes kubectl get pods --all-namespaces -o wide | grep Pending
6. 进阶技巧与优化
6.1 调度策略优化
通过节点亲和性和Pod反亲和性提高可用性:
affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/worker operator: Exists podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - my-app topologyKey: kubernetes.io/hostname6.2 GPU资源调度
对于AI训练场景,需要配置nvidia-device-plugin:
apiVersion: v1 kind: Pod metadata: name: gpu-pod spec: containers: - name: cuda-container image: nvidia/cuda:11.0-base resources: limits: nvidia.com/gpu: 2 command: ["nvidia-smi"]在智算平台中,还需要结合GPU调度器(如kube-batch)实现更复杂的调度策略。