1. Kubernetes服务部署全景解析
Kubernetes(简称K8s)作为容器编排领域的事实标准,其服务部署过程涉及集群搭建、资源配置、网络规划等多个技术维度。在实际生产环境中,从零开始部署一个高可用的K8s服务需要系统性地解决以下核心问题:
提示:本文基于v1.24+版本实践,部分配置与早期版本存在差异,特别是dockershim移除后的CRI选择
1.1 基础环境准备要点
节点规划需考虑混合部署场景,建议至少包含:
- 3个控制平面节点(实现etcd高可用)
- 2-5个工作节点(根据业务负载动态扩展)
- 专用负载均衡器(如HAProxy+Keepalived)
操作系统配置关键项包括:
# 禁用交换分区(永久生效) sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab sudo swapoff -a # 加载内核模块 cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF # 设置容器运行时参数 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF1.2 容器运行时选择策略
自v1.24起默认不再包含dockershim,主流选择对比:
| 运行时 | 适用场景 | 性能特点 | 调试复杂度 |
|---|---|---|---|
| containerd | 生产环境首选 | 资源占用低 | 中等 |
| CRI-O | OpenShift集成环境 | 启动速度快 | 较高 |
| Docker Engine | 开发测试环境(需适配层) | 生态工具丰富 | 低 |
推荐containerd配置示例:
# /etc/containerd/config.toml [plugins."io.containerd.grpc.v1.cri"] sandbox_image = "registry.k8s.io/pause:3.7" [plugins."io.containerd.grpc.v1.cri".containerd] snapshotter = "overlayfs"2. 集群初始化与组件配置
2.1 控制平面部署实战
使用kubeadm初始化时关键参数解析:
kubeadm init \ --control-plane-endpoint "LOAD_BALANCER_DNS:6443" \ --upload-certs \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --image-repository registry.aliyuncs.com/google_containers重要目录结构说明:
/etc/kubernetes/ ├── admin.conf # 集群管理员kubeconfig ├── controller-manager.conf ├── kubelet.conf ├── manifests # 静态Pod定义目录 │ ├── etcd.yaml │ ├── kube-apiserver.yaml │ └── ... └── pki # 证书文件2.2 网络插件选型指南
主流CNI插件性能对比(基于100节点压力测试):
| 插件类型 | 网络延迟 | 吞吐量 | IPAM效率 | 适用场景 |
|---|---|---|---|---|
| Calico | 1.2ms | 8Gbps | 高 | 需要网络策略 |
| Flannel | 0.8ms | 6Gbps | 中 | 简单Overlay网络 |
| Cilium | 0.6ms | 10Gbps | 高 | eBPF高级功能需求 |
| Weave | 1.5ms | 5Gbps | 低 | 简易部署环境 |
Cilium配置示例(修改IP池):
apiVersion: cilium.io/v2 kind: CiliumClusterwideNetworkPolicy metadata: name: custom-pool spec: ipam: clusterPoolIPv4CIDR: "10.0.0.0/16" clusterPoolIPv4MaskSize: 243. 工作负载部署进阶实践
3.1 Deployment控制器深度配置
多环境差异化部署示例:
apiVersion: apps/v1 kind: Deployment metadata: name: web-app spec: replicas: 3 strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 0 selector: matchLabels: app: web template: metadata: annotations: prometheus.io/scrape: "true" spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: [web] topologyKey: kubernetes.io/hostname containers: - name: web image: nginx:1.23-alpine lifecycle: postStart: exec: command: ["/bin/sh", "-c", "echo INIT_COMPLETE > /tmp/status"]3.2 Service流量管理方案
不同Service类型对比:
| 类型 | 实现原理 | 适用场景 | 典型配置示例 |
|---|---|---|---|
| ClusterIP | 内部虚拟IP | 服务间通信 | spec.type: ClusterIP |
| NodePort | 节点端口映射 | 临时外部访问 | nodePort: 30080 |
| LoadBalancer | 云厂商LB集成 | 生产环境外部暴露 | externalTrafficPolicy: Local |
| ExternalName | DNS别名 | 集成外部服务 | externalName: mysql.prod.svc |
Ingress高级配置示例(Nginx控制器):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: canary-ingress annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "20" spec: rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: app-canary port: number: 804. 生产环境运维关键点
4.1 高可用保障机制
控制平面组件健康检查策略:
# kube-apiserver静态Pod添加livenessProbe livenessProbe: httpGet: path: /livez port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 # kube-controller-manager配置 readinessProbe: httpGet: path: /healthz port: 10257 scheme: HTTPS failureThreshold: 34.2 常见故障排查流程
Pod启动失败诊断步骤:
- 检查事件日志
kubectl describe pod/<name> -n <namespace> - 查看容器日志
kubectl logs <pod-name> -c <container-name> --previous - 验证镜像拉取
crictl pull <image-url> - 检查资源配额
kubectl describe quota -n <namespace>
网络连通性测试方法:
# 创建诊断Pod kubectl run net-tool --image=nicolaka/netshoot -it --rm # 进入容器后执行 dig <service-name>.<namespace>.svc.cluster.local curl -v http://<service-ip>:<port> traceroute <target-ip>5. 版本升级与配置优化
5.1 集群升级路线规划
版本升级路径示例(逐步升级):
当前版本:1.22.x 升级路径:1.22 → 1.23 → 1.24 → 1.25 时间间隔:每个版本间隔至少2周关键检查项:
- 验证API版本废弃情况
kubectl api-resources --api-group=* - 检查存储类兼容性
- 测试工作负载滚动更新
5.2 性能调优参数
kubelet关键配置(/var/lib/kubelet/config.yaml):
apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration evictionHard: memory.available: "500Mi" nodefs.available: "10%" kubeReserved: cpu: "500m" memory: "1Gi" systemReserved: cpu: "500m" memory: "1Gi"API服务器优化参数:
# /etc/kubernetes/manifests/kube-apiserver.yaml spec: containers: - command: - kube-apiserver - --audit-log-maxbackup=10 - --event-ttl=1h - --http2-max-streams-per-connection=10006. 安全加固实践方案
6.1 RBAC精细化控制
角色定义示例(开发人员权限):
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: dev name: developer rules: - apiGroups: [""] resources: ["pods", "services"] verbs: ["create", "get", "list"] - apiGroups: ["apps"] resources: ["deployments"] verbs: ["patch"]6.2 网络策略实施
Calico网络策略示例(隔离前端/后端):
apiVersion: projectcalico.org/v3 kind: NetworkPolicy metadata: name: frontend-policy spec: selector: role == 'frontend' ingress: - action: Allow protocol: TCP source: selector: role == 'backend' destination: ports: [8080]7. 监控与日志体系构建
7.1 指标采集方案
Prometheus Operator核心配置:
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: app-monitor spec: selector: matchLabels: app: web endpoints: - port: web interval: 30s path: /metrics7.2 日志收集架构
EFK栈部署要点:
- Filebeat DaemonSet配置容器日志采集
- Fluentd处理多行日志(Java堆栈跟踪)
- Elasticsearch索引生命周期管理策略
- Kibana可视化仪表板模板
日志收集器资源限制示例:
resources: limits: cpu: 500m memory: 1Gi requests: cpu: 200m memory: 512Mi8. 持续交付流水线集成
8.1 Jenkins动态Agent配置
Jenkinsfile片段示例:
pipeline { agent { kubernetes { label "k8s-agent" yaml """ spec: containers: - name: jnlp resources: limits: cpu: 1 memory: 2Gi - name: docker image: docker:20.10 command: ["cat"] tty: true """ } } stages { stage('Build') { steps { container('docker') { sh 'docker build -t ${IMAGE_TAG} .' } } } } }8.2 GitOps实践模式
ArgoCD应用定义示例:
apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: production-app spec: destination: server: https://kubernetes.default.svc namespace: production source: repoURL: git@github.com:myorg/gitops-repo.git path: apps/production targetRevision: HEAD syncPolicy: automated: prune: true selfHeal: true