Kubernetes部署详解

张开发
2026/4/20 21:26:23 15 分钟阅读

分享文章

Kubernetes部署详解
Kubernetes部署详解本章导读Kubernetes作为云原生时代的事实标准,为容器化应用提供了强大的编排管理能力。本章系统讲解K8s核心资源(Deployment、Service、ConfigMap、Ingress)的配置与管理,帮助读者构建具备自愈、弹性伸缩、零停机部署能力的生产级应用。学习目标:目标1:理解Kubernetes架构原理与核心概念(Pod、Deployment、Service)目标2:掌握Deployment配置与滚动更新、蓝绿部署等发布策略目标3:熟练运用ConfigMap和Secret管理应用配置与敏感信息目标4:能够配置Ingress实现外部流量路由与HTTPS终止前置知识:掌握Docker容器化基础,了解YAML配置语法,具备微服务基本概念阅读时长:约 50 分钟一、知识概述Kubernetes(简称K8s)是一个开源的容器编排平台,用于自动化容器化应用的部署、扩展和管理。它提供了声明式的部署方式、自愈能力、服务发现、负载均衡等核心功能,是云原生应用的事实标准平台。1.1 Kubernetes核心价值┌─────────────────────────────────────────────────────────────┐ │ Kubernetes核心价值 │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 1. 自动化部署 │ │ - 声明式配置,描述期望状态 │ │ - 自动创建、调度容器 │ │ - 滚动更新、零停机部署 │ │ │ │ 2. 自愈能力 │ │ - 容器失败自动重启 │ │ - 节点故障自动重新调度 │ │ - 健康检查与自我修复 │ │ │ │ 3. 弹性伸缩 │ │ - 手动扩缩容 │ │ - 自动水平伸缩(HPA) │ │ - 基于指标自动调整 │ │ │ │ 4. 服务发现与负载均衡 │ │ - 内置DNS服务 │ │ - Service抽象 │ │ - 自动负载分发 │ │ │ │ 5. 配置与密钥管理 │ │ - ConfigMap配置管理 │ │ - Secret敏感信息保护 │ │ - 配置热更新 │ │ │ └─────────────────────────────────────────────────────────────┘1.2 Kubernetes架构┌─────────────────────────────────────────────────────────────────────────┐ │ Kubernetes 集群架构 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │ Master Node (控制平面) │ │ │ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌───────────┐ │ │ │ │ │ API Server │ │ etcd │ │ Controller │ │ Scheduler │ │ │ │ │ │ (入口) │ │ (存储) │ │ Manager │ │ (调度) │ │ │ │ │ └─────────────┘ └─────────────┘ └─────────────┘ └───────────┘ │ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │ │ │ ┌───────────────┼───────────────┐ │ │ ▼ ▼ ▼ │ │ ┌─────────────────────┐ ┌─────────────────────┐ ┌─────────────────┐ │ │ │ Worker Node 1 │ │ Worker Node 2 │ │ Worker Node 3 │ │ │ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │ ┌─────────────┐ │ │ │ │ │ kubelet │ │ │ │ kubelet │ │ │ │ kubelet │ │ │ │ │ └───────────────┘ │ │ └───────────────┘ │ │ └─────────────┘ │ │ │ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │ ┌─────────────┐ │ │ │ │ │ kube-proxy │ │ │ │ kube-proxy │ │ │ │ kube-proxy │ │ │ │ │ └───────────────┘ │ │ └───────────────┘ │ │ └─────────────┘ │ │ │ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │ ┌─────────────┐ │ │ │ │ │ Container │ │ │ │ Container │ │ │ │ Container │ │ │ │ │ │ Runtime │ │ │ │ Runtime │ │ │ │ Runtime │ │ │ │ │ └───────────────┘ │ │ └───────────────┘ │ │ └─────────────┘ │ │ │ └─────────────────────┘ └─────────────────────┘ └─────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────────┘1.3 核心概念关系┌─────────────────────────────────────────────────────────────────────────┐ │ Kubernetes 核心资源 │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ Namespace (命名空间) │ │ └── 隔离环境,资源分组 │ │ │ │ └── Deployment (部署) │ │ ├── 管理Pod副本数量 │ │ └── 控制器确保期望状态 │ │ │ │ └── ReplicaSet (副本集) │ │ └── 维护Pod数量 │ │ │ │ └── Pod (最小部署单元) │ │ ├── 一个或多个容器 │ │ └── 共享网络和存储 │ │ │ │ └── Container (容器) │ │ └── 实际运行的应用 │ │ │ │ Service (服务) │ │ └── 暴露应用,提供稳定访问端点 │ │ │ │ ConfigMap / Secret │ │ └── 配置和敏感信息管理 │ │ │ │ Ingress (入口) │ │ └── HTTP路由,外部访问入口 │ │ │ └─────────────────────────────────────────────────────────────────────────┘二、Deployment详解2.1 Deployment基础配置# deployment-basic.yaml - 基础Deployment配置apiVersion:apps/v1kind:Deploymentmetadata:name:myapp-deploymentnamespace:productionlabels:app:myapptier:backendannotations:description:"MyApp后端服务"owner:"backend-team"spec:# 副本数replicas:3# 选择器,匹配Pod标签selector:matchLabels:app:myapp# Pod模板template:metadata:labels:app:myappversion:v1annotations:prometheus.io/scrape:"true"prometheus.io/port:"8080"spec:# 容器定义containers:-name:myappimage:registry.example.com/myapp:v1.0.0imagePullPolicy:IfNotPresent# 端口配置ports:-name:httpcontainerPort:8080protocol:TCP-name:managementcontainerPort:8081protocol:TCP# 环境变量env:-name:SPRING_PROFILES_ACTIVEvalue:"prod"-name:JAVA_OPTSvalue:"-Xms512m -Xmx1g -XX:+UseG1GC"-name:POD_NAMEvalueFrom:fieldRef:fieldPath:metadata.name-name:POD_NAMESPACEvalueFrom:fieldRef:fieldPath:metadata.namespace# 从ConfigMap引用环境变量envFrom:-configMapRef:name:myapp-config-secretRef:name:myapp-secret# 资源限制resources:requests:memory:"512Mi"cpu:"500m"limits:memory:"1Gi"cpu:"1000m"# 存活探针livenessProbe:httpGet:path:/actuator/health/livenessport:8080initialDelaySeconds:30periodSeconds:10timeoutSeconds:3failureThreshold:3# 就绪探针readinessProbe:httpGet:path:/actuator/health/readinessport:8080initialDelaySeconds:10periodSeconds:5timeoutSeconds:3failureThreshold:3# 启动探针(针对启动慢的应用)startupProbe:httpGet:path:/actuator/health/livenessport:8080initialDelaySeconds:10periodSeconds:5timeoutSeconds:3failureThreshold:30# 最多等待150秒# 卷挂载volumeMounts:-name:config-volumemountPath:/app/configreadOnly:true-name:logs-volumemountPath:/app/logs# 卷定义volumes:-name:config-volumeconfigMap:name:myapp-config-name:logs-volumeemptyDir:{}# 镜像拉取密钥imagePullSecrets:-name:registry-secret# 服务账户serviceAccountName:myapp-sa# 安全上下文securityContext:runAsNonRoot:truerunAsUser:1000fsGroup:1000# 节点选择器nodeSelector:node-role:worker# 节点亲和性affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:-matchExpressions:-key:kubernetes.io/archoperator:Invalues:-amd64preferredDuringSchedulingIgnoredDuringExecution:-weight:50preference:matchExpressions:-key:node-zoneoperator:Invalues:-zone-a# Pod反亲和性(分散部署)podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:-weight:100podAffinityTerm:labelSelector:matchExpressions:-key:appoperator:Invalues:-myapptopologyKey:kubernetes.io/hostname# 容忍度tolerations:-key:"dedicated"operator:"Equal"value:"backend"effect:"NoSchedule"---# 命令行操作示例# kubectl apply -f deployment-basic.yaml# kubectl get deployment myapp-deployment -n production# kubectl describe deployment myapp-deployment -n production# kubectl get pods -l app=myapp -n production2.2 滚动更新策略# deployment-strategy.yaml - 滚动更新策略配置apiVersion:apps/v1kind:Deploymentmetadata:name:myapp-deploymentnamespace:productionspec:replicas:10# 修订历史限制revisionHistoryLimit:10# 选择器selector:matchLabels:app:myapp# 更新策略strategy:type:RollingUpdaterollingUpdate:# 最多超出期望副本数的数量/比例maxSurge:25%# 可以是数字或百分比# 最多不可用副本数的数量/比例maxUnavailable:25%# 可以是数字或百分比template:metadata:labels:app:myappspec:containers:-name:myappimage:registry.example.com/myapp:v2.0.0ports:-containerPort:8080---# 滚动更新命令# kubectl set image deployment/myapp-deployment myapp=myapp:v2.0.0 -n production# kubectl rollout status deployment/myapp-deployment -n production# kubectl rollout history deployment/myapp-deployment -n production# kubectl rollout undo deployment/myapp-deployment -n production# kubectl rollout undo deployment/myapp-deployment --to-revision=2 -n production---# 蓝绿部署示例apiVersion:apps/v1kind:Deploymentmetadata:name:myapp-bluenamespace:productionspec:replicas:3selector:matchLabels:app:myappversion:bluetemplate:metadata:labels:app:myappversion:bluespec:containers:-name:myappimage:registry.example.com/myapp:v1.0.0ports:-containerPort:8080---apiVersion:apps/v1kind:Deploymentmetadata:name:myapp-greennamespace:productionspec:replicas:3selector:matchLabels:app:myappversion:greentemplate:metadata:labels:app:myappversion:greenspec:containers:-name:myappimage:registry.example.com/myapp:v2.0.0ports:-containerPort:8080---# 通过Service切换流量apiVersion:v1kind:Servicemetadata:name:myapp-servicenamespace:productionspec:selector:

更多文章