第一部分、Kubernetes基础(第三节:Kubernetes 核心概念全解析)

Kubernetes核心概念全解析

深入理解Kubernetes核心概念是设计云原生架构的基础。本文将全面剖析Kubernetes的关键概念,结合Java应用场景,帮助您掌握这些核心抽象。

一、Pod:Kubernetes的最小调度单元

1. Pod概念解析

Pod核心特性:

  • 原子调度单位:Kubernetes不直接调度容器,而是调度Pod
  • 共享上下文:同一个Pod中的容器共享:
    • 网络命名空间(相同IP和端口空间)
    • 存储卷(Volumes)
    • 进程间通信(IPC)
  • 临时性:Pod设计为可随时被替换的(ephemeral)

Java应用最佳实践:

apiVersion: v1
kind: Pod
metadata:
  name: java-app
  labels:
    app: backend
spec:
  containers:
  - name: java-container
    image: my-java-app:1.0
    ports:
    - containerPort: 8080
    env:
    - name: JAVA_OPTS
      value: "-Xms512m -Xmx512m"
  - name: sidecar
    image: busybox
    command: ["/bin/sh", "-c", "tail -f /dev/null"]

2. Pod生命周期

关键生命周期阶段:

阶段 描述 Java应用注意事项
Pending 已被系统接受,但容器未完全创建 检查镜像拉取策略
Running Pod已绑定到节点,所有容器已创建 确保启动探针配置正确
Succeeded 所有容器成功终止 批处理作业常见状态
Failed 至少一个容器异常终止 检查日志和退出码
Unknown 无法获取Pod状态 节点通信问题

重要事件处理:

  • PreStop Hook:优雅关闭Java应用示例

    lifecycle:
      preStop:
        exec:
          command: ["sh", "-c", "curl -X POST http://localhost:8080/actuator/shutdown"]
    

二、控制器模式:声明式管理的核心

1. 常见控制器类型对比

控制器类型 适用场景 Java应用示例 关键特性
Deployment 无状态应用 Spring Boot微服务 支持滚动更新、回滚
StatefulSet 有状态应用 Kafka/ZooKeeper集群 稳定网络标识、有序部署
DaemonSet 节点级服务 日志收集Agent 每个节点运行一个Pod
Job/CronJob 批处理任务 数据报表生成 任务执行完成后退出

2. Deployment工作原理

Java应用部署示例:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: java-backend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: backend
  template:
    metadata:
      labels:
        app: backend
    spec:
      containers:
      - name: java-app
        image: myrepo/java-app:v1.2
        ports:
        - containerPort: 8080
        readinessProbe:
          httpGet:
            path: /actuator/health
            port: 8080

滚动更新策略配置:

strategy:
  type: RollingUpdate
  rollingUpdate:
    maxSurge: 1           # 可超出期望Pod数的最大值
    maxUnavailable: 0     # 更新期间不可用Pod数的最大值

三、服务发现与负载均衡

1. Service类型对比

Service类型 适用场景 特点 Java客户端访问方式
ClusterIP 内部服务访问 默认类型,分配集群内部IP 通过..svc.cluster.local
NodePort 开发测试环境 通过节点IP+端口暴露 任意节点IP:30000-32767
LoadBalancer 云服务生产环境 自动创建云负载均衡器 通过外部负载均衡器IP
ExternalName 外部服务映射 返回CNAME记录 通过别名访问

2. Ingress:高级流量管理

Java微服务Ingress配置示例:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: java-services
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - http:
      paths:
      - path: /api/user-service(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: user-service
            port:
              number: 8080
      - path: /api/order-service(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: order-service
            port:
              number: 8080

四、配置与密钥管理

1. ConfigMap vs Secret

特性 ConfigMap Secret
数据类型 非敏感配置 敏感数据
存储格式 明文 Base64编码(非加密)
大小限制 1MB 1MB
使用方式 环境变量/挂载卷 环境变量/挂载卷
Java应用示例 Spring application.properties 数据库密码、API密钥

ConfigMap使用示例:

# 创建ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: java-app-config
data:
  application.properties: |
    server.port=8080
    spring.datasource.url=jdbc:mysql://mysql:3306/mydb
    logging.level.root=INFO

# Pod中引用
spec:
  containers:
  - name: java-app
    volumeMounts:
    - name: config-volume
      mountPath: /config
  volumes:
  - name: config-volume
    configMap:
      name: java-app-config

Secret最佳实践:

# 通过kubectl创建Secret(避免YAML中明文显示)
kubectl create secret generic db-secret \
  --from-literal=username=admin \
  --from-literal=password='S!B\*d$zDsb='

# Pod中引用
env:
- name: DB_USERNAME
  valueFrom:
    secretKeyRef:
      name: db-secret
      key: username

五、命名空间(Namespace):资源隔离

1. 多环境命名空间规划

命名空间 用途 资源限制 网络策略
dev 开发环境 低配额 宽松策略
test 测试环境 中等配额 部分隔离
staging 预发布 近似生产 生产级策略
production 生产环境 高配额 严格隔离

资源配额示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: java-team-quota
spec:
  hard:
    requests.cpu: "10"
    requests.memory: 20Gi
    limits.cpu: "20"
    limits.memory: 40Gi
    pods: "50"
    services: "20"

2. Java跨命名空间访问

// 使用Kubernetes Java客户端访问跨命名空间服务
try (KubernetesClient client = new DefaultKubernetesClient()) {
    // 获取不同命名空间的Pod列表
    PodList pods = client.pods()
        .inNamespace("test")
        .withLabel("app", "backend")
        .list();
    
    // 调用其他命名空间的服务
    String serviceUrl = "http://order-service.production.svc.cluster.local:8080";
    // ... 使用HTTP客户端调用
}

总结:Kubernetes实践清单

  1. Pod设计原则
    • 遵循"一个容器一个进程"原则
    • 使用Sidecar模式处理日志、监控等辅助功能
    • 合理配置资源请求和限制
  2. 控制器选择指南
    • 无状态服务使用Deployment
    • 有状态服务使用StatefulSet
    • 节点级守护进程使用DaemonSet
  3. 服务发现优化
    • 内部通信使用ClusterIP
    • 对外暴露优先考虑Ingress
    • 利用Service Mesh处理复杂流量管理
  4. 配置管理策略
    • 敏感信息必须使用Secret
    • 环境差异配置使用ConfigMap
    • 考虑使用外部配置中心(如Spring Cloud Config)
  5. 命名空间规划
    • 按环境划分命名空间
    • 设置合理的资源配额
    • 使用NetworkPolicy控制网络访问

掌握这些核心概念后,可以更高效地在Kubernetes上设计、部署和管理现代化微服务架构。

你可能感兴趣的:(K8s,kubernetes,容器,云原生)