1. Kubernetes项目部署实战指南
作为在Linux运维领域深耕多年的从业者,我见证了容器编排技术从Docker Swarm到Kubernetes的演进历程。今天要分享的是基于Kubernetes(k8s)的企业级项目部署全流程,这是当前云原生领域最核心的运维技能之一。
为什么说k8s部署是运维人员必须掌握的技能?根据2023年CNCF调查报告,全球已有96%的组织正在使用或评估Kubernetes,而其中78%的生产环境部署都运行在Linux系统上。这种技术组合不仅能实现秒级伸缩,还能提供99.99%的服务可用性保障。接下来,我将从集群搭建到应用部署,逐步拆解每个关键环节的技术要点。
2. 环境准备与集群搭建
2.1 基础设施规划
在开始部署前需要明确以下技术参数:
- 节点数量:生产环境至少3个master节点(高可用)+ N个worker节点
- 硬件配置:Master节点建议4核8G起步,Worker节点根据业务负载调整
- 网络方案:推荐Calico/Flannel,需确保Pod网络与主机网络不冲突
- 存储方案:根据业务类型选择LocalPV、NFS或Ceph RBD
重要提示:所有节点必须时间同步(chrony/NTP)且主机名解析正常,这是后续kubeadm初始化成功的前提条件。
2.2 组件安装与配置
以CentOS 7为例的基础环境配置:
# 所有节点执行 yum install -y docker-ce-20.10.* kubelet-1.23.* kubeadm-1.23.* kubectl-1.23.* systemctl enable --now docker kubelet # 修改docker cgroup驱动为systemd cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"] } EOF # 加载内核模块并修改参数 modprobe br_netfilter echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf sysctl -p初始化Master节点的关键命令:
kubeadm init \ --apiserver-advertise-address=192.168.1.100 \ --pod-network-cidr=10.244.0.0/16 \ --image-repository registry.aliyuncs.com/google_containers3. 应用部署实战
3.1 SpringBoot项目容器化
标准的Dockerfile构建示例:
FROM openjdk:8-jdk-alpine ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} app.jar ENTRYPOINT ["java","-jar","/app.jar"]构建并推送镜像:
docker build -t registry.example.com/springboot-demo:v1 . docker push registry.example.com/springboot-demo:v13.2 Kubernetes资源定义
典型的Deployment配置(deploy.yaml):
apiVersion: apps/v1 kind: Deployment metadata: name: springboot-demo spec: replicas: 3 selector: matchLabels: app: springboot-demo template: metadata: labels: app: springboot-demo spec: containers: - name: app image: registry.example.com/springboot-demo:v1 ports: - containerPort: 8080 resources: requests: cpu: "500m" memory: "512Mi"配套的Service配置(svc.yaml):
apiVersion: v1 kind: Service metadata: name: springboot-service spec: selector: app: springboot-demo ports: - protocol: TCP port: 80 targetPort: 8080 type: NodePort3.3 部署与验证
执行部署命令:
kubectl apply -f deploy.yaml kubectl apply -f svc.yaml验证部署状态:
kubectl get pods -o wide kubectl get svc kubectl logs <pod-name>4. 高级配置技巧
4.1 滚动更新策略
在Deployment中配置金丝雀发布:
spec: strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 0 type: RollingUpdate版本更新操作:
kubectl set image deployment/springboot-demo \ app=registry.example.com/springboot-demo:v2 kubectl rollout status deployment/springboot-demo4.2 配置管理方案
使用ConfigMap管理应用配置:
kubectl create configmap app-config \ --from-file=application.properties在Deployment中挂载配置:
volumeMounts: - name: config-volume mountPath: /config volumes: - name: config-volume configMap: name: app-config5. 常见问题排查
5.1 部署故障排查流程
Pod状态检查:
kubectl describe pod <pod-name> kubectl logs <pod-name> -p # 查看前一个容器的日志网络连通性测试:
kubectl run -it --rm debug \ --image=nicolaka/netshoot -- /bin/bash资源监控:
kubectl top pods kubectl get events --sort-by=.metadata.creationTimestamp
5.2 典型错误解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| ImagePullBackOff | 镜像拉取失败 | 检查镜像地址和pull secret |
| CrashLoopBackOff | 应用启动失败 | 查看应用日志排查启动错误 |
| Pending状态 | 资源不足 | 检查节点资源或PVC绑定状态 |
| 服务不可访问 | 网络策略限制 | 检查NetworkPolicy和Service定义 |
6. 性能优化实践
6.1 资源配额管理
命名空间级资源限制示例:
apiVersion: v1 kind: ResourceQuota metadata: name: mem-cpu-quota spec: hard: requests.cpu: "2" requests.memory: 4Gi limits.cpu: "4" limits.memory: 8Gi6.2 HPA自动伸缩配置
基于CPU指标的自动伸缩:
kubectl autoscale deployment springboot-demo \ --cpu-percent=50 --min=2 --max=10自定义指标伸缩(需安装metrics-server):
metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 607. 安全加固措施
7.1 RBAC权限控制
创建最小权限ServiceAccount:
apiVersion: v1 kind: ServiceAccount metadata: name: springboot-sa --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: springboot-role rules: - apiGroups: [""] resources: ["pods", "pods/log"] verbs: ["get", "list"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: springboot-rolebinding subjects: - kind: ServiceAccount name: springboot-sa roleRef: kind: Role name: springboot-role apiGroup: rbac.authorization.k8s.io7.2 网络策略配置
限制Pod间通信的NetworkPolicy:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: access-control spec: podSelector: matchLabels: app: springboot-demo policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: role: frontend ports: - protocol: TCP port: 80808. 监控与日志方案
8.1 Prometheus监控集成
使用ServiceMonitor暴露指标:
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: springboot-monitor spec: selector: matchLabels: app: springboot-demo endpoints: - port: web interval: 30s8.2 集中式日志收集
Fluentd配置示例:
<source> @type tail path /var/log/containers/*springboot*.log pos_file /var/log/springboot.log.pos tag k8s.springboot <parse> @type json time_format %Y-%m-%dT%H:%M:%S.%NZ </parse> </source>在Kubernetes中实际部署时,每个环节都需要根据具体业务场景进行调整。我在金融行业的生产环境部署中,发现Pod反亲和性配置能有效提升服务可用性:
affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - springboot-demo topologyKey: kubernetes.io/hostname