Kubernetes架构、部署、应用备忘录

计算机网络以及路由交换协议与Kubernetes架构的相同之处

1. 核心组件对照

计算机网络与路由交换 Kubernetes 架构 对应关系说明
路由器(Router) kube-apiserver 路由器负责在不同网络之间转发数据包,而 kube-apiserver 是 Kubernetes 的核心组件,负责接收和处理所有 API 请求。
交换机(Switch) kube-scheduler 交换机负责在局域网内转发数据包,而 kube-scheduler 负责将 Pod 调度到合适的节点上。
路由表(Routing Table) etcd 路由表存储网络的路由信息,而 etcd 存储 Kubernetes 集群的所有状态和配置信息。
ARP 协议(地址解析协议) kubelet ARP 协议用于将 IP 地址解析为 MAC 地址,而 kubelet 负责将 Pod 的配置信息解析为实际的容器运行状态。
BGP/OSPF 协议(路由协议) kube-proxy BGP/OSPF 协议用于动态学习和分发路由信息,而 kube-proxy 负责动态维护 Service 的 IP 和端口转发规则。
防火墙(Firewall) NetworkPolicy 防火墙用于控制网络流量,而 NetworkPolicy 用于控制 Pod 之间的网络通信。

2. 网络模型对照

计算机网络与路由交换 Kubernetes 架构 对应关系说明
IP 地址(IP Address) Pod IP IP 地址用于标识网络中的设备,而 Pod IP 用于标识 Kubernetes 集群中的 Pod。
子网(Subnet) Namespace 子网用于划分网络,而 Namespace 用于划分 Kubernetes 集群中的资源。
VLAN(虚拟局域网) Network Policy VLAN 用于隔离网络流量,而 Network Policy 用于隔离 Pod 之间的网络通信。
NAT(网络地址转换) Service NAT 用于将私有 IP 地址映射为公有 IP 地址,而 Service 用于将 Pod IP 映射为集群内外的访问地址。
负载均衡(Load Balancer) Ingress 负载均衡用于分发网络流量,而 Ingress 用于分发外部流量到集群内的 Service。

3. 部署与运维对照

计算机网络与路由交换 Kubernetes 架构 对应关系说明
静态路由配置 静态 Pod 配置 静态路由需要手动配置,而静态 Pod 通过配置文件直接部署在节点上。
动态路由协议(如 BGP) 动态调度与扩展 动态路由协议自动学习和更新路由信息,而 Kubernetes 动态调度 Pod 并根据负载自动扩展。
网络监控(如 SNMP) 监控与日志(如 Prometheus) 网络监控用于收集和分析网络状态,而 Kubernetes 使用 Prometheus 等工具监控集群状态。
故障切换(Failover) Pod 重启与节点故障恢复 故障切换用于在网络设备故障时切换到备用设备,而 Kubernetes 在 Pod 或节点故障时自动重启或重新调度。

4. 总结思维图

计算机网络与路由交换                     Kubernetes 架构
-------------------------------         -------------------------------
路由器 (Router)                         kube-apiserver (API 网关)
交换机 (Switch)                         kube-scheduler (调度器)
路由表 (Routing Table)                  etcd (状态存储)
ARP 协议 (地址解析)                     kubelet (节点代理)
BGP/OSPF 协议 (路由协议)                kube-proxy (网络代理)
防火墙 (Firewall)                       NetworkPolicy (网络策略)
IP 地址 (IP Address)                    Pod IP (Pod 地址)
子网 (Subnet)                           Namespace (命名空间)
VLAN (虚拟局域网)                       Network Policy (网络策略)
NAT (网络地址转换)                      Service (服务)
负载均衡 (Load Balancer)                Ingress (入口)
静态路由配置                            静态 Pod 配置
动态路由协议 (如 BGP)                   动态调度与扩展
网络监控 (如 SNMP)                      监控与日志 (如 Prometheus)
故障切换 (Failover)                     Pod 重启与节点故障恢复

5. 关键点总结

  1. 核心组件
    • Kubernetes 的核心组件(如 kube-apiserverkube-scheduleretcd)与网络设备(如路由器、交换机、路由表)在功能上高度相似,都是负责信息传递和决策。
  2. 网络模型
    • Kubernetes 的网络模型(如 Pod IP、Service、Ingress)与计算机网络中的 IP 地址、NAT、负载均衡等概念一一对应。
  3. 部署与运维
    • Kubernetes 的动态调度、监控和故障恢复机制与网络中的动态路由、监控和故障切换机制类似,都是为了提高系统的可用性和可靠性。

1. 分层架构

计算机网络与路由交换 Kubernetes 架构 对应关系说明
OSI 七层模型 Kubernetes 分层架构 OSI 模型将网络通信分为七层,而 Kubernetes 的架构也可以分为控制层、数据层和应用层,每层各司其职。
物理层(Physical Layer) 节点(Node) 物理层负责传输原始比特流,而节点是 Kubernetes 中运行容器的物理或虚拟机。
数据链路层(Data Link Layer) CNI(容器网络接口) 数据链路层负责帧的传输,而 CNI 负责 Pod 之间的网络通信。
网络层(Network Layer) Service 和 Ingress 网络层负责 IP 地址和路由,而 Service 和 Ingress 负责 Pod 的网络访问和流量分发。
传输层(Transport Layer) kube-proxy 传输层负责端到端的通信(如 TCP/UDP),而 kube-proxy 负责 Service 的端口转发和负载均衡。
应用层(Application Layer) Pod 和容器 应用层负责具体的应用协议(如 HTTP),而 Pod 和容器是 Kubernetes 中运行应用的实体。

2. 协议与通信

计算机网络与路由交换 Kubernetes 架构 对应关系说明
TCP/IP 协议栈 Kubernetes API 通信 TCP/IP 协议栈是网络通信的基础,而 Kubernetes 的组件通过 API 进行通信和协调。
HTTP/HTTPS 协议 kube-apiserver 的 REST API HTTP/HTTPS 是 Web 通信的标准协议,而 kube-apiserver 通过 REST API 提供集群的管理接口。
DNS(域名解析系统) CoreDNS DNS 用于将域名解析为 IP 地址,而 CoreDNS 是 Kubernetes 中用于服务发现的默认 DNS 组件。
ARP(地址解析协议) kubelet 的 Pod 状态同步 ARP 用于将 IP 地址解析为 MAC 地址,而 kubelet 负责将 Pod 的期望状态同步为实际状态。

3. 安全机制

计算机网络与路由交换 Kubernetes 架构 对应关系说明
防火墙(Firewall) NetworkPolicy 防火墙用于控制网络流量,而 NetworkPolicy 用于控制 Pod 之间的网络通信。
VPN(虚拟专用网络) Service Mesh(如 Istio) VPN 用于加密和隔离网络通信,而 Service Mesh 提供了 Pod 之间的安全通信和流量管理。
TLS/SSL 加密 Kubernetes 的证书管理 TLS/SSL 用于加密网络通信,而 Kubernetes 使用证书管理来保护 API 通信和组件之间的交互。
ACL(访问控制列表) RBAC(基于角色的访问控制) ACL 用于控制网络访问权限,而 RBAC 用于控制用户和服务账户对 Kubernetes 资源的访问权限。

4. 扩展性与高可用

计算机网络与路由交换 Kubernetes 架构 对应关系说明
路由器的冗余设计 kube-apiserver 的高可用 路由器通过冗余设计提高可用性,而 kube-apiserver 通过多实例部署实现高可用。
交换机的堆叠技术 etcd 的集群部署 交换机的堆叠技术用于扩展带宽和冗余,而 etcd 通过集群部署实现数据的高可用和一致性。
负载均衡器(Load Balancer) Ingress Controller 负载均衡器用于分发流量,而 Ingress Controller 用于分发外部流量到集群内的 Service。
动态路由协议(如 BGP) Pod 的动态调度与扩展 动态路由协议用于自动学习和更新路由信息,而 Kubernetes 动态调度 Pod 并根据负载自动扩展。

5. 故障排查与监控

计算机网络与路由交换 Kubernetes 架构 对应关系说明
Ping 和 Traceroute kubectl describe 和 logs Ping 和 Traceroute 用于排查网络连通性问题,而 kubectl describelogs 用于排查 Pod 和节点的状态问题。
SNMP(简单网络管理协议) Prometheus 和 Grafana SNMP 用于监控网络设备的状态,而 Prometheus 和 Grafana 用于监控 Kubernetes 集群的状态。
NetFlow(流量分析) kube-proxy 的流量统计 NetFlow 用于分析网络流量,而 kube-proxy 负责统计和转发 Service 的流量。
Syslog(系统日志) Fluentd 和 Elasticsearch Syslog 用于收集网络设备的日志,而 Fluentd 和 Elasticsearch 用于收集和分析 Kubernetes 的日志。

6. 总结思维图

计算机网络与路由交换                     Kubernetes 架构
-------------------------------         -------------------------------
OSI 七层模型                            Kubernetes 分层架构
物理层 (Physical Layer)                 节点 (Node)
数据链路层 (Data Link Layer)            CNI (容器网络接口)
网络层 (Network Layer)                  Service 和 Ingress
传输层 (Transport Layer)                kube-proxy
应用层 (Application Layer)              Pod 和容器
TCP/IP 协议栈                           Kubernetes API 通信
HTTP/HTTPS 协议                         kube-apiserver 的 REST API
DNS (域名解析系统)                      CoreDNS
ARP (地址解析协议)                      kubelet 的 Pod 状态同步
防火墙 (Firewall)                       NetworkPolicy
VPN (虚拟专用网络)                      Service Mesh (如 Istio)
TLS/SSL 加密                            Kubernetes 的证书管理
ACL (访问控制列表)                      RBAC (基于角色的访问控制)
路由器的冗余设计                        kube-apiserver 的高可用
交换机的堆叠技术                        etcd 的集群部署
负载均衡器 (Load Balancer)              Ingress Controller
动态路由协议 (如 BGP)                   Pod 的动态调度与扩展
Ping 和 Traceroute                      kubectl describe 和 logs
SNMP (简单网络管理协议)                 Prometheus 和 Grafana
NetFlow (流量分析)                      kube-proxy 的流量统计
Syslog (系统日志)                       Fluentd 和 Elasticsearch

7. 关键点总结

  1. 分层架构
    • Kubernetes 的分层架构与 OSI 七层模型类似,每层都有明确的职责和功能。
  2. 协议与通信
    • Kubernetes 的组件通过 API 进行通信,类似于网络中的协议栈。
  3. 安全机制
    • Kubernetes 提供了多种安全机制(如 NetworkPolicy、RBAC),类似于网络中的防火墙和 VPN。
  4. 扩展性与高可用
    • Kubernetes 通过动态调度、集群部署和负载均衡实现扩展性和高可用,类似于网络中的冗余设计和动态路由。
  5. 故障排查与监控
    • Kubernetes 提供了丰富的工具(如 kubectl、Prometheus)用于故障排查和监控,类似于网络中的 Ping、SNMP 和 Syslog。

Namespace应用场景与原理

1. 什么是 Namespace?

  • Namespace 是 Kubernetes 中用于资源隔离和组织的逻辑分区。
  • 它允许在同一个集群中创建多个虚拟集群,每个 Namespace 中的资源名称可以重复,但跨 Namespace 的资源名称必须唯一。
  • 默认情况下,Kubernetes 提供了几个内置的 Namespace,如 defaultkube-systemkube-public

2. Namespace 的原理

  1. 资源隔离
    • Namespace 将集群资源(如 Pod、Service、Deployment 等)隔离到不同的逻辑分区中。
    • 不同 Namespace 中的资源相互独立,无法直接访问。
  2. 资源配额
    • 可以为每个 Namespace 设置资源配额(Resource Quota),限制其使用的 CPU、内存、存储等资源。
  3. 权限控制
    • 使用 RBAC(基于角色的访问控制)可以为不同 Namespace 分配不同的权限,实现细粒度的访问控制。
  4. 网络隔离
    • 默认情况下,不同 Namespace 中的 Pod 可以通过 Service 名称相互访问。
    • 如果需要更严格的网络隔离,可以使用网络策略(Network Policy)限制跨 Namespace 的流量。

3. Namespace 的应用场景

  1. 多租户环境
    • 在同一个集群中为不同的团队或客户分配独立的 Namespace,实现资源隔离和权限控制。
  2. 环境隔离
    • 将开发、测试和生产环境部署到不同的 Namespace,避免环境之间的干扰。
  3. 资源管理
    • 通过资源配额限制每个 Namespace 的资源使用,防止资源耗尽。
  4. 权限管理
    • 为不同团队或用户分配不同的 Namespace 权限,确保安全性和合规性。
  5. 应用隔离
    • 将不同的应用部署到不同的 Namespace,便于管理和维护。

4. Namespace 的应用案例

案例 1:多租户环境

  • 场景:一个公司有多个团队(如开发团队、测试团队、运维团队),每个团队需要独立的 Kubernetes 环境。
  • 解决方案
    1. 为每个团队创建一个 Namespace:
      kubectl create namespace dev
      kubectl create namespace test
      kubectl create namespace ops
      
    2. 为每个 Namespace 设置资源配额:
      apiVersion: v1
      kind: ResourceQuota
      metadata:
        name: dev-quota
        namespace: dev
      spec:
        hard:
          requests.cpu: "10"
          requests.memory: "20Gi"
          limits.cpu: "20"
          limits.memory: "40Gi"
      
    3. 为每个团队分配权限:
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: dev-team-binding
        namespace: dev
      subjects:
      - kind: Group
        name: dev-team
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: Role
        name: dev-role
        apiGroup: rbac.authorization.k8s.io
      

案例 2:环境隔离

  • 场景:一个应用需要在开发、测试和生产环境中部署,确保环境之间互不干扰。
  • 解决方案
    1. 为每个环境创建一个 Namespace:
      kubectl create namespace dev
      kubectl create namespace test
      kubectl create namespace prod
      
    2. 在每个 Namespace 中部署应用:
      kubectl apply -f app.yaml -n dev
      kubectl apply -f app.yaml -n test
      kubectl apply -f app.yaml -n prod
      
    3. 使用不同的配置文件和资源配额管理每个环境。

案例 3:资源管理

  • 场景:一个集群中有多个应用,需要限制每个应用的资源使用。
  • 解决方案
    1. 为每个应用创建一个 Namespace:
      kubectl create namespace app1
      kubectl create namespace app2
      
    2. 为每个 Namespace 设置资源配额:
      apiVersion: v1
      kind: ResourceQuota
      metadata:
        name: app1-quota
        namespace: app1
      spec:
        hard:
          requests.cpu: "5"
          requests.memory: "10Gi"
          limits.cpu: "10"
          limits.memory: "20Gi"
      
    3. 监控每个 Namespace 的资源使用情况:
      kubectl describe resourcequota app1-quota -n app1
      

案例 4:权限管理

  • 场景:一个公司有多个部门,每个部门需要访问不同的 Kubernetes 资源。
  • 解决方案
    1. 为每个部门创建一个 Namespace:
      kubectl create namespace finance
      kubectl create namespace hr
      
    2. 为每个部门分配权限:
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: finance-team-binding
        namespace: finance
      subjects:
      - kind: Group
        name: finance-team
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: Role
        name: finance-role
        apiGroup: rbac.authorization.k8s.io
      
    3. 确保每个部门只能访问其 Namespace 中的资源。

5. 注意事项

  1. 资源隔离
    • Namespace 只能隔离 Kubernetes 资源,不能隔离节点或物理资源。
  2. 网络隔离
    • 默认情况下,不同 Namespace 中的 Pod 可以通过 Service 名称相互访问,需要使用网络策略实现更严格的隔离。
  3. 资源配额
    • 资源配额只能限制 Namespace 中的资源使用,不能限制集群级别的资源使用。
  4. 权限管理
    • 使用 RBAC 时,确保为每个 Namespace 分配正确的权限,避免权限泄露。

Namespace 资源配额

1. 启用资源配额

什么是资源配额?

  • 资源配额(Resource Quota) 是 Kubernetes 中用于限制 Namespace 资源使用的一种机制。
  • 它可以限制 Namespace 中的计算资源(如 CPU、内存)、存储资源(如存储卷、持久卷)和对象数量(如 Pod、Service)。

启用资源配额

  1. 创建 Namespace
    kubectl create namespace my-namespace
    
  2. 创建 ResourceQuota 资源
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: my-quota
      namespace: my-namespace
    spec:
      hard:
        requests.cpu: "10"
        requests.memory: "20Gi"
        limits.cpu: "20"
        limits.memory: "40Gi"
        requests.storage: "100Gi"
        persistentvolumeclaims: "10"
        pods: "50"
        services: "10"
    
  3. 应用 ResourceQuota
    kubectl apply -f quota.yaml
    

2. 计算资源配额

支持的资源类型

  1. CPU
    • requests.cpu:请求的 CPU 资源。
    • limits.cpu:CPU 资源上限。
  2. 内存
    • requests.memory:请求的内存资源。
    • limits.memory:内存资源上限。

示例

apiVersion: v1
kind: ResourceQuota
metadata:
  name: compute-quota
  namespace: my-namespace
spec:
  hard:
    requests.cpu: "10"
    requests.memory: "20Gi"
    limits.cpu: "20"
    limits.memory: "40Gi"

验证配额

kubectl describe resourcequota compute-quota -n my-namespace

3. 存储资源配额

支持的资源类型

  1. 存储请求
    • requests.storage:请求的存储资源。
  2. 持久卷声明
    • persistentvolumeclaims:持久卷声明的数量。
  3. 存储类
    • requests.storageclass.storage.k8s.io/<storage-class-name>:特定存储类的存储请求。

示例

apiVersion: v1
kind: ResourceQuota
metadata:
  name: storage-quota
  namespace: my-namespace
spec:
  hard:
    requests.storage: "100Gi"
    persistentvolumeclaims: "10"
    requests.storageclass.storage.k8s.io/ssd: "50Gi"

验证配额

kubectl describe resourcequota storage-quota -n my-namespace

4. 对象数据配额

支持的资源类型

  1. Pod
    • pods:Pod 的数量。
  2. Service
    • services:Service 的数量。
  3. ConfigMap
    • configmaps:ConfigMap 的数量。
  4. Secret
    • secrets:Secret 的数量。
  5. ReplicationController
    • replicationcontrollers:ReplicationController 的数量。
  6. Deployment
    • deployments.apps:Deployment 的数量。
  7. StatefulSet
    • statefulsets.apps:StatefulSet 的数量。
  8. Job
    • jobs.batch:Job 的数量。
  9. CronJob
    • cronjobs.batch:CronJob 的数量。

示例

apiVersion: v1
kind: ResourceQuota
metadata:
  name: object-quota
  namespace: my-namespace
spec:
  hard:
    pods: "50"
    services: "10"
    configmaps: "20"
    secrets: "10"
    deployments.apps: "5"
    statefulsets.apps: "3"
    jobs.batch: "10"
    cronjobs.batch: "5"

验证配额

kubectl describe resourcequota object-quota -n my-namespace

5. 综合示例

apiVersion: v1
kind: ResourceQuota
metadata:
  name: comprehensive-quota
  namespace: my-namespace
spec:
  hard:
    requests.cpu: "10"
    requests.memory: "20Gi"
    limits.cpu: "20"
    limits.memory: "40Gi"
    requests.storage: "100Gi"
    persistentvolumeclaims: "10"
    pods: "50"
    services: "10"
    configmaps: "20"
    secrets: "10"
    deployments.apps: "5"
    statefulsets.apps: "3"
    jobs.batch: "10"
    cronjobs.batch: "5"

6. 注意事项

  1. 配额限制
    • 资源配额只能限制 Namespace 中的资源使用,不能限制集群级别的资源使用。
  2. 配额更新
    • 更新 ResourceQuota 时,需要确保新的配额不会导致现有资源超出限制。
  3. 配额监控
    • 定期监控资源配额的使用情况,及时调整配额以避免资源耗尽。
  4. 配额冲突
    • 如果多个 ResourceQuota 资源对同一资源类型设置了不同的限制,Kubernetes 会取最小值作为实际限制。

Kubernetes Label

1. Label 的基本概念

  • Label 是 Kubernetes 中用于标识和分类资源的键值对。
  • Label 可以附加到任何 Kubernetes 资源(如 Pod、Service、Node 等)上,用于查询、筛选和组织资源。
  • Label 的键和值必须是字符串,且长度不超过 63 个字符。

2. Label 的使用场景

  1. 资源分类
    • 使用 Label 对资源进行分类,如环境(dev、test、prod)、应用(app1、app2)、团队(team1、team2)等。
  2. 资源筛选
    • 使用 Label 筛选资源,如查询特定环境或应用的所有 Pod。
  3. 资源关联
    • 使用 Label 关联资源,如将 Service 与特定 Pod 关联。
  4. 资源调度
    • 使用 Label 控制 Pod 的调度,如将 Pod 调度到特定节点。

3. Label 的实战案例

案例 1:资源分类

  • 场景:一个集群中有多个应用(app1、app2)和多个环境(dev、test、prod),需要对这些资源进行分类。
  • 解决方案
    1. 为 Pod 添加 Label:
      apiVersion: v1
      kind: Pod
      metadata:
        name: app1-dev
        labels:
          app: app1
          env: dev
      spec:
        containers:
        - name: app1
          image: nginx
      
    2. 查询特定环境或应用的所有 Pod:
      kubectl get pods -l env=dev
      kubectl get pods -l app=app1
      

案例 2:资源筛选

  • 场景:一个集群中有多个团队(team1、team2),需要查询特定团队的所有资源。
  • 解决方案
    1. 为资源添加 Label:
      apiVersion: v1
      kind: Pod
      metadata:
        name: team1-pod
        labels:
          team: team1
      spec:
        containers:
        - name: team1
          image: nginx
      
    2. 查询特定团队的所有资源:
      kubectl get all -l team=team1
      

案例 3:资源关联

  • 场景:一个 Service 需要关联特定 Label 的 Pod。
  • 解决方案
    1. 为 Pod 添加 Label:
      apiVersion: v1
      kind: Pod
      metadata:
        name: app1-pod
        labels:
          app: app1
      spec:
        containers:
        - name: app1
          image: nginx
      
    2. 创建 Service 并关联 Label:
      apiVersion: v1
      kind: Service
      metadata:
        name: app1-service
      spec:
        selector:
          app: app1
        ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      

案例 4:资源调度

  • 场景:一个 Pod 需要调度到特定 Label 的节点。
  • 解决方案
    1. 为节点添加 Label:
      kubectl label node <node-name> disk=ssd
      
    2. 创建 Pod 并指定节点选择器:
      apiVersion: v1
      kind: Pod
      metadata:
        name: ssd-pod
      spec:
        containers:
        - name: ssd
          image: nginx
        nodeSelector:
          disk: ssd
      

4. Label 的高级用法

案例 5:多条件筛选

  • 场景:查询特定环境和应用的所有 Pod。
  • 解决方案
    kubectl get pods -l env=dev,app=app1
    

案例 6:正则表达式筛选

  • 场景:查询所有以 app 开头的 Pod。
  • 解决方案
    kubectl get pods -l 'app in (app1, app2)'
    

案例 7:Label 的增删改查

  1. 添加 Label
    kubectl label pod app1-pod version=v1
    
  2. 删除 Label
    kubectl label pod app1-pod version-
    
  3. 修改 Label
    kubectl label pod app1-pod version=v2 --overwrite
    
  4. 查看 Label
    kubectl get pod app1-pod --show-labels
    

5. 注意事项

  1. Label 命名规范
    • Label 的键和值必须符合 DNS 子域名的命名规范,且长度不超过 63 个字符。
  2. Label 的唯一性
    • Label 的键在同一个资源中必须唯一,但不同资源可以使用相同的键。
  3. Label 的查询性能
    • 使用 Label 查询资源时,Kubernetes 会对所有资源进行扫描,因此在大规模集群中可能会影响性能。
  4. Label 的维护
    • 定期清理无用的 Label,避免资源管理混乱。

Pod

1. Pod 的基本概念

  • Pod 是 Kubernetes 中最小的部署单元,包含一个或多个容器。
  • 同一个 Pod 中的容器共享网络和存储资源,可以通过 localhost 相互通信。
  • Pod 是短暂的,Kubernetes 会根据需要创建、销毁和重新调度 Pod。
  • 每个 Pod 都有一个唯一的 IP 地址,但在 Pod 重启或重新调度时可能会发生变化。

2. Pod 的工作方式

  1. 调度
    • Kubernetes 调度器将 Pod 分配到合适的节点上运行。
  2. 运行
    • 节点上的 Kubelet 负责启动和管理 Pod 中的容器。
  3. 监控
    • Kubelet 会监控 Pod 的状态,并在 Pod 失败时重新启动容器。
  4. 销毁
    • 当 Pod 不再需要时,Kubernetes 会将其销毁并释放资源。

3. 创建和删除 Pod

创建 Pod

  1. 使用 kubectl run 命令
    kubectl run my-pod --image=nginx
    
  2. 使用 YAML 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
    
    应用配置文件:
    kubectl apply -f pod.yaml
    

删除 Pod

  1. 使用 kubectl delete 命令
    kubectl delete pod my-pod
    
  2. 使用 YAML 配置文件
    kubectl delete -f pod.yaml
    

4. 以配置文件方式创建静态 Pod

什么是静态 Pod?

  • 静态 Pod 是由节点上的 Kubelet 直接管理的 Pod,不通过 Kubernetes API Server。
  • 静态 Pod 的配置文件通常放在节点的特定目录中,Kubelet 会定期检查该目录并创建或更新 Pod。

创建静态 Pod

  1. 在节点上创建配置文件
    sudo vi /etc/kubernetes/manifests/static-pod.yaml
    
    内容如下:
    apiVersion: v1
    kind: Pod
    metadata:
      name: static-pod
    spec:
      containers:
      - name: nginx
        image: nginx
    
  2. Kubelet 自动创建 Pod
    • Kubelet 会定期检查 /etc/kubernetes/manifests 目录,并创建或更新 Pod。
  3. 查看静态 Pod
    kubectl get pods
    
    注意:静态 Pod 的名称会包含节点名称,如 static-pod-<node-name>

删除静态 Pod

  1. 删除配置文件
    sudo rm /etc/kubernetes/manifests/static-pod.yaml
    
  2. Kubelet 自动删除 Pod
    • Kubelet 会检测到配置文件被删除,并删除对应的 Pod。

5. 以 HTTP 创建静态 Pod

配置 Kubelet

  1. 修改 Kubelet 配置文件
    sudo vi /var/lib/kubelet/config.yaml
    
    添加以下内容:
    staticPodPath: /etc/kubernetes/manifests
    staticPodURL: http://<server-ip>/manifests
    
  2. 重启 Kubelet
    sudo systemctl restart kubelet
    

创建静态 Pod

  1. 在 HTTP 服务器上放置配置文件
    • 在 HTTP 服务器的 /manifests 目录下放置 static-pod.yaml 文件。
  2. Kubelet 自动创建 Pod
    • Kubelet 会从 HTTP 服务器下载配置文件,并创建或更新 Pod。
  3. 查看静态 Pod
    kubectl get pods
    

删除静态 Pod

  1. 从 HTTP 服务器删除配置文件
    • 删除 HTTP 服务器上的 static-pod.yaml 文件。
  2. Kubelet 自动删除 Pod
    • Kubelet 会检测到配置文件被删除,并删除对应的 Pod。

6. 注意事项

  1. Pod 的生命周期
    • Pod 是短暂的,Kubernetes 会根据需要创建、销毁和重新调度 Pod。
  2. 静态 Pod 的管理
    • 静态 Pod 由 Kubelet 直接管理,不通过 Kubernetes API Server,因此无法使用 kubectl 命令直接管理。
  3. Pod 的网络和存储
    • 同一个 Pod 中的容器共享网络和存储资源,可以通过 localhost 相互通信。
  4. Pod 的资源限制
    • 可以为 Pod 设置资源请求和限制,确保其不会占用过多资源。

Pod 资源限制

1. Pod 资源限制

什么是资源限制?

  • 资源限制 是 Kubernetes 中用于限制 Pod 使用的 CPU 和内存资源的机制。
  • 资源限制包括 请求(requests)上限(limits)
    • 请求:Pod 启动时所需的最小资源。
    • 上限:Pod 可以使用的最大资源。

设置资源限制

  1. 在 Pod 配置文件中设置
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
    
  2. 应用配置文件
    kubectl apply -f pod.yaml
    
  3. 验证资源限制
    kubectl describe pod my-pod
    
    输出中会显示资源请求和上限:
    Limits:
      cpu:     500m
      memory:  128Mi
    Requests:
      cpu:     250m
      memory:  64Mi
    

2. 根据 Node 节点名称进行 Pod 资源调度

什么是节点名称调度?

  • 节点名称调度 是将 Pod 调度到指定节点的一种方式。
  • 通过 nodeName 字段指定目标节点的名称。

设置节点名称调度

  1. 在 Pod 配置文件中设置
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      nodeName: <node-name>
      containers:
      - name: nginx
        image: nginx
    
  2. 应用配置文件
    kubectl apply -f pod.yaml
    
  3. 验证调度结果
    kubectl get pod my-pod -o wide
    
    输出中会显示 Pod 所在的节点名称:
    NAME      READY   STATUS    RESTARTS   AGE   IP           NODE
    my-pod    1/1     Running   0          10s   10.244.1.2   <node-name>
    

3. 根据 Node 节点标签进行调度

什么是节点标签调度?

  • 节点标签调度 是将 Pod 调度到具有特定标签的节点的一种方式。
  • 通过 nodeSelector 字段指定目标节点的标签。

设置节点标签调度

  1. 为节点添加标签
    kubectl label node <node-name> disk=ssd
    
  2. 在 Pod 配置文件中设置
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      nodeSelector:
        disk: ssd
      containers:
      - name: nginx
        image: nginx
    
  3. 应用配置文件
    kubectl apply -f pod.yaml
    
  4. 验证调度结果
    kubectl get pod my-pod -o wide
    
    输出中会显示 Pod 所在的节点名称:
    NAME      READY   STATUS    RESTARTS   AGE   IP           NODE
    my-pod    1/1     Running   0          10s   10.244.1.2   <node-name>
    

4. 高级调度策略

节点亲和性(Node Affinity)

  • 节点亲和性 是一种更灵活的调度策略,允许根据节点的标签和条件进行调度。
  • 支持 requiredDuringSchedulingIgnoredDuringExecution(必须满足)和 preferredDuringSchedulingIgnoredDuringExecution(优先满足)两种模式。

设置节点亲和性

  1. 在 Pod 配置文件中设置
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: disk
                operator: In
                values:
                - ssd
      containers:
      - name: nginx
        image: nginx
    
  2. 应用配置文件
    kubectl apply -f pod.yaml
    
  3. 验证调度结果
    kubectl get pod my-pod -o wide
    

5. 注意事项

  1. 资源限制的合理性
    • 设置资源请求和上限时,确保其合理,避免资源浪费或 Pod 无法启动。
  2. 节点名称调期的局限性
    • 节点名称调度是一种硬性调度策略,如果目标节点不可用,Pod 将无法启动。
  3. 节点标签调期的灵活性
    • 节点标签调度是一种灵活的调度策略,可以根据节点的标签动态选择目标节点。
  4. 节点亲和性的复杂性
    • 节点亲和性提供了更复杂的调度策略,但配置和管理也相对复杂。

Node 节点亲和性

1. Node 节点亲和性

什么是节点亲和性?

  • 节点亲和性(Node Affinity) 是 Kubernetes 中用于控制 Pod 调度到特定节点的一种机制。
  • 它允许根据节点的标签和条件进行调度,支持 硬亲和性(Required)软亲和性(Preferred) 两种模式。

节点亲和性的类型

  1. 硬亲和性(Required)
    • Pod 必须调度到满足条件的节点上,否则无法启动。
  2. 软亲和性(Preferred)
    • Pod 优先调度到满足条件的节点上,但如果条件不满足,仍然可以调度到其他节点。

2. 硬亲和性实战

场景

  • 一个 Pod 必须调度到具有 disk=ssd 标签的节点上。

步骤

  1. 为节点添加标签
    kubectl label node <node-name> disk=ssd
    
  2. 在 Pod 配置文件中设置硬亲和性
    apiVersion: v1
    kind: Pod
    metadata:
      name: hard-affinity-pod
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: disk
                operator: In
                values:
                - ssd
      containers:
      - name: nginx
        image: nginx
    
  3. 应用配置文件
    kubectl apply -f hard-affinity-pod.yaml
    
  4. 验证调度结果
    kubectl get pod hard-affinity-pod -o wide
    
    输出中会显示 Pod 所在的节点名称:
    NAME               READY   STATUS    RESTARTS   AGE   IP           NODE
    hard-affinity-pod  1/1     Running   0          10s   10.244.1.2   <node-name>
    

3. 软亲和性实战

场景

  • 一个 Pod 优先调度到具有 disk=ssd 标签的节点上,但如果条件不满足,仍然可以调度到其他节点。

步骤

  1. 为节点添加标签
    kubectl label node <node-name> disk=ssd
    
  2. 在 Pod 配置文件中设置软亲和性
    apiVersion: v1
    kind: Pod
    metadata:
      name: soft-affinity-pod
    spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: disk
                operator: In
                values:
                - ssd
      containers:
      - name: nginx
        image: nginx
    
  3. 应用配置文件
    kubectl apply -f soft-affinity-pod.yaml
    
  4. 验证调度结果
    kubectl get pod soft-affinity-pod -o wide
    
    输出中会显示 Pod 所在的节点名称:
    NAME               READY   STATUS    RESTARTS   AGE   IP           NODE
    soft-affinity-pod  1/1     Running   0          10s   10.244.1.2   <node-name>
    

4. 高级配置

多条件亲和性

  • 可以同时设置多个硬亲和性和软亲和性条件。

示例

apiVersion: v1
kind: Pod
metadata:
  name: multi-affinity-pod
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disk
            operator: In
            values:
            - ssd
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: gpu
            operator: In
            values:
            - "true"
  containers:
  - name: nginx
    image: nginx

应用配置文件

kubectl apply -f multi-affinity-pod.yaml

验证调度结果

kubectl get pod multi-affinity-pod -o wide

5. 注意事项

  1. 硬亲和性的限制
    • 硬亲和性是一种严格的调度策略,如果条件不满足,Pod 将无法启动。
  2. 软亲和性的灵活性
    • 软亲和性是一种灵活的调度策略,即使条件不满足,Pod 仍然可以调度到其他节点。
  3. 节点标签的管理
    • 确保节点的标签正确设置,避免调度失败或不符合预期。
  4. 资源限制的合理性
    • 在设置节点亲和性时,确保节点的资源足够,避免 Pod 无法启动或资源争用。

Pod 亲和性

1. Pod 亲和性说明

什么是 Pod 亲和性?

  • Pod 亲和性(Pod Affinity) 是 Kubernetes 中用于控制 Pod 调度到与特定 Pod 在同一节点或不同节点的机制。
  • 它允许根据其他 Pod 的标签和条件进行调度,支持 亲和性(Affinity)反亲和性(Anti-Affinity) 两种模式。

Pod 亲和性的类型

  1. Pod 亲和性(PodAffinity)
    • Pod 调度到与特定 Pod 在同一节点上。
  2. Pod 反亲和性(PodAntiAffinity)
    • Pod 调度到与特定 Pod 不在同一节点上。

调度模式

  1. 硬亲和性(Required)
    • Pod 必须满足条件,否则无法启动。
  2. 软亲和性(Preferred)
    • Pod 优先满足条件,但如果条件不满足,仍然可以调度到其他节点。

2. PodAffinity 硬亲和性实战

场景

  • 一个 Pod 必须调度到与具有 app=web 标签的 Pod 在同一节点上。

步骤

  1. 创建目标 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: web-pod
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx
    
  2. 创建具有硬亲和性的 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: affinity-pod
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web
            topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: nginx
    
  3. 应用配置文件
    kubectl apply -f web-pod.yaml
    kubectl apply -f affinity-pod.yaml
    
  4. 验证调度结果
    kubectl get pods -o wide
    
    输出中会显示两个 Pod 在同一节点上:
    NAME         READY   STATUS    RESTARTS   AGE   IP           NODE
    web-pod      1/1     Running   0          10s   10.244.1.2   node1
    affinity-pod 1/1     Running   0          5s    10.244.1.3   node1
    

3. PodAffinity 软亲和性实战

场景

  • 一个 Pod 优先调度到与具有 app=web 标签的 Pod 在同一节点上,但如果条件不满足,仍然可以调度到其他节点。

步骤

  1. 创建目标 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: web-pod
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx
    
  2. 创建具有软亲和性的 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: soft-affinity-pod
    spec:
      affinity:
        podAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                - web
              topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: nginx
    
  3. 应用配置文件
    kubectl apply -f web-pod.yaml
    kubectl apply -f soft-affinity-pod.yaml
    
  4. 验证调度结果
    kubectl get pods -o wide
    
    输出中会显示两个 Pod 在同一节点上:
    NAME               READY   STATUS    RESTARTS   AGE   IP           NODE
    web-pod            1/1     Running   0          10s   10.244.1.2   node1
    soft-affinity-pod  1/1     Running   0          5s    10.244.1.3   node1
    

4. PodAntiAffinity 硬亲和性实战

场景

  • 一个 Pod 必须调度到与具有 app=web 标签的 Pod 不在同一节点上。

步骤

  1. 创建目标 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: web-pod
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx
    
  2. 创建具有硬反亲和性的 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: anti-affinity-pod
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web
            topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: nginx
    
  3. 应用配置文件
    kubectl apply -f web-pod.yaml
    kubectl apply -f anti-affinity-pod.yaml
    
  4. 验证调度结果
    kubectl get pods -o wide
    
    输出中会显示两个 Pod 不在同一节点上:
    NAME               READY   STATUS    RESTARTS   AGE   IP           NODE
    web-pod            1/1     Running   0          10s   10.244.1.2   node1
    anti-affinity-pod  1/1     Running   0          5s    10.244.2.2   node2
    

5. PodAntiAffinity 软亲和性实战

场景

  • 一个 Pod 优先调度到与具有 app=web 标签的 Pod 不在同一节点上,但如果条件不满足,仍然可以调度到其他节点。

步骤

  1. 创建目标 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: web-pod
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx
    
  2. 创建具有软反亲和性的 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: soft-anti-affinity-pod
    spec:
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                - web
              topologyKey: kubernetes.io/hostname
      containers:
      - name: nginx
        image: nginx
    
  3. 应用配置文件
    kubectl apply -f web-pod.yaml
    kubectl apply -f soft-anti-affinity-pod.yaml
    
  4. 验证调度结果
    kubectl get pods -o wide
    
    输出中会显示两个 Pod 不在同一节点上:
    NAME                   READY   STATUS    RESTARTS   AGE   IP           NODE
    web-pod                1/1     Running   0          10s   10.244.1.2   node1
    soft-anti-affinity-pod 1/1     Running   0          5s    10.244.2.2   node2
    

6. 生产案例

场景

  • 一个生产环境中,需要确保同一应用的多个副本分布在不同的节点上,以提高可用性。

解决方案

  1. 创建 Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: web
      template:
        metadata:
          labels:
            app: web
        spec:
          affinity:
            podAntiAffinity:
              requiredDuringSchedulingIgnoredDuringExecution:
              - labelSelector:
                  matchExpressions:
                  - key: app
                    operator: In
                    values:
                    - web
                topologyKey: kubernetes.io/hostname
          containers:
          - name: nginx
            image: nginx
    
  2. 应用配置文件
    kubectl apply -f web-deployment.yaml
    
  3. 验证调度结果
    kubectl get pods -o wide
    
    输出中会显示三个 Pod 分布在不同的节点上:
    NAME                              READY   STATUS    RESTARTS   AGE   IP           NODE
    web-deployment-5f7b5f6c4b-2q6wz   1/1     Running   0          10s   10.244.1.2   node1
    web-deployment-5f7b5f6c4b-4x8yv   1/1     Running   0          10s   10.244.2.2   node2
    web-deployment-5f7b5f6c4b-6z9xw   1/1     Running   0          10s   10.244.3.2   node3
    

7. 注意事项

  1. 调度策略的合理性
    • 根据实际需求选择合适的调度策略,避免过度限制或资源浪费。
  2. 节点资源的充足性
    • 确保节点资源足够,避免 Pod 无法启动或资源争用。
  3. 标签的管理
    • 确保 Pod 和节点的标签正确设置,避免调度失败或不符合预期。
  4. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证调度策略的有效性。

节点和污点管理

1. 节点和污点

什么是节点污点?

  • 节点污点(Taint) 是 Kubernetes 中用于标记节点的机制,表示该节点不接受某些 Pod 的调度。
  • 污点由 键(Key)值(Value)效果(Effect) 组成,效果包括:
    • NoSchedule:Pod 不会被调度到该节点。
    • PreferNoSchedule:Pod 尽量避免调度到该节点。
    • NoExecute:Pod 不会被调度到该节点,且已运行的 Pod 会被驱逐。

什么是容忍?

  • 容忍(Toleration) 是 Kubernetes 中用于允许 Pod 调度到具有特定污点的节点的机制。
  • 容忍由 键(Key)值(Value)操作符(Operator)效果(Effect) 组成。

2. 节点污点管理

添加污点

  1. 使用 kubectl taint 命令
    kubectl taint nodes <node-name> key=value:NoSchedule
    
  2. 示例
    kubectl taint nodes node1 gpu=true:NoSchedule
    

查看污点

kubectl describe node <node-name>

输出中会显示污点信息:

Taints:             gpu=true:NoSchedule

删除污点

  1. 使用 kubectl taint 命令
    kubectl taint nodes <node-name> key=value:NoSchedule-
    
  2. 示例
    kubectl taint nodes node1 gpu=true:NoSchedule-
    

3. 污点和容忍应用实战

场景 1:限制 Pod 调度到特定节点

  1. 为节点添加污点
    kubectl taint nodes node1 gpu=true:NoSchedule
    
  2. 创建 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
    
  3. 验证调度结果
    kubectl get pod my-pod -o wide
    
    输出中会显示 Pod 未调度到 node1
    NAME      READY   STATUS    RESTARTS   AGE   IP           NODE
    my-pod    1/1     Running   0          10s   10.244.2.2   node2
    

场景 2:允许 Pod 调度到具有特定污点的节点

  1. 为节点添加污点
    kubectl taint nodes node1 gpu=true:NoSchedule
    
  2. 创建具有容忍的 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: tolerant-pod
    spec:
      containers:
      - name: nginx
        image: nginx
      tolerations:
      - key: "gpu"
        operator: "Equal"
        value: "true"
        effect: "NoSchedule"
    
  3. 验证调度结果
    kubectl get pod tolerant-pod -o wide
    
    输出中会显示 Pod 调度到 node1
    NAME           READY   STATUS    RESTARTS   AGE   IP           NODE
    tolerant-pod   1/1     Running   0          10s   10.244.1.2   node1
    

场景 3:驱逐已运行的 Pod

  1. 为节点添加污点
    kubectl taint nodes node1 gpu=true:NoExecute
    
  2. 创建 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
    
  3. 验证调度结果
    kubectl get pod my-pod -o wide
    
    输出中会显示 Pod 被驱逐:
    NAME      READY   STATUS    RESTARTS   AGE   IP           NODE
    my-pod    0/1     Evicted   0          10s   <none>       <none>
    
  4. 创建具有容忍的 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: tolerant-pod
    spec:
      containers:
      - name: nginx
        image: nginx
      tolerations:
      - key: "gpu"
        operator: "Equal"
        value: "true"
        effect: "NoExecute"
    
  5. 验证调度结果
    kubectl get pod tolerant-pod -o wide
    
    输出中会显示 Pod 调度到 node1
    NAME           READY   STATUS    RESTARTS   AGE   IP           NODE
    tolerant-pod   1/1     Running   0          10s   10.244.1.2   node1
    

4. 生产案例

场景

  • 一个生产环境中,需要确保某些节点只运行特定的 Pod(如 GPU 任务),而其他 Pod 不会调度到这些节点。

解决方案

  1. 为 GPU 节点添加污点
    kubectl taint nodes gpu-node1 gpu=true:NoSchedule
    kubectl taint nodes gpu-node2 gpu=true:NoSchedule
    
  2. 创建 GPU 任务的 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-pod
    spec:
      containers:
      - name: nvidia
        image: nvidia/cuda:11.0-base
      tolerations:
      - key: "gpu"
        operator: "Equal"
        value: "true"
        effect: "NoSchedule"
    
  3. 验证调度结果
    kubectl get pod gpu-pod -o wide
    
    输出中会显示 Pod 调度到 GPU 节点:
    NAME      READY   STATUS    RESTARTS   AGE   IP           NODE
    gpu-pod   1/1     Running   0          10s   10.244.1.2   gpu-node1
    

5. 注意事项

  1. 污点的合理性
    • 根据实际需求合理设置污点,避免过度限制或资源浪费。
  2. 容忍的管理
    • 确保 Pod 的容忍与节点的污点匹配,避免调度失败或不符合预期。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证污点和容忍的有效性。
  4. 节点资源的充足性
    • 确保节点资源足够,避免 Pod 无法启动或资源争用。

Pod的重启策略、生命周期、探针

1. 常见的 Pod 状态

Pod 的状态

  1. Pending
    • Pod 已被 Kubernetes 接受,但尚未调度到节点上。
    • 可能原因:调度器正在寻找合适的节点,或镜像正在下载。
  2. Running
    • Pod 已调度到节点上,且所有容器已启动。
    • 可能原因:Pod 正常运行。
  3. Succeeded
    • Pod 中的所有容器已成功完成并退出。
    • 可能原因:任务型 Pod 已完成。
  4. Failed
    • Pod 中的至少一个容器已失败并退出。
    • 可能原因:容器启动失败或任务执行失败。
  5. Unknown
    • Pod 的状态无法确定。
    • 可能原因:节点与 API Server 通信失败。
  6. CrashLoopBackOff
    • Pod 中的容器反复崩溃并重启。
    • 可能原因:容器启动失败或配置错误。
  7. Terminating
    • Pod 正在被删除。
    • 可能原因:用户手动删除 Pod 或资源回收。

2. 重启策略

什么是重启策略?

  • 重启策略(Restart Policy) 是 Kubernetes 中用于控制 Pod 中容器重启行为的机制。
  • 重启策略包括:
    • Always:容器退出时总是重启(默认策略)。
    • OnFailure:容器非正常退出时重启。
    • Never:容器退出时不重启。

设置重启策略

  1. 在 Pod 配置文件中设置
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      restartPolicy: OnFailure
      containers:
      - name: nginx
        image: nginx
    
  2. 应用配置文件
    kubectl apply -f pod.yaml
    
  3. 验证重启策略
    kubectl describe pod my-pod
    
    输出中会显示重启策略:
    Restart Policy: OnFailure
    

3. Pod 的生命周期

Pod 的生命周期阶段

  1. Pending
    • Pod 已被 Kubernetes 接受,但尚未调度到节点上。
  2. Running
    • Pod 已调度到节点上,且所有容器已启动。
  3. Succeeded/Failed
    • Pod 中的所有容器已成功完成或失败。
  4. Terminating
    • Pod 正在被删除。

Pod 的生命周期事件

  1. 初始化容器(Init Containers)
    • 在应用容器启动前运行的容器,用于执行初始化任务。
  2. 应用容器(Containers)
    • 运行应用的主容器。
  3. 钩子(Hooks)
    • 启动后钩子(PostStart):容器启动后执行的操作。
    • 停止前钩子(PreStop):容器停止前执行的操作。
  4. 探针(Probes)
    • 存活探针(Liveness Probe):检查容器是否存活。
    • 就绪探针(Readiness Probe):检查容器是否就绪。
    • 启动探针(Startup Probe):检查容器是否启动完成。

Pod 的生命周期示例

  1. 创建 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: lifecycle-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "echo 'Container started' > /tmp/start.log"]
          preStop:
            exec:
              command: ["/bin/sh", "-c", "echo 'Container stopping' > /tmp/stop.log"]
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
    
  2. 应用配置文件
    kubectl apply -f lifecycle-pod.yaml
    
  3. 验证生命周期事件
    kubectl exec lifecycle-pod -- cat /tmp/start.log
    kubectl exec lifecycle-pod -- cat /tmp/stop.log
    
    输出中会显示生命周期事件:
    Container started
    Container stopping
    

4. 生产案例

场景

  • 一个生产环境中,需要确保应用容器在启动前完成初始化任务,并在停止前执行清理操作。

解决方案

  1. 创建 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: production-pod
    spec:
      initContainers:
      - name: init
        image: busybox
        command: ["/bin/sh", "-c", "echo 'Initialization complete' > /tmp/init.log"]
      containers:
      - name: nginx
        image: nginx
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "echo 'Container started' > /tmp/start.log"]
          preStop:
            exec:
              command: ["/bin/sh", "-c", "echo 'Container stopping' > /tmp/stop.log"]
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
    
  2. 应用配置文件
    kubectl apply -f production-pod.yaml
    
  3. 验证生命周期事件
    kubectl exec production-pod -- cat /tmp/init.log
    kubectl exec production-pod -- cat /tmp/start.log
    kubectl exec production-pod -- cat /tmp/stop.log
    
    输出中会显示生命周期事件:
    Initialization complete
    Container started
    Container stopping
    

5. 注意事项

  1. 重启策略的合理性
    • 根据实际需求合理设置重启策略,避免过度重启或资源浪费。
  2. 生命周期事件的管理
    • 确保生命周期事件的命令正确执行,避免影响 Pod 的正常运行。
  3. 探针的配置
    • 合理配置探针,确保容器在启动、运行和停止时都能正确响应。
  4. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证生命周期事件和探针的有效性。

容器钩子与探针

1. 容器钩子实战

什么是容器钩子?

  • 容器钩子(Container Hooks) 是 Kubernetes 中用于在容器生命周期中执行特定操作的机制。
  • 包括 启动后钩子(PostStart)停止前钩子(PreStop)

启动后钩子(PostStart)

  • 在容器启动后立即执行的操作。

停止前钩子(PreStop)

  • 在容器停止前执行的操作。

实战案例

  1. 创建 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: hook-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        lifecycle:
          postStart:
            exec:
              command: ["/bin/sh", "-c", "echo 'Container started' > /tmp/start.log"]
          preStop:
            exec:
              command: ["/bin/sh", "-c", "echo 'Container stopping' > /tmp/stop.log"]
    
  2. 应用配置文件
    kubectl apply -f hook-pod.yaml
    
  3. 验证钩子事件
    kubectl exec hook-pod -- cat /tmp/start.log
    kubectl exec hook-pod -- cat /tmp/stop.log
    
    输出中会显示钩子事件:
    Container started
    Container stopping
    

2. StartupProbe 启动探测应用案例

什么是 StartupProbe?

  • StartupProbe 是 Kubernetes 中用于检测容器是否启动完成的机制。
  • 它允许在容器启动期间延迟其他探针(如 LivenessProbe 和 ReadinessProbe)的执行。

应用案例

  1. 创建 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: startup-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        startupProbe:
          httpGet:
            path: /
            port: 80
          failureThreshold: 30
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
    
  2. 应用配置文件
    kubectl apply -f startup-pod.yaml
    
  3. 验证 StartupProbe
    kubectl describe pod startup-pod
    
    输出中会显示 StartupProbe 的状态:
    Startup Probe:     http-get http://:80/ delay=0s timeout=1s period=10s #success=1 #failure=30
    

3. 三种探针的启动顺序问题

三种探针

  1. StartupProbe
    • 用于检测容器是否启动完成。
    • 在容器启动期间延迟其他探针的执行。
  2. LivenessProbe
    • 用于检测容器是否存活。
    • 如果检测失败,Kubernetes 会重启容器。
  3. ReadinessProbe
    • 用于检测容器是否就绪。
    • 如果检测失败,Kubernetes 会将容器从 Service 的负载均衡中移除。

启动顺序

  1. StartupProbe 优先
    • 在容器启动期间,StartupProbe 优先执行,直到检测成功或失败。
  2. LivenessProbe 和 ReadinessProbe 延迟
    • 在 StartupProbe 检测成功之前,LivenessProbe 和 ReadinessProbe 不会执行。
  3. StartupProbe 检测成功后
    • LivenessProbe 和 ReadinessProbe 开始执行,按照各自的配置进行检测。

示例

  1. 创建 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: probe-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        startupProbe:
          httpGet:
            path: /
            port: 80
          failureThreshold: 30
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
    
  2. 应用配置文件
    kubectl apply -f probe-pod.yaml
    
  3. 验证探针启动顺序
    kubectl describe pod probe-pod
    
    输出中会显示探针的启动顺序:
    Startup Probe:     http-get http://:80/ delay=0s timeout=1s period=10s #success=1 #failure=30
    Liveness Probe:    http-get http://:80/ delay=5s timeout=1s period=10s #success=1 #failure=3
    Readiness Probe:   http-get http://:80/ delay=5s timeout=1s period=10s #success=1 #failure=3
    

4. 生产案例

场景

  • 一个生产环境中,需要确保应用容器在启动完成后再进行存活和就绪检测,以避免误判。

解决方案

  1. 创建 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: production-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        startupProbe:
          httpGet:
            path: /
            port: 80
          failureThreshold: 30
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /
            port: 80
          initialDelaySeconds: 5
          periodSeconds: 10
    
  2. 应用配置文件
    kubectl apply -f production-pod.yaml
    
  3. 验证探针启动顺序
    kubectl describe pod production-pod
    
    输出中会显示探针的启动顺序:
    Startup Probe:     http-get http://:80/ delay=0s timeout=1s period=10s #success=1 #failure=30
    Liveness Probe:    http-get http://:80/ delay=5s timeout=1s period=10s #success=1 #failure=3
    Readiness Probe:   http-get http://:80/ delay=5s timeout=1s period=10s #success=1 #failure=3
    

5. 注意事项

  1. StartupProbe 的配置
    • 合理配置 StartupProbe 的 failureThresholdperiodSeconds,确保容器有足够的时间启动。
  2. 探针的启动顺序
    • 确保 StartupProbe 优先执行,避免 LivenessProbe 和 ReadinessProbe 在容器启动期间误判。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证探针的配置和启动顺序的有效性。
  4. 钩子的执行时间
    • 确保钩子的命令在合理的时间内执行完成,避免影响容器的正常启动和停止。

Pod 优先级和抢占式调度

1. 什么是 Pod 优先级和抢占式调度?

Pod 优先级

  • Pod 优先级(Pod Priority) 是 Kubernetes 中用于定义 Pod 调度优先级的一种机制。
  • 优先级高的 Pod 在资源不足时会被优先调度,而优先级低的 Pod 可能会被延迟调度或抢占。
  • 优先级通过 PriorityClass 资源定义,每个 PriorityClass 有一个整数值,值越大优先级越高。

抢占式调度

  • 抢占式调度(Preemption) 是 Kubernetes 中用于在资源不足时,通过驱逐低优先级 Pod 来调度高优先级 Pod 的一种机制。
  • 当高优先级 Pod 无法调度时,Kubernetes 会尝试驱逐低优先级 Pod 以释放资源。
  • 抢占式调度可能会导致低优先级 Pod 被终止或重新调度。

2. Pod 优先级和抢占式调度实战

步骤 1:创建 PriorityClass

  1. 创建高优先级 PriorityClass
    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: high-priority
    value: 1000000
    globalDefault: false
    description: "This priority class should be used for high priority pods."
    
  2. 创建低优先级 PriorityClass
    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: low-priority
    value: 1000
    globalDefault: false
    description: "This priority class should be used for low priority pods."
    
  3. 应用配置文件
    kubectl apply -f high-priority.yaml
    kubectl apply -f low-priority.yaml
    

步骤 2:创建低优先级 Pod

  1. 创建低优先级 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: low-priority-pod
    spec:
      containers:
      - name: nginx
        image: nginx
      priorityClassName: low-priority
    
  2. 应用配置文件
    kubectl apply -f low-priority-pod.yaml
    
  3. 验证 Pod 状态
    kubectl get pod low-priority-pod -o wide
    
    输出中会显示 Pod 已调度:
    NAME               READY   STATUS    RESTARTS   AGE   IP           NODE
    low-priority-pod   1/1     Running   0          10s   10.244.1.2   node1
    

步骤 3:创建高优先级 Pod

  1. 创建高优先级 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: high-priority-pod
    spec:
      containers:
      - name: nginx
        image: nginx
      priorityClassName: high-priority
    
  2. 应用配置文件
    kubectl apply -f high-priority-pod.yaml
    
  3. 验证 Pod 状态
    kubectl get pod high-priority-pod -o wide
    
    输出中会显示高优先级 Pod 已调度,低优先级 Pod 被抢占:
    NAME                READY   STATUS    RESTARTS   AGE   IP           NODE
    high-priority-pod   1/1     Running   0          10s   10.244.1.3   node1
    low-priority-pod    0/1     Evicted   0          1m    <none>       <none>
    

步骤 4:查看抢占事件

  1. 查看事件日志
    kubectl get events
    
    输出中会显示抢占事件:
    LAST SEEN   TYPE      REASON      OBJECT                MESSAGE
    10s         Normal    Preempted   pod/low-priority-pod  Preempted by pod/high-priority-pod
    

3. 生产案例

场景

  • 一个生产环境中,需要确保关键任务 Pod 在资源不足时优先调度,而非关键任务 Pod 可以被抢占。

解决方案

  1. 创建 PriorityClass
    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: critical-priority
    value: 1000000
    globalDefault: false
    description: "This priority class should be used for critical pods."
    
  2. 创建非关键任务 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: non-critical-pod
    spec:
      containers:
      - name: nginx
        image: nginx
      priorityClassName: low-priority
    
  3. 创建关键任务 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: critical-pod
    spec:
      containers:
      - name: nginx
        image: nginx
      priorityClassName: critical-priority
    
  4. 应用配置文件
    kubectl apply -f critical-priority.yaml
    kubectl apply -f non-critical-pod.yaml
    kubectl apply -f critical-pod.yaml
    
  5. 验证调度结果
    kubectl get pods -o wide
    
    输出中会显示关键任务 Pod 已调度,非关键任务 Pod 被抢占:
    NAME               READY   STATUS    RESTARTS   AGE   IP           NODE
    critical-pod       1/1     Running   0          10s   10.244.1.3   node1
    non-critical-pod   0/1     Evicted   0          1m    <none>       <none>
    

4. 注意事项

  1. 优先级的合理性
    • 根据实际需求合理设置优先级,避免过度抢占或资源浪费。
  2. 抢占的影响
    • 抢占式调度可能会导致低优先级 Pod 被终止或重新调度,需评估其对业务的影响。
  3. 资源配额的管理
    • 确保资源配额足够,避免频繁抢占或调度失败。
  4. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证优先级和抢占式调度的有效性。

ReplicaSet 控制器

1. ReplicaSet 控制器的概念与原理

什么是 ReplicaSet?

  • ReplicaSet 是 Kubernetes 中用于确保指定数量的 Pod 副本始终运行的控制器。
  • 它通过监控 Pod 的状态,自动创建或删除 Pod 以满足期望的副本数。

ReplicaSet 的工作原理

  1. 定义期望状态
    • 用户通过 YAML 文件定义 ReplicaSet 的期望状态,包括 Pod 模板和副本数。
  2. 监控当前状态
    • ReplicaSet 监控集群中与 Pod 模板匹配的 Pod 数量。
  3. 调整实际状态
    • 如果当前 Pod 数量少于期望值,ReplicaSet 会创建新的 Pod。
    • 如果当前 Pod 数量多于期望值,ReplicaSet 会删除多余的 Pod。
  4. 标签选择器
    • ReplicaSet 通过标签选择器(Label Selector)识别和管理 Pod。

2. 创建多副本 Pod

步骤

  1. 创建 ReplicaSet 配置文件
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: my-replicaset
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
    
  2. 应用配置文件
    kubectl apply -f replicaset.yaml
    
  3. 验证 ReplicaSet 和 Pod
    kubectl get replicaset
    kubectl get pods
    
    输出中会显示 ReplicaSet 和 3 个 Pod:
    NAME            DESIRED   CURRENT   READY   AGE
    my-replicaset   3         3         3       10s
    
    NAME                  READY   STATUS    RESTARTS   AGE
    my-replicaset-abcde   1/1     Running   0          10s
    my-replicaset-fghij   1/1     Running   0          10s
    my-replicaset-klmno   1/1     Running   0          10s
    

3. 实现 Pod 动态扩容

步骤

  1. 修改 ReplicaSet 的副本数
    kubectl scale replicaset my-replicaset --replicas=5
    
  2. 验证扩容结果
    kubectl get pods
    
    输出中会显示 5 个 Pod:
    NAME                  READY   STATUS    RESTARTS   AGE
    my-replicaset-abcde   1/1     Running   0          10s
    my-replicaset-fghij   1/1     Running   0          10s
    my-replicaset-klmno   1/1     Running   0          10s
    my-replicaset-pqrst   1/1     Running   0          5s
    my-replicaset-uvwxy   1/1     Running   0          5s
    

4. 实现 Pod 动态缩容

步骤

  1. 修改 ReplicaSet 的副本数
    kubectl scale replicaset my-replicaset --replicas=2
    
  2. 验证缩容结果
    kubectl get pods
    
    输出中会显示 2 个 Pod,多余的 Pod 会被删除:
    NAME                  READY   STATUS    RESTARTS   AGE
    my-replicaset-abcde   1/1     Running   0          10s
    my-replicaset-fghij   1/1     Running   0          10s
    

5. 实现 Pod 动态更新

场景

  • 更新 Pod 的镜像版本,并确保 ReplicaSet 逐步替换旧 Pod。

步骤

  1. 修改 ReplicaSet 的镜像版本
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: my-replicaset
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.21  # 更新镜像版本
    
  2. 应用配置文件
    kubectl apply -f replicaset.yaml
    
  3. 验证更新结果
    kubectl get pods -o wide
    
    输出中会显示新的 Pod 逐步替换旧的 Pod:
    NAME                  READY   STATUS    RESTARTS   AGE   IP           NODE
    my-replicaset-abcde   1/1     Running   0          10s   10.244.1.2   node1
    my-replicaset-fghij   1/1     Running   0          10s   10.244.1.3   node1
    my-replicaset-klmno   1/1     Running   0          10s   10.244.1.4   node1
    my-replicaset-pqrst   1/1     Running   0          5s    10.244.2.2   node2
    my-replicaset-uvwxy   1/1     Running   0          5s    10.244.2.3   node2
    

6. 生产案例

场景

  • 一个生产环境中,需要确保应用的高可用性,并根据负载动态调整 Pod 数量。

解决方案

  1. 创建 ReplicaSet
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: production-replicaset
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: production
      template:
        metadata:
          labels:
            app: production
        spec:
          containers:
          - name: nginx
            image: nginx
    
  2. 动态扩容
    kubectl scale replicaset production-replicaset --replicas=5
    
  3. 动态缩容
    kubectl scale replicaset production-replicaset --replicas=2
    
  4. 动态更新
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: production-replicaset
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: production
      template:
        metadata:
          labels:
            app: production
        spec:
          containers:
          - name: nginx
            image: nginx:1.21  # 更新镜像版本
    
  5. 应用配置文件
    kubectl apply -f production-replicaset.yaml
    
  6. 验证结果
    kubectl get pods -o wide
    

7. 注意事项

  1. ReplicaSet 与 Deployment 的区别
    • ReplicaSet 仅用于管理 Pod 副本,而 Deployment 提供了更高级的功能(如滚动更新)。
  2. 标签选择器的唯一性
    • 确保 ReplicaSet 的标签选择器唯一,避免管理错误的 Pod。
  3. 资源配额的管理
    • 动态扩容时,确保集群资源足够,避免 Pod 无法调度。
  4. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 ReplicaSet 的配置和操作。

Deployment 控制器

1. Deployment 控制器

什么是 Deployment?

  • Deployment 是 Kubernetes 中用于管理 Pod 和 ReplicaSet 的高级控制器。
  • 它提供了声明式更新、滚动升级、回滚等功能,确保应用的高可用性和可扩展性。

Deployment 的工作原理

  1. 定义期望状态
    • 用户通过 YAML 文件定义 Deployment 的期望状态,包括 Pod 模板、副本数和更新策略。
  2. 创建 ReplicaSet
    • Deployment 创建 ReplicaSet 来管理 Pod 副本。
  3. 监控和调整
    • Deployment 监控 ReplicaSet 和 Pod 的状态,确保实际状态与期望状态一致。
  4. 滚动更新
    • 当 Pod 模板或副本数发生变化时,Deployment 会逐步替换旧的 Pod,确保应用不中断。
  5. 回滚
    • 如果更新失败,Deployment 可以回滚到之前的版本。

创建 Deployment

  1. 创建 Deployment 配置文件
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
    
  2. 应用配置文件
    kubectl apply -f deployment.yaml
    
  3. 验证 Deployment 和 Pod
    kubectl get deployment
    kubectl get pods
    
    输出中会显示 Deployment 和 3 个 Pod:
    NAME            READY   UP-TO-DATE   AVAILABLE   AGE
    my-deployment   3/3     3            3           10s
    
    NAME                             READY   STATUS    RESTARTS   AGE
    my-deployment-5f7b5f6c4b-abcde   1/1     Running   0          10s
    my-deployment-5f7b5f6c4b-fghij   1/1     Running   0          10s
    my-deployment-5f7b5f6c4b-klmno   1/1     Running   0          10s
    

2. Pod 中添加域名解析

什么是域名解析?

  • 域名解析 是将域名转换为 IP 地址的过程。
  • 在 Kubernetes 中,Pod 可以通过 DNS 解析其他服务的域名。

添加域名解析

  1. 创建 Service
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: nginx
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
    
  2. 应用配置文件
    kubectl apply -f service.yaml
    
  3. 在 Pod 中解析域名
    kubectl exec -it my-pod -- nslookup my-service
    
    输出中会显示 Service 的 IP 地址:
    Server:    10.96.0.10
    Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local
    
    Name:      my-service
    Address 1: 10.96.1.2 my-service.default.svc.cluster.local
    

3. Pod 中 DNS 配置

什么是 DNS 配置?

  • DNS 配置 是 Kubernetes 中用于定义 Pod 的 DNS 解析行为的机制。
  • 通过 dnsConfigdnsPolicy 字段,可以自定义 Pod 的 DNS 设置。

DNS 配置字段

  1. dnsPolicy
    • ClusterFirst:优先使用集群的 DNS 服务(默认值)。
    • Default:使用节点的 DNS 配置。
    • None:不设置 DNS,需手动配置 dnsConfig
  2. dnsConfig
    • nameservers:自定义 DNS 服务器列表。
    • searches:自定义 DNS 搜索域列表。
    • options:自定义 DNS 选项。

配置示例

  1. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: dns-pod
    spec:
      containers:
      - name: nginx
        image: nginx
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
        - 8.8.8.8
        searches:
        - mydomain.com
        options:
        - name: ndots
          value: "2"
    
  2. 应用配置文件
    kubectl apply -f dns-pod.yaml
    
  3. 验证 DNS 配置
    kubectl exec -it dns-pod -- cat /etc/resolv.conf
    
    输出中会显示自定义的 DNS 配置:
    nameserver 8.8.8.8
    search mydomain.com
    options ndots:2
    

4. 生产案例

场景

  • 一个生产环境中,需要确保应用的高可用性,并通过自定义 DNS 配置解析外部域名。

解决方案

  1. 创建 Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: production-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: production
      template:
        metadata:
          labels:
            app: production
        spec:
          containers:
          - name: nginx
            image: nginx
          dnsPolicy: "None"
          dnsConfig:
            nameservers:
            - 8.8.8.8
            searches:
            - production.mydomain.com
            options:
            - name: ndots
              value: "2"
    
  2. 应用配置文件
    kubectl apply -f production-deployment.yaml
    
  3. 验证 DNS 配置
    kubectl exec -it production-deployment-abcde -- cat /etc/resolv.conf
    
    输出中会显示自定义的 DNS 配置:
    nameserver 8.8.8.8
    search production.mydomain.com
    options ndots:2
    

5. 注意事项

  1. Deployment 的更新策略
    • 合理设置更新策略(如 RollingUpdate),确保应用不中断。
  2. DNS 配置的合理性
    • 确保 DNS 配置正确,避免域名解析失败。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 Deployment 和 DNS 配置的有效性。
  4. 资源配额的管理
    • 确保集群资源足够,避免 Pod 无法调度。

Deployment控制器实战

1. 创建 Web 站点

步骤

  1. 创建 Deployment 配置文件
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: web
      template:
        metadata:
          labels:
            app: web
        spec:
          containers:
          - name: nginx
            image: nginx:1.21
            ports:
            - containerPort: 80
    
  2. 应用配置文件
    kubectl apply -f web-deployment.yaml
    
  3. 验证 Deployment 和 Pod
    kubectl get deployment
    kubectl get pods
    
    输出中会显示 Deployment 和 3 个 Pod:
    NAME            READY   UP-TO-DATE   AVAILABLE   AGE
    web-deployment  3/3     3            3           10s
    
    NAME                             READY   STATUS    RESTARTS   AGE
    web-deployment-5f7b5f6c4b-abcde   1/1     Running   0          10s
    web-deployment-5f7b5f6c4b-fghij   1/1     Running   0          10s
    web-deployment-5f7b5f6c4b-klmno   1/1     Running   0          10s
    

2. 实现 Pod 动态扩容

步骤

  1. 修改 Deployment 的副本数
    kubectl scale deployment web-deployment --replicas=5
    
  2. 验证扩容结果
    kubectl get pods
    
    输出中会显示 5 个 Pod:
    NAME                             READY   STATUS    RESTARTS   AGE
    web-deployment-5f7b5f6c4b-abcde   1/1     Running   0          10s
    web-deployment-5f7b5f6c4b-fghij   1/1     Running   0          10s
    web-deployment-5f7b5f6c4b-klmno   1/1     Running   0          10s
    web-deployment-5f7b5f6c4b-pqrst   1/1     Running   0          5s
    web-deployment-5f7b5f6c4b-uvwxy   1/1     Running   0          5s
    

3. 实现 Pod 动态缩容

步骤

  1. 修改 Deployment 的副本数
    kubectl scale deployment web-deployment --replicas=2
    
  2. 验证缩容结果
    kubectl get pods
    
    输出中会显示 2 个 Pod,多余的 Pod 会被删除:
    NAME                             READY   STATUS    RESTARTS   AGE
    web-deployment-5f7b5f6c4b-abcde   1/1     Running   0          10s
    web-deployment-5f7b5f6c4b-fghij   1/1     Running   0          10s
    

4. 实现 Pod 滚动升级

步骤

  1. 更新 Deployment 的镜像版本
    kubectl set image deployment/web-deployment nginx=nginx:1.22
    
  2. 验证滚动升级
    kubectl rollout status deployment/web-deployment
    
    输出中会显示滚动升级的状态:
    deployment "web-deployment" successfully rolled out
    
  3. 查看 Pod 状态
    kubectl get pods
    
    输出中会显示新的 Pod 逐步替换旧的 Pod:
    NAME                             READY   STATUS    RESTARTS   AGE
    web-deployment-6d5b8c5d8b-abcde   1/1     Running   0          10s
    web-deployment-6d5b8c5d8b-fghij   1/1     Running   0          10s
    web-deployment-6d5b8c5d8b-klmno   1/1     Running   0          10s
    

5. 实现 Pod 版本回退

步骤

  1. 查看 Deployment 的历史版本
    kubectl rollout history deployment/web-deployment
    
    输出中会显示历史版本:
    REVISION  CHANGE-CAUSE
    1         <none>
    2         <none>
    
  2. 回退到指定版本
    kubectl rollout undo deployment/web-deployment --to-revision=1
    
  3. 验证回退结果
    kubectl rollout status deployment/web-deployment
    kubectl get pods
    
    输出中会显示回退后的 Pod:
    NAME                             READY   STATUS    RESTARTS   AGE
    web-deployment-5f7b5f6c4b-abcde   1/1     Running   0          10s
    web-deployment-5f7b5f6c4b-fghij   1/1     Running   0          10s
    web-deployment-5f7b5f6c4b-klmno   1/1     Running   0          10s
    

6. 自定义滚动更新策略

步骤

  1. 修改 Deployment 的更新策略
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-deployment
    spec:
      replicas: 3
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1        # 最大额外 Pod 数量
          maxUnavailable: 0  # 最大不可用 Pod 数量
      selector:
        matchLabels:
          app: web
      template:
        metadata:
          labels:
            app: web
        spec:
          containers:
          - name: nginx
            image: nginx:1.21
            ports:
            - containerPort: 80
    
  2. 应用配置文件
    kubectl apply -f web-deployment.yaml
    
  3. 验证更新策略
    kubectl describe deployment web-deployment
    
    输出中会显示自定义的更新策略:
    StrategyType:           RollingUpdate
    RollingUpdateStrategy:  1 max unavailable, 1 max surge
    

7. 生产案例

场景

  • 一个生产环境中,需要确保 Web 站点的高可用性,并根据负载动态调整 Pod 数量,同时支持滚动升级和版本回退。

解决方案

  1. 创建 Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: production-deployment
    spec:
      replicas: 3
      strategy:
        type: RollingUpdate
        rollingUpdate:
          maxSurge: 1
          maxUnavailable: 0
      selector:
        matchLabels:
          app: production
      template:
        metadata:
          labels:
            app: production
        spec:
          containers:
          - name: nginx
            image: nginx:1.21
            ports:
            - containerPort: 80
    
  2. 动态扩容
    kubectl scale deployment production-deployment --replicas=5
    
  3. 动态缩容
    kubectl scale deployment production-deployment --replicas=2
    
  4. 滚动升级
    kubectl set image deployment/production-deployment nginx=nginx:1.22
    
  5. 版本回退
    kubectl rollout undo deployment/production-deployment --to-revision=1
    

8. 注意事项

  1. 更新策略的合理性
    • 根据实际需求合理设置 maxSurgemaxUnavailable,确保应用不中断。
  2. 资源配额的管理
    • 动态扩容时,确保集群资源足够,避免 Pod 无法调度。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 Deployment 的配置和操作。
  4. 版本回退的可行性
    • 确保历史版本可用,避免回退失败。

DaemonSet 控制器

1. DaemonSet 控制器

什么是 DaemonSet?

  • DaemonSet 是 Kubernetes 中用于确保每个节点(或满足条件的节点)上都运行一个 Pod 副本的控制器。
  • 它通常用于部署系统级别的守护进程,如日志收集、网络插件、监控代理等。

DaemonSet 的工作原理

  1. 定义期望状态
    • 用户通过 YAML 文件定义 DaemonSet 的期望状态,包括 Pod 模板和节点选择器。
  2. 监控节点状态
    • DaemonSet 监控集群中的节点,确保每个节点上都运行一个 Pod 副本。
  3. 调整实际状态
    • 如果节点数量增加,DaemonSet 会自动创建新的 Pod。
    • 如果节点数量减少,DaemonSet 会自动删除多余的 Pod。
  4. 节点选择器
    • 通过 nodeSelectoraffinity 字段,可以限制 DaemonSet 在特定节点上运行。

2. 使用 DaemonSet 部署日志收集组件 Fluentd

场景

  • 在 Kubernetes 集群中,每个节点上都需要运行一个 Fluentd Pod,用于收集节点和容器的日志。

步骤

  1. 创建 DaemonSet 配置文件
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentd
      labels:
        k8s-app: fluentd-logging
    spec:
      selector:
        matchLabels:
          name: fluentd
      template:
        metadata:
          labels:
            name: fluentd
        spec:
          containers:
          - name: fluentd
            image: fluent/fluentd:latest
            volumeMounts:
            - name: varlog
              mountPath: /var/log
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
          volumes:
          - name: varlog
            hostPath:
              path: /var/log
          - name: varlibdockercontainers
            hostPath:
              path: /var/lib/docker/containers
    
  2. 应用配置文件
    kubectl apply -f fluentd-daemonset.yaml
    
  3. 验证 DaemonSet 和 Pod
    kubectl get daemonset
    kubectl get pods -o wide
    
    输出中会显示 DaemonSet 和每个节点上的 Fluentd Pod:
    NAME      DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    fluentd   3         3         3       3            3           <none>          10s
    NAME           READY   STATUS    RESTARTS   AGE   IP           NODE
    fluentd-abcde   1/1     Running   0          10s   10.244.1.2   node1
    fluentd-fghij   1/1     Running   0          10s   10.244.2.2   node2
    fluentd-klmno   1/1     Running   0          10s   10.244.3.2   node3
    

3. DaemonSet 滚动更新 Pod

场景

  • 更新 Fluentd 的镜像版本,并确保 DaemonSet 逐步替换旧 Pod。

步骤

  1. 更新 DaemonSet 的镜像版本
    kubectl set image daemonset/fluentd fluentd=fluent/fluentd:v1.14
    
  2. 验证滚动更新
    kubectl rollout status daemonset/fluentd
    
    输出中会显示滚动更新的状态:
    daemon set "fluentd" successfully rolled out
    
  3. 查看 Pod 状态
    kubectl get pods -o wide
    
    输出中会显示新的 Pod 逐步替换旧的 Pod:
    NAME           READY   STATUS    RESTARTS   AGE   IP           NODE
    fluentd-pqrst   1/1     Running   0          10s   10.244.1.3   node1
    fluentd-uvwxy   1/1     Running   0          10s   10.244.2.3   node2
    fluentd-zabcd   1/1     Running   0          10s   10.244.3.3   node3
    

4. 生产案例

场景

  • 一个生产环境中,需要在每个节点上部署 Fluentd 用于日志收集,并支持滚动更新。

解决方案

  1. 创建 DaemonSet
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: production-fluentd
      labels:
        k8s-app: fluentd-logging
    spec:
      selector:
        matchLabels:
          name: fluentd
      template:
        metadata:
          labels:
            name: fluentd
        spec:
          containers:
          - name: fluentd
            image: fluent/fluentd:latest
            volumeMounts:
            - name: varlog
              mountPath: /var/log
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
          volumes:
          - name: varlog
            hostPath:
              path: /var/log
          - name: varlibdockercontainers
            hostPath:
              path: /var/lib/docker/containers
    
  2. 应用配置文件
    kubectl apply -f production-fluentd.yaml
    
  3. 滚动更新
    kubectl set image daemonset/production-fluentd fluentd=fluent/fluentd:v1.14
    
  4. 验证更新结果
    kubectl rollout status daemonset/production-fluentd
    kubectl get pods -o wide
    

5. 注意事项

  1. 节点选择器的使用
    • 通过 nodeSelectoraffinity 字段,可以限制 DaemonSet 在特定节点上运行。
  2. 资源配额的管理
    • 确保节点资源足够,避免 Pod 无法调度。
  3. 滚动更新的策略
    • 合理设置滚动更新策略,确保应用不中断。
  4. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 DaemonSet 的配置和操作。

四层负载均衡 Service

1. 四层负载均衡 Service

什么是 Service?

  • Service 是 Kubernetes 中用于为一组 Pod 提供稳定的网络访问的抽象。
  • 它通过负载均衡将流量分发到后端的 Pod,并提供以下功能:
    • 服务发现:通过 DNS 或环境变量暴露服务。
    • 负载均衡:将流量均匀分发到多个 Pod。
    • 网络隔离:通过 ClusterIP 或 NodePort 控制访问范围。

Service 的类型

  1. ClusterIP
    • 默认类型,仅在集群内部访问。
  2. NodePort
    • 在 ClusterIP 的基础上,通过节点的 IP 和端口暴露服务。
  3. LoadBalancer
    • 在 NodePort 的基础上,通过云提供商的负载均衡器暴露服务。
  4. ExternalName
    • 将服务映射到外部域名。
  5. 无标签选择器的 Service
    • 手动指定后端端点,通常用于关联外部服务。

2. 类型为 ClusterIP 实战

场景

  • 在集群内部暴露一个 Web 服务,供其他 Pod 访问。

步骤

  1. 创建 Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: web
      template:
        metadata:
          labels:
            app: web
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
    
  2. 创建 ClusterIP Service
    apiVersion: v1
    kind: Service
    metadata:
      name: web-service
    spec:
      type: ClusterIP
      selector:
        app: web
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
    
  3. 应用配置文件
    kubectl apply -f web-deployment.yaml
    kubectl apply -f web-service.yaml
    
  4. 验证 Service 和 Pod
    kubectl get service
    kubectl get pods
    
    输出中会显示 Service 和 Pod:
    NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
    web-service   ClusterIP   10.96.1.2       <none>        80/TCP    10s
    
    NAME                             READY   STATUS    RESTARTS   AGE
    web-deployment-5f7b5f6c4b-abcde   1/1     Running   0          10s
    web-deployment-5f7b5f6c4b-fghij   1/1     Running   0          10s
    web-deployment-5f7b5f6c4b-klmno   1/1     Running   0          10s
    
  5. 在集群内部访问 Service
    kubectl run curl --image=curlimages/curl --rm -it --restart=Never -- curl http://web-service
    
    输出中会显示 Nginx 的默认页面。

3. 类型为 NodePort 实战

场景

  • 通过节点的 IP 和端口暴露 Web 服务,供外部访问。

步骤

  1. 创建 NodePort Service
    apiVersion: v1
    kind: Service
    metadata:
      name: web-service
    spec:
      type: NodePort
      selector:
        app: web
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
        nodePort: 30080
    
  2. 应用配置文件
    kubectl apply -f web-service.yaml
    
  3. 验证 Service
    kubectl get service
    
    输出中会显示 NodePort Service:
    NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    web-service   NodePort    10.96.1.2       <none>        80:30080/TCP   10s
    
  4. 通过节点 IP 访问服务
    • 使用节点的 IP 和端口(如 http://<NodeIP>:30080)访问服务。

4. 类型为 ExternalName 实战

场景

  • 将服务映射到外部域名,供集群内部访问。

步骤

  1. 创建 ExternalName Service
    apiVersion: v1
    kind: Service
    metadata:
      name: external-service
    spec:
      type: ExternalName
      externalName: example.com
    
  2. 应用配置文件
    kubectl apply -f external-service.yaml
    
  3. 验证 Service
    kubectl get service
    
    输出中会显示 ExternalName Service:
    NAME              TYPE           CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    external-service  ExternalName   <none>       example.com   <none>    10s
    
  4. 在集群内部访问 Service
    kubectl run curl --image=curlimages/curl --rm -it --restart=Never -- curl http://external-service
    
    输出中会显示 example.com 的内容。

5. 无标签选择器的 Service(关联外部服务实战)

场景

  • 将 Service 关联到外部服务(如数据库),供集群内部访问。

步骤

  1. 创建无标签选择器的 Service
    apiVersion: v1
    kind: Service
    metadata:
      name: external-db-service
    spec:
      ports:
      - protocol: TCP
        port: 3306
        targetPort: 3306
    
  2. 创建 Endpoints
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: external-db-service
    subsets:
    - addresses:
      - ip: 192.168.1.100
      ports:
      - port: 3306
    
  3. 应用配置文件
    kubectl apply -f external-db-service.yaml
    kubectl apply -f endpoints.yaml
    
  4. 验证 Service 和 Endpoints
    kubectl get service
    kubectl get endpoints
    
    输出中会显示 Service 和 Endpoints:
    NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    external-db-service   ClusterIP   10.96.1.3       <none>        3306/TCP   10s
    
    NAME                  ENDPOINTS           AGE
    external-db-service   192.168.1.100:3306  10s
    
  5. 在集群内部访问 Service
    kubectl run mysql-client --image=mysql:5.7 --rm -it --restart=Never -- mysql -h external-db-service -u root -p
    

6. 生产案例

场景

  • 一个生产环境中,需要为 Web 服务提供稳定的内部访问,并通过 NodePort 暴露给外部用户。

解决方案

  1. 创建 Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: production-web
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: production-web
      template:
        metadata:
          labels:
            app: production-web
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 80
    
  2. 创建 NodePort Service
    apiVersion: v1
    kind: Service
    metadata:
      name: production-web-service
    spec:
      type: NodePort
      selector:
        app: production-web
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80
        nodePort: 30080
    
  3. 应用配置文件
    kubectl apply -f production-web.yaml
    kubectl apply -f production-web-service.yaml
    
  4. 验证 Service 和 Pod
    kubectl get service
    kubectl get pods
    

7. 注意事项

  1. Service 的类型选择
    • 根据实际需求选择合适的 Service 类型(如 ClusterIP、NodePort、ExternalName)。
  2. 资源配额的管理
    • 确保集群资源足够,避免 Pod 无法调度。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 Service 的配置和操作。
  4. 安全策略
    • 通过 NetworkPolicy 或 RBAC 控制 Service 的访问权限。

持久化存储

1. 在 Kubernetes 中为什么要做持久化存储?

背景

  • Kubernetes 中的 Pod 是临时的,可能会被删除、重新调度或重启。
  • 默认情况下,Pod 中的数据存储在容器的文件系统中,当 Pod 被删除时,数据也会丢失。

持久化存储的必要性

  1. 数据持久化
    • 确保数据在 Pod 删除或重启后仍然存在。
  2. 数据共享
    • 多个 Pod 可以共享同一份数据。
  3. 数据备份与恢复
    • 通过持久化存储,可以方便地备份和恢复数据。
  4. 应用场景
    • 数据库、日志文件、配置文件等需要长期保存的数据。

2. 持久化存储 emptyDir

什么是 emptyDir?

  • emptyDir 是一种临时存储卷,生命周期与 Pod 绑定。
  • 当 Pod 被删除时,emptyDir 中的数据也会被删除。

使用场景

  • 临时存储,如缓存、临时文件等。

实战示例

  1. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: emptydir-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: cache-volume
          mountPath: /cache
      volumes:
      - name: cache-volume
        emptyDir: {}
    
  2. 应用配置文件
    kubectl apply -f emptydir-pod.yaml
    
  3. 验证 emptyDir
    kubectl exec -it emptydir-pod -- ls /cache
    

3. 持久化存储 hostPath

什么是 hostPath?

  • hostPath 是一种将主机文件系统中的目录挂载到 Pod 中的存储卷。
  • 数据存储在节点上,Pod 删除后数据仍然存在,但 Pod 重新调度到其他节点时无法访问数据。

使用场景

  • 单节点应用,如日志收集、监控数据等。

实战示例

  1. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: hostpath-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: hostpath-volume
          mountPath: /host-data
      volumes:
      - name: hostpath-volume
        hostPath:
          path: /data
          type: Directory
    
  2. 应用配置文件
    kubectl apply -f hostpath-pod.yaml
    
  3. 验证 hostPath
    kubectl exec -it hostpath-pod -- ls /host-data
    

4. 持久化存储 NFS

什么是 NFS?

  • NFS(Network File System) 是一种网络文件系统,允许多个节点共享同一份数据。
  • 数据存储在 NFS 服务器上,Pod 删除或重新调度后仍然可以访问数据。

使用场景

  • 多节点应用,如共享配置文件、共享数据存储等。

实战示例

  1. 创建 NFS 服务器(假设 NFS 服务器已部署,IP 为 192.168.1.100,共享目录为 /data/nfs)。
  2. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: nfs-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: nfs-volume
          mountPath: /nfs-data
      volumes:
      - name: nfs-volume
        nfs:
          server: 192.168.1.100
          path: /data/nfs
    
  3. 应用配置文件
    kubectl apply -f nfs-pod.yaml
    
  4. 验证 NFS
    kubectl exec -it nfs-pod -- ls /nfs-data
    

5. 生产案例

场景

  • 一个生产环境中,需要为数据库提供持久化存储,并确保数据在 Pod 删除或重新调度后仍然可用。

解决方案

  1. 创建 NFS 服务器(假设 NFS 服务器已部署,IP 为 192.168.1.100,共享目录为 /data/mysql)。
  2. 创建 Deployment 配置文件
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mysql-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:5.7
            env:
            - name: MYSQL_ROOT_PASSWORD
              value: "password"
            volumeMounts:
            - name: mysql-data
              mountPath: /var/lib/mysql
          volumes:
          - name: mysql-data
            nfs:
              server: 192.168.1.100
              path: /data/mysql
    
  3. 应用配置文件
    kubectl apply -f mysql-deployment.yaml
    
  4. 验证持久化存储
    kubectl exec -it mysql-deployment-abcde -- ls /var/lib/mysql
    

6. 注意事项

  1. 存储类型的选择
    • 根据实际需求选择合适的存储类型(如 emptyDir、hostPath、NFS)。
  2. 数据安全
    • 确保持久化存储的数据安全,如加密、访问控制等。
  3. 性能优化
    • 根据应用场景优化存储性能,如使用 SSD、调整 NFS 配置等。
  4. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证持久化存储的配置和操作。

PV(PersistentVolume)与 PVC(PersistentVolumeClaim)

1. PV 与 PVC 的概念

什么是 PV?

  • PV(PersistentVolume) 是 Kubernetes 中由管理员提供的存储资源。
  • 它可以是本地存储、NFS、云存储等,独立于 Pod 的生命周期。

什么是 PVC?

  • PVC(PersistentVolumeClaim) 是用户对存储资源的请求。
  • 用户通过 PVC 申请存储资源,Kubernetes 会根据 PVC 的要求绑定合适的 PV。

PV 和 PVC 的关系

  • PV 是集群中的存储资源,PVC 是用户对存储资源的需求。
  • Kubernetes 通过绑定机制将 PVC 与 PV 关联起来。

2. PV 和 PVC 语法说明与资源创建

PV 的 YAML 语法

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: 192.168.1.100
    path: /data/nfs

PVC 的 YAML 语法

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

创建 PV 和 PVC

  1. 创建 PV
    kubectl apply -f pv.yaml
    
  2. 创建 PVC
    kubectl apply -f pvc.yaml
    
  3. 验证 PV 和 PVC
    kubectl get pv
    kubectl get pvc
    
    输出中会显示 PV 和 PVC 的状态:
    NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
    my-pv    10Gi       RWO            Retain           Bound    default/my-pvc                           10s
    
    NAME      STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    my-pvc    Bound    my-pv    10Gi       RWO                           10s
    

3. 挂载 PVC 资源给 Pod 使用

步骤

  1. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: my-storage
          mountPath: /mnt/data
      volumes:
      - name: my-storage
        persistentVolumeClaim:
          claimName: my-pvc
    
  2. 应用配置文件
    kubectl apply -f pod.yaml
    
  3. 验证 PVC 挂载
    kubectl exec -it my-pod -- ls /mnt/data
    

4. PV 与 PVC 实战应用

场景

  • 一个生产环境中,需要为数据库提供持久化存储,并确保数据在 Pod 删除或重新调度后仍然可用。

解决方案

  1. 创建 PV
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: mysql-pv
    spec:
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      persistentVolumeReclaimPolicy: Retain
      nfs:
        server: 192.168.1.100
        path: /data/mysql
    
  2. 创建 PVC
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: mysql-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi
    
  3. 创建 Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: mysql-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:5.7
            env:
            - name: MYSQL_ROOT_PASSWORD
              value: "password"
            volumeMounts:
            - name: mysql-data
              mountPath: /var/lib/mysql
          volumes:
          - name: mysql-data
            persistentVolumeClaim:
              claimName: mysql-pvc
    
  4. 应用配置文件
    kubectl apply -f mysql-pv.yaml
    kubectl apply -f mysql-pvc.yaml
    kubectl apply -f mysql-deployment.yaml
    
  5. 验证 PV 和 PVC
    kubectl get pv
    kubectl get pvc
    
  6. 验证 PVC 挂载
    kubectl exec -it mysql-deployment-abcde -- ls /var/lib/mysql
    

5. 注意事项

  1. PV 和 PVC 的匹配
    • 确保 PVC 的 accessModesstorage 需求与 PV 匹配。
  2. 存储回收策略
    • 根据实际需求设置 persistentVolumeReclaimPolicy(如 RetainDeleteRecycle)。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 PV 和 PVC 的配置和操作。
  4. 存储性能优化
    • 根据应用场景优化存储性能,如使用 SSD、调整 NFS 配置等。

已深度思考

好的!以下是关于 StorageClass 存储类NFS Provisioner 供应商动态生成 PV 资源 的详细说明:


1. StorageClass 存储类

什么是 StorageClass?

  • StorageClass 是 Kubernetes 中用于定义存储类型的资源。
  • 它允许管理员动态创建 PV(PersistentVolume),并根据用户的需求自动绑定 PVC(PersistentVolumeClaim)。

StorageClass 的作用

  1. 动态供应
    • 当用户创建 PVC 时,Kubernetes 会根据 StorageClass 动态创建 PV。
  2. 存储类型管理
    • 支持多种存储类型(如 NFS、云存储等),并通过参数配置存储特性。
  3. 简化管理
    • 管理员无需手动创建 PV,系统会自动完成 PV 的创建和绑定。

2. NFS Provisioner 供应商动态生成 PV 资源

什么是 NFS Provisioner?

  • NFS Provisioner 是一个 Kubernetes 插件,用于动态创建 NFS 类型的 PV。
  • 它通过 StorageClass 和 PVC 的配置,自动在 NFS 服务器上创建目录,并将其挂载为 PV。

NFS Provisioner 的工作原理

  1. 用户创建 PVC
    • 用户通过 PVC 申请存储资源。
  2. 动态创建 PV
    • NFS Provisioner 根据 PVC 的需求,在 NFS 服务器上创建目录,并生成 PV。
  3. 绑定 PVC 和 PV
    • Kubernetes 将 PVC 与动态创建的 PV 绑定。

3. 实战:使用 NFS Provisioner 动态生成 PV 资源

步骤 1:部署 NFS Provisioner

  1. 创建 NFS Provisioner 配置文件
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nfs-provisioner
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nfs-provisioner
      template:
        metadata:
          labels:
            app: nfs-provisioner
        spec:
          serviceAccountName: nfs-provisioner
          containers:
          - name: nfs-provisioner
            image: quay.io/kubernetes_incubator/nfs-provisioner:v2.3.0
            env:
            - name: PROVISIONER_NAME
              value: example.com/nfs
            - name: NFS_SERVER
              value: 192.168.1.100
            - name: NFS_PATH
              value: /data/nfs
            volumeMounts:
            - name: export-volume
              mountPath: /export
          volumes:
          - name: export-volume
            hostPath:
              path: /data/nfs
    
  2. 创建 ServiceAccount 和 ClusterRoleBinding
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: nfs-provisioner
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: nfs-provisioner-role-binding
    subjects:
    - kind: ServiceAccount
      name: nfs-provisioner
      namespace: default
    roleRef:
      kind: ClusterRole
      name: cluster-admin
      apiGroup: rbac.authorization.k8s.io
    
  3. 应用配置文件
    kubectl apply -f nfs-provisioner.yaml
    kubectl apply -f rbac.yaml
    

步骤 2:创建 StorageClass

  1. 创建 StorageClass 配置文件
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: nfs-storage
    provisioner: example.com/nfs
    parameters:
      archiveOnDelete: "false"
    
  2. 应用配置文件
    kubectl apply -f storageclass.yaml
    

步骤 3:创建 PVC

  1. 创建 PVC 配置文件
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: nfs-pvc
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 5Gi
      storageClassName: nfs-storage
    
  2. 应用配置文件
    kubectl apply -f pvc.yaml
    
  3. 验证 PVC 和 PV
    kubectl get pvc
    kubectl get pv
    
    输出中会显示动态创建的 PV 和 PVC:
    NAME      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    nfs-pvc   Bound    pvc-abcde12345                             5Gi        RWX            nfs-storage    10s
    
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS   REASON   AGE
    pvc-abcde12345                             5Gi        RWX            Delete           Bound    default/nfs-pvc  nfs-storage             10s
    

步骤 4:挂载 PVC 给 Pod 使用

  1. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: nfs-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: nfs-storage
          mountPath: /mnt/data
      volumes:
      - name: nfs-storage
        persistentVolumeClaim:
          claimName: nfs-pvc
    
  2. 应用配置文件
    kubectl apply -f pod.yaml
    
  3. 验证 PVC 挂载
    kubectl exec -it nfs-pod -- ls /mnt/data
    

4. 生产案例

场景

  • 一个生产环境中,需要为多个应用动态提供 NFS 存储,并确保存储资源的高效管理。

解决方案

  1. 部署 NFS Provisioner
    kubectl apply -f nfs-provisioner.yaml
    kubectl apply -f rbac.yaml
    
  2. 创建 StorageClass
    kubectl apply -f storageclass.yaml
    
  3. 创建 PVC
    kubectl apply -f pvc.yaml
    
  4. 挂载 PVC 给应用 Pod
    kubectl apply -f pod.yaml
    

5. 注意事项

  1. NFS 服务器的配置
    • 确保 NFS 服务器已正确配置,并支持动态创建目录。
  2. StorageClass 的参数
    • 根据实际需求配置 StorageClass 的参数(如 archiveOnDelete)。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 NFS Provisioner 的配置和操作。
  4. 存储性能优化
    • 根据应用场景优化存储性能,如使用 SSD、调整 NFS 配置等。

StatefulSet 控制器

1. StatefulSet 控制器

什么是 StatefulSet?

  • StatefulSet 是 Kubernetes 中用于管理有状态应用的控制器。
  • 它为每个 Pod 提供唯一的网络标识和持久化存储,确保 Pod 的顺序性和稳定性。

StatefulSet 的特点

  1. 唯一标识
    • 每个 Pod 有唯一的名称(如 web-0web-1)。
  2. 顺序性
    • Pod 按顺序创建、删除和更新。
  3. 持久化存储
    • 每个 Pod 可以绑定独立的 PV(PersistentVolume),确保数据持久化。

2. 控制器部署 Web 站点

步骤

  1. 创建 StatefulSet 配置文件
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: web
    spec:
      serviceName: "web"
      replicas: 3
      selector:
        matchLabels:
          app: web
      template:
        metadata:
          labels:
            app: web
        spec:
          containers:
          - name: nginx
            image: nginx:1.21
            ports:
            - containerPort: 80
            volumeMounts:
            - name: web-data
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: web-data
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 1Gi
    
  2. 创建 Service 配置文件
    apiVersion: v1
    kind: Service
    metadata:
      name: web
    spec:
      clusterIP: None
      selector:
        app: web
      ports:
      - port: 80
        targetPort: 80
    
  3. 应用配置文件
    kubectl apply -f statefulset.yaml
    kubectl apply -f service.yaml
    
  4. 验证 StatefulSet 和 Pod
    kubectl get statefulset
    kubectl get pods
    
    输出中会显示 StatefulSet 和 3 个 Pod:
    NAME   READY   AGE
    web    3/3     10s
    
    NAME    READY   STATUS    RESTARTS   AGE
    web-0   1/1     Running   0          10s
    web-1   1/1     Running   0          8s
    web-2   1/1     Running   0          6s
    

3. 实现 Pod 动态扩容与缩容

动态扩容

  1. 修改 StatefulSet 的副本数
    kubectl scale statefulset web --replicas=5
    
  2. 验证扩容结果
    kubectl get pods
    
    输出中会显示 5 个 Pod:
    NAME    READY   STATUS    RESTARTS   AGE
    web-0   1/1     Running   0          10s
    web-1   1/1     Running   0          8s
    web-2   1/1     Running   0          6s
    web-3   1/1     Running   0          4s
    web-4   1/1     Running   0          2s
    

动态缩容

  1. 修改 StatefulSet 的副本数
    kubectl scale statefulset web --replicas=2
    
  2. 验证缩容结果
    kubectl get pods
    
    输出中会显示 2 个 Pod,多余的 Pod 会被删除:
    NAME    READY   STATUS    RESTARTS   AGE
    web-0   1/1     Running   0          10s
    web-1   1/1     Running   0          8s
    

4. 实现 Pod 更新与回滚

更新 Pod

  1. 更新 StatefulSet 的镜像版本
    kubectl set image statefulset/web nginx=nginx:1.22
    
  2. 验证更新状态
    kubectl rollout status statefulset/web
    
    输出中会显示更新状态:
    statefulset "web" successfully rolled out
    
  3. 查看 Pod 状态
    kubectl get pods
    
    输出中会显示新的 Pod 逐步替换旧的 Pod:
    NAME    READY   STATUS    RESTARTS   AGE
    web-0   1/1     Running   0          10s
    web-1   1/1     Running   0          8s
    web-2   1/1     Running   0          6s
    

回滚 Pod

  1. 查看 StatefulSet 的历史版本
    kubectl rollout history statefulset/web
    
    输出中会显示历史版本:
    REVISION  CHANGE-CAUSE
    1         <none>
    2         <none>
    
  2. 回滚到指定版本
    kubectl rollout undo statefulset/web --to-revision=1
    
  3. 验证回滚结果
    kubectl rollout status statefulset/web
    kubectl get pods
    
    输出中会显示回滚后的 Pod:
    NAME    READY   STATUS    RESTARTS   AGE
    web-0   1/1     Running   0          10s
    web-1   1/1     Running   0          8s
    web-2   1/1     Running   0          6s
    

5. 生产案例

场景

  • 一个生产环境中,需要为 Web 站点提供稳定的有状态服务,并支持动态扩容、缩容、更新和回滚。

解决方案

  1. 创建 StatefulSet
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: production-web
    spec:
      serviceName: "production-web"
      replicas: 3
      selector:
        matchLabels:
          app: production-web
      template:
        metadata:
          labels:
            app: production-web
        spec:
          containers:
          - name: nginx
            image: nginx:1.21
            ports:
            - containerPort: 80
            volumeMounts:
            - name: web-data
              mountPath: /usr/share/nginx/html
      volumeClaimTemplates:
      - metadata:
          name: web-data
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 1Gi
    
  2. 创建 Service
    apiVersion: v1
    kind: Service
    metadata:
      name: production-web
    spec:
      clusterIP: None
      selector:
        app: production-web
      ports:
      - port: 80
        targetPort: 80
    
  3. 动态扩容
    kubectl scale statefulset production-web --replicas=5
    
  4. 动态缩容
    kubectl scale statefulset production-web --replicas=2
    
  5. 更新 Pod
    kubectl set image statefulset/production-web nginx=nginx:1.22
    
  6. 回滚 Pod
    kubectl rollout undo statefulset/production-web --to-revision=1
    

6. 注意事项

  1. 唯一标识的管理
    • 确保每个 Pod 的唯一标识(如 web-0web-1)符合业务需求。
  2. 持久化存储的配置
    • 根据实际需求配置 volumeClaimTemplates,确保数据持久化。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 StatefulSet 的配置和操作。
  4. 更新策略的优化
    • 根据实际需求优化更新策略(如滚动更新、分区更新)。

ConfigMap 配置管理中心

1. ConfigMap 配置管理中心

什么是 ConfigMap?

  • ConfigMap 是 Kubernetes 中用于存储非敏感配置数据的资源。
  • 它将配置数据(如环境变量、配置文件等)与容器镜像解耦,便于管理和更新。

ConfigMap 的作用

  1. 配置管理
    • 集中管理应用的配置数据,避免硬编码。
  2. 动态更新
    • 更新 ConfigMap 后,Pod 可以自动加载新的配置。
  3. 多环境支持
    • 通过不同的 ConfigMap 支持开发、测试、生产等多环境配置。

2. 通过 YAML 配置文件方式创建 ConfigMap

步骤

  1. 创建 ConfigMap 配置文件
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-config
    data:
      # 键值对形式的配置
      app.properties: |
        server.port=8080
        logging.level=INFO
      # 文件形式的配置
      nginx.conf: |
        server {
            listen 80;
            server_name localhost;
            location / {
                root /usr/share/nginx/html;
                index index.html;
            }
        }
    
  2. 应用配置文件
    kubectl apply -f configmap.yaml
    
  3. 验证 ConfigMap
    kubectl get configmap
    kubectl describe configmap my-config
    
    输出中会显示 ConfigMap 的详细信息:
    NAME        DATA   AGE
    my-config   2      10s
    

3. 通过 kubectl 命令行方式创建 ConfigMap 资源

步骤

  1. 从文件创建 ConfigMap
    kubectl create configmap my-config --from-file=app.properties --from-file=nginx.conf
    
  2. 从目录创建 ConfigMap
    kubectl create configmap my-config --from-file=config/
    
  3. 从键值对创建 ConfigMap
    kubectl create configmap my-config --from-literal=server.port=8080 --from-literal=logging.level=INFO
    
  4. 验证 ConfigMap
    kubectl get configmap
    kubectl describe configmap my-config
    

4. 实战:在 Pod 中使用 ConfigMap

步骤

  1. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        env:
        - name: SERVER_PORT
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: server.port
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: config-volume
        configMap:
          name: my-config
          items:
          - key: nginx.conf
            path: nginx.conf
    
  2. 应用配置文件
    kubectl apply -f pod.yaml
    
  3. 验证 Pod 中的 ConfigMap
    kubectl exec -it my-pod -- cat /etc/nginx/conf.d/nginx.conf
    kubectl exec -it my-pod -- printenv SERVER_PORT
    

5. 生产案例

场景

  • 一个生产环境中,需要为 Web 应用提供动态配置管理,并支持多环境配置。

解决方案

  1. 创建 ConfigMap
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: production-config
    data:
      app.properties: |
        server.port=8080
        logging.level=INFO
      nginx.conf: |
        server {
            listen 80;
            server_name localhost;
            location / {
                root /usr/share/nginx/html;
                index index.html;
            }
        }
    
  2. 创建 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: production-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        env:
        - name: SERVER_PORT
          valueFrom:
            configMapKeyRef:
              name: production-config
              key: server.port
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: config-volume
        configMap:
          name: production-config
          items:
          - key: nginx.conf
            path: nginx.conf
    
  3. 应用配置文件
    kubectl apply -f production-configmap.yaml
    kubectl apply -f production-pod.yaml
    
  4. 验证 ConfigMap
    kubectl exec -it production-pod -- cat /etc/nginx/conf.d/nginx.conf
    kubectl exec -it production-pod -- printenv SERVER_PORT
    

6. 注意事项

  1. 配置数据的安全性
    • ConfigMap 不适合存储敏感数据(如密码、密钥),应使用 Secret。
  2. 配置更新的影响
    • 更新 ConfigMap 后,Pod 需要重启或重新加载配置才能生效。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 ConfigMap 的配置和操作。
  4. 配置文件的格式
    • 确保配置文件的格式正确,避免因格式错误导致应用无法加载配置。

使用 ConfigMap

1. Pod 通过变量方式使用 ConfigMap

场景

  • 将 ConfigMap 中的键值对作为环境变量注入到 Pod 的容器中。

步骤

  1. 创建 ConfigMap
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-config
    data:
      server.port: "8080"
      logging.level: "INFO"
    
  2. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        env:
        - name: SERVER_PORT
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: server.port
        - name: LOGGING_LEVEL
          valueFrom:
            configMapKeyRef:
              name: my-config
              key: logging.level
    
  3. 应用配置文件
    kubectl apply -f configmap.yaml
    kubectl apply -f pod.yaml
    
  4. 验证环境变量
    kubectl exec -it my-pod -- printenv SERVER_PORT LOGGING_LEVEL
    
    输出中会显示注入的环境变量:
    SERVER_PORT=8080
    LOGGING_LEVEL=INFO
    

2. Pod 通过 volumeMount 使用 ConfigMap

场景

  • 将 ConfigMap 中的配置文件挂载到 Pod 的容器中。

步骤

  1. 创建 ConfigMap
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-config
    data:
      nginx.conf: |
        server {
            listen 80;
            server_name localhost;
            location / {
                root /usr/share/nginx/html;
                index index.html;
            }
        }
    
  2. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: config-volume
        configMap:
          name: my-config
          items:
          - key: nginx.conf
            path: nginx.conf
    
  3. 应用配置文件
    kubectl apply -f configmap.yaml
    kubectl apply -f pod.yaml
    
  4. 验证挂载的配置文件
    kubectl exec -it my-pod -- cat /etc/nginx/conf.d/nginx.conf
    
    输出中会显示挂载的配置文件内容。

3. 使用 ConfigMap 的限制条件

  1. ConfigMap 的大小限制
    • ConfigMap 的数据大小不能超过 1 MiB。
  2. ConfigMap 的键名限制
    • 键名必须符合 DNS 子域名的命名规则(如 [a-z0-9]([-a-z0-9]*[a-z0-9])?)。
  3. ConfigMap 的更新延迟
    • 更新 ConfigMap 后,Pod 需要重启或重新加载配置才能生效。
  4. ConfigMap 的敏感数据
    • ConfigMap 不适合存储敏感数据(如密码、密钥),应使用 Secret。

4. ConfigMap 唯一会热更新动作

什么是热更新?

  • 热更新 是指在 Pod 不重启的情况下,动态加载新的配置。

ConfigMap 的热更新机制

  1. 通过 volumeMount 挂载的 ConfigMap
    • 当 ConfigMap 更新时,Kubernetes 会自动更新挂载的文件内容。
    • 但需要应用支持热加载配置(如 Nginx 的 nginx -s reload)。
  2. 通过环境变量注入的 ConfigMap
    • 环境变量在 Pod 启动时注入,更新 ConfigMap 后不会自动生效,需要重启 Pod。

实战:实现 ConfigMap 热更新

  1. 更新 ConfigMap
    kubectl edit configmap my-config
    
    修改 nginx.conf 的内容:
    nginx.conf: |
      server {
          listen 80;
          server_name localhost;
          location / {
              root /usr/share/nginx/html;
              index index.html;
          }
          location /status {
              stub_status on;
          }
      }
    
  2. 验证热更新
    kubectl exec -it my-pod -- cat /etc/nginx/conf.d/nginx.conf
    
    输出中会显示更新后的配置文件内容。
  3. 重新加载 Nginx 配置
    kubectl exec -it my-pod -- nginx -s reload
    

5. 生产案例

场景

  • 一个生产环境中,需要为 Web 应用提供动态配置管理,并支持热更新。

解决方案

  1. 创建 ConfigMap
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: production-config
    data:
      nginx.conf: |
        server {
            listen 80;
            server_name localhost;
            location / {
                root /usr/share/nginx/html;
                index index.html;
            }
        }
    
  2. 创建 Pod
    apiVersion: v1
    kind: Pod
    metadata:
      name: production-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/conf.d
      volumes:
      - name: config-volume
        configMap:
          name: production-config
          items:
          - key: nginx.conf
            path: nginx.conf
    
  3. 应用配置文件
    kubectl apply -f production-configmap.yaml
    kubectl apply -f production-pod.yaml
    
  4. 验证热更新
    • 更新 ConfigMap 后,查看挂载的配置文件内容,并重新加载 Nginx 配置。

6. 注意事项

  1. 应用的热加载支持
    • 确保应用支持热加载配置,否则需要重启 Pod。
  2. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 ConfigMap 的配置和操作。
  3. 配置文件的格式
    • 确保配置文件的格式正确,避免因格式错误导致应用无法加载配置。
  4. ConfigMap 的更新频率
    • 避免频繁更新 ConfigMap,以免影响应用性能。

subPath和Reloader实现资源热更新

1. 使用 subPath 挂载 ConfigMap

什么是 subPath?

  • subPath 是 Kubernetes 中用于将 ConfigMap 或 Volume 中的单个文件或目录挂载到容器中的指定路径。
  • 它允许将多个文件挂载到同一个目录下,而不会覆盖整个目录。

使用场景

  • 将 ConfigMap 中的单个配置文件挂载到容器的特定路径。
  • 避免挂载整个 ConfigMap 时覆盖容器中的其他文件。

实战:使用 subPath 挂载 ConfigMap

  1. 创建 ConfigMap
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-config
    data:
      nginx.conf: |
        server {
            listen 80;
            server_name localhost;
            location / {
                root /usr/share/nginx/html;
                index index.html;
            }
        }
      app.properties: |
        server.port=8080
        logging.level=INFO
    
  2. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: config-volume
          mountPath: /etc/nginx/nginx.conf
          subPath: nginx.conf
        - name: config-volume
          mountPath: /app/config/app.properties
          subPath: app.properties
      volumes:
      - name: config-volume
        configMap:
          name: my-config
    
  3. 应用配置文件
    kubectl apply -f configmap.yaml
    kubectl apply -f pod.yaml
    
  4. 验证挂载的配置文件
    kubectl exec -it my-pod -- cat /etc/nginx/nginx.conf
    kubectl exec -it my-pod -- cat /app/config/app.properties
    
    输出中会显示挂载的配置文件内容。

2. Reloader 实现 ConfigMap 或 Secret 资源热更新

什么是 Reloader?

  • Reloader 是一个 Kubernetes 控制器,用于监控 ConfigMap 和 Secret 的变化,并自动重启相关的 Pod 以实现热更新。
  • 它通过注解(Annotation)标记需要监控的资源,并在资源更新时触发 Pod 的重启。

使用场景

  • 当 ConfigMap 或 Secret 更新时,自动重启相关的 Pod 以加载新的配置。
  • 避免手动重启 Pod,提高运维效率。

实战:使用 Reloader 实现热更新

  1. 安装 Reloader
    helm repo add stakater https://stakater.github.io/stakater-charts
    helm repo update
    helm install reloader stakater/reloader
    
  2. 创建 ConfigMap
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-config
      annotations:
        reloader.stakater.com/auto: "true"
    data:
      nginx.conf: |
        server {
            listen 80;
            server_name localhost;
            location / {
                root /usr/share/nginx/html;
                index index.html;
            }
        }
    
  3. 创建 Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
      annotations:
        reloader.stakater.com/auto: "true"
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - name: config-volume
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf
          volumes:
          - name: config-volume
            configMap:
              name: my-config
    
  4. 应用配置文件
    kubectl apply -f configmap.yaml
    kubectl apply -f deployment.yaml
    
  5. 更新 ConfigMap
    kubectl edit configmap my-config
    
    修改 nginx.conf 的内容:
    nginx.conf: |
      server {
          listen 80;
          server_name localhost;
          location / {
              root /usr/share/nginx/html;
              index index.html;
          }
          location /status {
              stub_status on;
          }
      }
    
  6. 验证热更新
    kubectl get pods -w
    
    输出中会显示 Pod 被重启:
    NAME                             READY   STATUS    RESTARTS   AGE
    my-deployment-5f7b5f6c4b-abcde   1/1     Running   0          10s
    my-deployment-5f7b5f6c4b-fghij   1/1     Running   0          8s
    

3. 生产案例

场景

  • 一个生产环境中,需要为 Web 应用提供动态配置管理,并支持热更新。

解决方案

  1. 安装 Reloader
    helm install reloader stakater/reloader
    
  2. 创建 ConfigMap
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: production-config
      annotations:
        reloader.stakater.com/auto: "true"
    data:
      nginx.conf: |
        server {
            listen 80;
            server_name localhost;
            location / {
                root /usr/share/nginx/html;
                index index.html;
            }
        }
    
  3. 创建 Deployment
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: production-deployment
      annotations:
        reloader.stakater.com/auto: "true"
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
            volumeMounts:
            - name: config-volume
              mountPath: /etc/nginx/nginx.conf
              subPath: nginx.conf
          volumes:
          - name: config-volume
            configMap:
              name: production-config
    
  4. 应用配置文件
    kubectl apply -f production-configmap.yaml
    kubectl apply -f production-deployment.yaml
    
  5. 验证热更新
    • 更新 ConfigMap 后,查看 Pod 是否被重启,并验证新的配置是否生效。

4. 注意事项

  1. Reloader 的安装
    • 确保 Reloader 正确安装,并监控到需要热更新的资源。
  2. 注解的使用
    • 通过 reloader.stakater.com/auto: "true" 注解标记需要监控的资源。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 Reloader 的配置和操作。
  4. 资源更新的频率
    • 避免频繁更新 ConfigMap 或 Secret,以免影响应用性能。

Secret

1. Secret

什么是 Secret?

  • Secret 是 Kubernetes 中用于存储敏感数据(如密码、密钥、证书等)的资源。
  • 它与 ConfigMap 类似,但数据会以 Base64 编码存储,提供更高的安全性。

Secret 的作用

  1. 敏感数据管理
    • 集中管理敏感数据,避免硬编码。
  2. 安全性
    • 数据以 Base64 编码存储,提供基本的安全保护。
  3. 动态更新
    • 更新 Secret 后,Pod 可以自动加载新的数据。

2. Pod 通过环境变量方式使用 Secret

场景

  • 将 Secret 中的键值对作为环境变量注入到 Pod 的容器中。

步骤

  1. 创建 Secret
    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secret
    type: Opaque
    data:
      username: YWRtaW4=  # admin
      password: cGFzc3dvcmQ=  # password
    
  2. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        env:
        - name: USERNAME
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: username
        - name: PASSWORD
          valueFrom:
            secretKeyRef:
              name: my-secret
              key: password
    
  3. 应用配置文件
    kubectl apply -f secret.yaml
    kubectl apply -f pod.yaml
    
  4. 验证环境变量
    kubectl exec -it my-pod -- printenv USERNAME PASSWORD
    
    输出中会显示注入的环境变量:
    USERNAME=admin
    PASSWORD=password
    

3. Pod 通过 volumeMount 使用 Secret

场景

  • 将 Secret 中的文件挂载到 Pod 的容器中。

步骤

  1. 创建 Secret
    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secret
    type: Opaque
    data:
      config.ini: |
        [database]
        username=YWRtaW4=
        password=cGFzc3dvcmQ=
    
  2. 创建 Pod 配置文件
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: nginx
        image: nginx
        volumeMounts:
        - name: secret-volume
          mountPath: /etc/secret
      volumes:
      - name: secret-volume
        secret:
          secretName: my-secret
          items:
          - key: config.ini
            path: config.ini
    
  3. 应用配置文件
    kubectl apply -f secret.yaml
    kubectl apply -f pod.yaml
    
  4. 验证挂载的文件
    kubectl exec -it my-pod -- cat /etc/secret/config.ini
    
    输出中会显示挂载的文件内容。

4. TLS Secret 配置 HTTPS Web 站点

场景

  • 使用 TLS Secret 为 Web 站点配置 HTTPS。

步骤

  1. 生成 TLS 证书和密钥
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
      -keyout tls.key -out tls.crt -subj "/CN=example.com"
    
  2. 创建 TLS Secret
    kubectl create secret tls tls-secret --cert=tls.crt --key=tls.key
    
  3. 创建 Deployment 和 Service
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: https-web
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: https-web
      template:
        metadata:
          labels:
            app: https-web
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 443
            volumeMounts:
            - name: tls-secret
              mountPath: /etc/nginx/ssl
          volumes:
          - name: tls-secret
            secret:
              secretName: tls-secret
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: https-web
    spec:
      type: NodePort
      selector:
        app: https-web
      ports:
      - port: 443
        targetPort: 443
        nodePort: 30443
    
  4. 应用配置文件
    kubectl apply -f https-web.yaml
    
  5. 验证 HTTPS Web 站点
    • 使用浏览器访问 https://<NodeIP>:30443,确认站点可以正常访问。

5. 生产案例

场景

  • 一个生产环境中,需要为 Web 应用提供 HTTPS 支持,并确保敏感数据的安全性。

解决方案

  1. 创建 TLS Secret
    kubectl create secret tls production-tls-secret --cert=tls.crt --key=tls.key
    
  2. 创建 Deployment 和 Service
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: production-https-web
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: production-https-web
      template:
        metadata:
          labels:
            app: production-https-web
        spec:
          containers:
          - name: nginx
            image: nginx
            ports:
            - containerPort: 443
            volumeMounts:
            - name: tls-secret
              mountPath: /etc/nginx/ssl
          volumes:
          - name: tls-secret
            secret:
              secretName: production-tls-secret
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: production-https-web
    spec:
      type: LoadBalancer
      selector:
        app: production-https-web
      ports:
      - port: 443
        targetPort: 443
    
  3. 应用配置文件
    kubectl apply -f production-https-web.yaml
    
  4. 验证 HTTPS Web 站点
    • 使用浏览器访问 https://<LoadBalancerIP>,确认站点可以正常访问。

6. 注意事项

  1. Secret 的安全性
    • 确保 Secret 的访问权限受到严格控制,避免敏感数据泄露。
  2. TLS 证书的管理
    • 确保证书和密钥的安全存储,并定期更新证书。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 Secret 的配置和操作。
  4. 应用的热加载支持
    • 确保应用支持热加载配置,否则需要重启 Pod。

RBAC

1. RBAC(基于角色的访问控制)

什么是 RBAC?

  • RBAC(Role-Based Access Control) 是 Kubernetes 中用于管理用户和服务账户访问权限的机制。
  • 它通过角色(Role)和角色绑定(RoleBinding)来定义和分配权限,确保资源的安全访问。

2. 认证(Authentication)

什么是认证?

  • 认证 是 Kubernetes 中验证用户或服务账户身份的过程。
  • 它确保只有合法的用户或服务账户可以访问集群资源。

认证方式

  1. X.509 客户端证书
    • 用户通过客户端证书进行身份验证。
  2. Bearer Token
    • 用户通过 Token 进行身份验证。
  3. ServiceAccount Token
    • 服务账户通过 Token 进行身份验证。
  4. OpenID Connect(OIDC)
    • 用户通过 OIDC 提供者进行身份验证。

3. 授权(Authorization)

什么是授权?

  • 授权 是 Kubernetes 中确定用户或服务账户是否有权限执行特定操作的过程。
  • 它基于 RBAC 机制,通过角色和角色绑定来分配权限。

授权方式

  1. RBAC
    • 基于角色的访问控制。
  2. ABAC(基于属性的访问控制)
    • 基于属性的访问控制。
  3. Node Authorization
    • 用于节点访问控制。
  4. Webhook
    • 通过外部 Webhook 进行授权。

4. 准入控制(Admission Control)

什么是准入控制?

  • 准入控制 是 Kubernetes 中在请求被处理之前进行额外验证和修改的机制。
  • 它确保请求符合集群的安全策略和资源限制。

常见的准入控制器

  1. NamespaceLifecycle
    • 确保命名空间的生命周期管理。
  2. LimitRanger
    • 限制资源的使用范围。
  3. ResourceQuota
    • 限制资源的配额。
  4. PodSecurityPolicy
    • 确保 Pod 的安全策略。

5. RBAC 的组成

RBAC 的核心组件

  1. Role
    • 定义一组权限,限定在某个命名空间内。
    • 示例:
      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        namespace: default
        name: pod-reader
      rules:
      - apiGroups: [""]
        resources: ["pods"]
        verbs: ["get", "watch", "list"]
      
  2. ClusterRole
    • 定义一组权限,适用于整个集群。
    • 示例:
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRole
      metadata:
        name: cluster-admin
      rules:
      - apiGroups: [""]
        resources: ["*"]
        verbs: ["*"]
      
  3. RoleBinding
    • 将 Role 或 ClusterRole 绑定到用户、组或服务账户,限定在某个命名空间内。
    • 示例:
      apiVersion: rbac.authorization.k8s.io/v1
      kind: RoleBinding
      metadata:
        name: read-pods
        namespace: default
      subjects:
      - kind: User
        name: alice
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: Role
        name: pod-reader
        apiGroup: rbac.authorization.k8s.io
      
  4. ClusterRoleBinding
    • 将 ClusterRole 绑定到用户、组或服务账户,适用于整个集群。
    • 示例:
      apiVersion: rbac.authorization.k8s.io/v1
      kind: ClusterRoleBinding
      metadata:
        name: cluster-admin-binding
      subjects:
      - kind: User
        name: admin
        apiGroup: rbac.authorization.k8s.io
      roleRef:
        kind: ClusterRole
        name: cluster-admin
        apiGroup: rbac.authorization.k8s.io
      

6. 实战:使用 RBAC 管理权限

场景

  • 为用户 alice 授予 default 命名空间中 Pod 的只读权限。

步骤

  1. 创建 Role
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: default
      name: pod-reader
      rules:
      - apiGroups: [""]
        resources: ["pods"]
        verbs: ["get", "watch", "list"]
    
  2. 创建 RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: read-pods
      namespace: default
    subjects:
    - kind: User
      name: alice
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
    
  3. 应用配置文件
    kubectl apply -f role.yaml
    kubectl apply -f rolebinding.yaml
    
  4. 验证权限
    kubectl auth can-i get pods --as=alice
    
    输出中会显示 yes,表示 alice 有权限读取 Pod。

7. 生产案例

场景

  • 一个生产环境中,需要为不同团队分配不同的权限,确保资源的安全访问。

解决方案

  1. 创建 ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: team-admin
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["*"]
    
  2. 创建 ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: team-admin-binding
    subjects:
    - kind: Group
      name: team-a
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: team-admin
      apiGroup: rbac.authorization.k8s.io
    
  3. 应用配置文件
    kubectl apply -f clusterrole.yaml
    kubectl apply -f clusterrolebinding.yaml
    
  4. 验证权限
    kubectl auth can-i create pods --as=team-a
    
    输出中会显示 yes,表示 team-a 有权限创建 Pod。

8. 注意事项

  1. 最小权限原则
    • 为用户或服务账户分配最小必要的权限,避免过度授权。
  2. 定期审计权限
    • 定期检查和清理不再使用的 Role 和 RoleBinding。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 RBAC 的配置和操作。
  4. 权限的继承性
    • 确保权限的继承性符合业务需求,避免权限冲突。

UserAccount和ServiceAccount应用

1. UserAccount 和 ServiceAccount

UserAccount

  • UserAccount 是 Kubernetes 中用于表示外部用户的账户。
  • 它通常由集群管理员手动创建,用于管理集群资源的访问权限。
  • 示例:alicebob

ServiceAccount

  • ServiceAccount 是 Kubernetes 中用于表示内部服务或 Pod 的账户。
  • 它由 Kubernetes 自动创建,用于 Pod 与 Kubernetes API 的交互。
  • 示例:defaultkube-system

2. ServiceAccount 应用案例

场景

  • 为 Pod 分配一个 ServiceAccount,使其可以访问 Kubernetes API。

步骤

  1. 创建 ServiceAccount
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: my-serviceaccount
    
  2. 创建 Pod 并使用 ServiceAccount
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      serviceAccountName: my-serviceaccount
      containers:
      - name: nginx
        image: nginx
    
  3. 应用配置文件
    kubectl apply -f serviceaccount.yaml
    kubectl apply -f pod.yaml
    
  4. 验证 ServiceAccount
    kubectl describe pod my-pod
    
    输出中会显示 Pod 使用的 ServiceAccount:
    Service Account: my-serviceaccount
    

3. Role(角色)应用

场景

  • default 命名空间中创建一个 Role,授予 Pod 的只读权限。

步骤

  1. 创建 Role
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: default
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "watch", "list"]
    
  2. 应用配置文件
    kubectl apply -f role.yaml
    
  3. 验证 Role
    kubectl get role pod-reader -n default
    

4. ClusterRole(集群角色)应用

场景

  • 创建一个 ClusterRole,授予整个集群中 Pod 的只读权限。

步骤

  1. 创建 ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: pod-reader
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "watch", "list"]
    
  2. 应用配置文件
    kubectl apply -f clusterrole.yaml
    
  3. 验证 ClusterRole
    kubectl get clusterrole pod-reader
    

5. RoleBinding(角色绑定)应用

场景

  • pod-reader Role 绑定到 default 命名空间中的用户 alice

步骤

  1. 创建 RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: read-pods
      namespace: default
    subjects:
    - kind: User
      name: alice
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
    
  2. 应用配置文件
    kubectl apply -f rolebinding.yaml
    
  3. 验证 RoleBinding
    kubectl get rolebinding read-pods -n default
    

6. ClusterRoleBinding(集群角色绑定)应用

场景

  • pod-reader ClusterRole 绑定到整个集群中的用户 admin

步骤

  1. 创建 ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: read-pods
    subjects:
    - kind: User
      name: admin
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: pod-reader
      apiGroup: rbac.authorization.k8s.io
    
  2. 应用配置文件
    kubectl apply -f clusterrolebinding.yaml
    
  3. 验证 ClusterRoleBinding
    kubectl get clusterrolebinding read-pods
    

7. 生产案例

场景

  • 一个生产环境中,需要为不同团队分配不同的权限,确保资源的安全访问。

解决方案

  1. 创建 ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: team-admin
    rules:
    - apiGroups: [""]
      resources: ["*"]
      verbs: ["*"]
    
  2. 创建 ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: team-admin-binding
    subjects:
    - kind: Group
      name: team-a
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: team-admin
      apiGroup: rbac.authorization.k8s.io
    
  3. 应用配置文件
    kubectl apply -f clusterrole.yaml
    kubectl apply -f clusterrolebinding.yaml
    
  4. 验证权限
    kubectl auth can-i create pods --as=team-a
    
    输出中会显示 yes,表示 team-a 有权限创建 Pod。

8. 注意事项

  1. 最小权限原则
    • 为用户或服务账户分配最小必要的权限,避免过度授权。
  2. 定期审计权限
    • 定期检查和清理不再使用的 Role 和 RoleBinding。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 RBAC 的配置和操作。
  4. 权限的继承性
    • 确保权限的继承性符合业务需求,避免权限冲突。

Kubectl资源操作

1. Kubectl 对 ServiceAccount 资源操作

创建 ServiceAccount

kubectl create serviceaccount my-serviceaccount

查看 ServiceAccount

kubectl get serviceaccount my-serviceaccount

删除 ServiceAccount

kubectl delete serviceaccount my-serviceaccount

描述 ServiceAccount

kubectl describe serviceaccount my-serviceaccount

2. Kubectl 对 Role 资源操作

创建 Role

kubectl create role pod-reader --verb=get,list,watch --resource=pods

查看 Role

kubectl get role pod-reader

删除 Role

kubectl delete role pod-reader

描述 Role

kubectl describe role pod-reader

3. Kubectl 对 ClusterRole 资源操作

创建 ClusterRole

kubectl create clusterrole pod-reader --verb=get,list,watch --resource=pods

查看 ClusterRole

kubectl get clusterrole pod-reader

删除 ClusterRole

kubectl delete clusterrole pod-reader

描述 ClusterRole

kubectl describe clusterrole pod-reader

4. Kubectl 对 RoleBinding 资源操作

创建 RoleBinding

kubectl create rolebinding read-pods --role=pod-reader --user=alice

查看 RoleBinding

kubectl get rolebinding read-pods

删除 RoleBinding

kubectl delete rolebinding read-pods

描述 RoleBinding

kubectl describe rolebinding read-pods

5. Kubectl 对 ClusterRoleBinding 资源操作

创建 ClusterRoleBinding

kubectl create clusterrolebinding read-pods --clusterrole=pod-reader --user=admin

查看 ClusterRoleBinding

kubectl get clusterrolebinding read-pods

删除 ClusterRoleBinding

kubectl delete clusterrolebinding read-pods

描述 ClusterRoleBinding

kubectl describe clusterrolebinding read-pods

6. 限制不同的用户操作 Kubernetes 集群

场景

  • 为用户 alice 授予 default 命名空间中 Pod 的只读权限。
  • 为用户 bob 授予 default 命名空间中 Pod 的读写权限。

步骤

  1. 创建 Role
    kubectl create role pod-reader --verb=get,list,watch --resource=pods
    kubectl create role pod-writer --verb=get,list,watch,create,update,delete --resource=pods
    
  2. 创建 RoleBinding
    kubectl create rolebinding read-pods --role=pod-reader --user=alice
    kubectl create rolebinding write-pods --role=pod-writer --user=bob
    
  3. 验证权限
    kubectl auth can-i get pods --as=alice
    kubectl auth can-i create pods --as=bob
    
    输出中会显示 yes,表示 alice 有权限读取 Pod,bob 有权限创建 Pod。

7. 生产案例

场景

  • 一个生产环境中,需要为不同团队分配不同的权限,确保资源的安全访问。

解决方案

  1. 创建 ClusterRole
    kubectl create clusterrole team-admin --verb=* --resource=*
    
  2. 创建 ClusterRoleBinding
    kubectl create clusterrolebinding team-admin-binding --clusterrole=team-admin --group=team-a
    
  3. 验证权限
    kubectl auth can-i create pods --as=team-a
    
    输出中会显示 yes,表示 team-a 有权限创建 Pod。

8. 注意事项

  1. 最小权限原则
    • 为用户或服务账户分配最小必要的权限,避免过度授权。
  2. 定期审计权限
    • 定期检查和清理不再使用的 Role 和 RoleBinding。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 RBAC 的配置和操作。
  4. 权限的继承性
    • 确保权限的继承性符合业务需求,避免权限冲突。

Ingress

1. 在 Kubernetes 中为什么要做负载均衡?

原因

  1. 高可用性
    • 负载均衡可以将流量分发到多个 Pod,避免单点故障,提高应用的可用性。
  2. 扩展性
    • 负载均衡可以根据流量动态扩展或缩减 Pod 数量,确保应用的高性能。
  3. 流量管理
    • 负载均衡可以根据规则(如路径、域名)将流量分发到不同的服务,实现灵活的流量管理。
  4. 安全性
    • 负载均衡可以提供 SSL/TLS 终止、访问控制等安全功能,保护应用的安全。

2. Ingress 和 Ingress Controller

什么是 Ingress?

  • Ingress 是 Kubernetes 中用于管理外部访问的 API 对象。
  • 它通过定义规则(如路径、域名)将外部流量路由到集群内部的服务。

什么是 Ingress Controller?

  • Ingress Controller 是 Kubernetes 中用于实现 Ingress 规则的控制器。
  • 它负责监听 Ingress 资源的变化,并根据规则配置负载均衡器(如 Nginx、Traefik)。

3. Ingress Controller 代理 Kubernetes 内部应用的流程

流程

  1. 用户访问应用
    • 用户通过域名或 IP 访问 Kubernetes 集群中的应用。
  2. Ingress Controller 监听流量
    • Ingress Controller 监听外部流量,并根据 Ingress 规则进行路由。
  3. 流量路由到 Service
    • Ingress Controller 将流量路由到对应的 Kubernetes Service。
  4. Service 转发到 Pod
    • Service 将流量转发到后端的 Pod,完成请求处理。

4. Ingress 应用场景

场景

  1. 基于域名的路由
    • 将不同域名的流量路由到不同的服务。
  2. 基于路径的路由
    • 将不同路径的流量路由到不同的服务。
  3. SSL/TLS 终止
    • 在 Ingress 层终止 SSL/TLS,减轻后端服务的负担。
  4. 访问控制
    • 通过 Ingress 实现 IP 白名单、Basic Auth 等访问控制。

5. 安装部署 Nginx Ingress Controller

步骤

  1. 添加 Helm 仓库
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    
  2. 安装 Nginx Ingress Controller
    helm install ingress-nginx ingress-nginx/ingress-nginx
    
  3. 验证安装
    kubectl get pods -n default -l app.kubernetes.io/name=ingress-nginx
    
    输出中会显示 Nginx Ingress Controller 的 Pod:
    NAME                                        READY   STATUS    RESTARTS   AGE
    ingress-nginx-controller-5f7b5f6c4b-abcde   1/1     Running   0          10s
    
  4. 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: example-service
                port:
                  number: 80
    
  5. 应用 Ingress 配置文件
    kubectl apply -f ingress.yaml
    
  6. 验证 Ingress
    kubectl get ingress
    
    输出中会显示 Ingress 的详细信息:
    NAME             CLASS    HOSTS         ADDRESS         PORTS   AGE
    example-ingress  nginx    example.com   192.168.1.100   80      10s
    

6. 生产案例

场景

  • 一个生产环境中,需要为多个 Web 应用提供基于域名的路由和 SSL/TLS 终止。

解决方案

  1. 安装 Nginx Ingress Controller
    helm install ingress-nginx ingress-nginx/ingress-nginx
    
  2. 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: production-ingress
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "true"
    spec:
      tls:
      - hosts:
        - example.com
        secretName: example-tls
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: example-service
                port:
                  number: 80
    
  3. 应用 Ingress 配置文件
    kubectl apply -f production-ingress.yaml
    
  4. 验证 Ingress
    kubectl get ingress
    
    输出中会显示 Ingress 的详细信息:
    NAME               CLASS    HOSTS         ADDRESS         PORTS     AGE
    production-ingress nginx    example.com   192.168.1.100   80, 443   10s
    

7. 注意事项

  1. Ingress Controller 的选择
    • 根据实际需求选择合适的 Ingress Controller(如 Nginx、Traefik)。
  2. SSL/TLS 证书的管理
    • 确保证书和密钥的安全存储,并定期更新证书。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 Ingress 的配置和操作。
  4. 访问控制
    • 通过 Ingress 实现 IP 白名单、Basic Auth 等访问控制,确保应用的安全。

Ingress 资源清单编写与策略配置

1. Ingress 资源清单编写与策略配置技巧

Ingress 资源清单编写

  • 基本结构
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: example-service
                port:
                  number: 80
    
  • 常用字段
    • host:指定域名。
    • path:指定路径。
    • backend:指定后端服务。
    • annotations:配置 Ingress 的额外功能(如重写规则、SSL 终止等)。

策略配置技巧

  1. 路径重写
    • 使用 nginx.ingress.kubernetes.io/rewrite-target 注解实现路径重写。
    • 示例:
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /
      
  2. SSL/TLS 终止
    • 使用 tls 字段配置 SSL/TLS 证书。
    • 示例:
      tls:
      - hosts:
        - example.com
        secretName: example-tls
      
  3. 访问控制
    • 使用 nginx.ingress.kubernetes.io/whitelist-source-range 注解配置 IP 白名单。
    • 示例:
      annotations:
        nginx.ingress.kubernetes.io/whitelist-source-range: 192.168.1.0/24
      

2. Ingress HTTP 代理 Web 站点

场景

  • 使用 Ingress 将 HTTP 流量代理到 Kubernetes 内部的 Web 站点。

步骤

  1. 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: http-ingress
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: example-service
                port:
                  number: 80
    
  2. 应用配置文件
    kubectl apply -f http-ingress.yaml
    
  3. 验证 Ingress
    kubectl get ingress
    
    输出中会显示 Ingress 的详细信息:
    NAME           CLASS    HOSTS         ADDRESS         PORTS   AGE
    http-ingress   nginx    example.com   192.168.1.100   80      10s
    

3. Ingress HTTPS 代理 Web 站点

场景

  • 使用 Ingress 将 HTTPS 流量代理到 Kubernetes 内部的 Web 站点。

步骤

  1. 生成 TLS 证书和密钥
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
      -keyout tls.key -out tls.crt -subj "/CN=example.com"
    
  2. 创建 TLS Secret
    kubectl create secret tls example-tls --cert=tls.crt --key=tls.key
    
  3. 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: https-ingress
    spec:
      tls:
      - hosts:
        - example.com
        secretName: example-tls
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: example-service
                port:
                  number: 80
    
  4. 应用配置文件
    kubectl apply -f https-ingress.yaml
    
  5. 验证 Ingress
    kubectl get ingress
    
    输出中会显示 Ingress 的详细信息:
    NAME            CLASS    HOSTS         ADDRESS         PORTS     AGE
    https-ingress   nginx    example.com   192.168.1.100   80, 443   10s
    

4. Nginx Ingress 添加 Basic Auth 安全认证

场景

  • 使用 Nginx Ingress 为 Web 站点添加 Basic Auth 安全认证。

步骤

  1. 生成 Basic Auth 文件
    htpasswd -c auth admin
    
  2. 创建 Basic Auth Secret
    kubectl create secret generic basic-auth --from-file=auth
    
  3. 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: basic-auth-ingress
      annotations:
        nginx.ingress.kubernetes.io/auth-type: basic
        nginx.ingress.kubernetes.io/auth-secret: basic-auth
        nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: example-service
                port:
                  number: 80
    
  4. 应用配置文件
    kubectl apply -f basic-auth-ingress.yaml
    
  5. 验证 Basic Auth
    • 访问 http://example.com,会弹出 Basic Auth 认证窗口。

5. 生产案例

场景

  • 一个生产环境中,需要为 Web 站点提供 HTTPS 支持和 Basic Auth 安全认证。

解决方案

  1. 生成 TLS 证书和密钥
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
      -keyout tls.key -out tls.crt -subj "/CN=example.com"
    
  2. 创建 TLS Secret
    kubectl create secret tls example-tls --cert=tls.crt --key=tls.key
    
  3. 生成 Basic Auth 文件
    htpasswd -c auth admin
    
  4. 创建 Basic Auth Secret
    kubectl create secret generic basic-auth --from-file=auth
    
  5. 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: production-ingress
      annotations:
        nginx.ingress.kubernetes.io/auth-type: basic
        nginx.ingress.kubernetes.io/auth-secret: basic-auth
        nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
    spec:
      tls:
      - hosts:
        - example.com
        secretName: example-tls
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: example-service
                port:
                  number: 80
    
  6. 应用配置文件
    kubectl apply -f production-ingress.yaml
    
  7. 验证 HTTPS 和 Basic Auth
    • 访问 https://example.com,会弹出 Basic Auth 认证窗口。

6. 注意事项

  1. 证书和密钥的管理
    • 确保证书和密钥的安全存储,并定期更新证书。
  2. Basic Auth 的安全性
    • 使用强密码,并定期更换密码。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证 Ingress 的配置和操作。
  4. 访问控制
    • 通过 Ingress 实现 IP 白名单、Basic Auth 等访问控制,确保应用的安全。

流量切分

1. 基于服务权重的流量切分

场景

  • 将流量按权重比例分发到不同的服务版本,实现灰度发布或 A/B 测试。

步骤

  1. 创建多个 Service
    • 例如,创建 service-v1service-v2
  2. 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: weighted-ingress
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-weight: "20"
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-v1
                port:
                  number: 80
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-v2
                port:
                  number: 80
    
  3. 应用配置文件
    kubectl apply -f weighted-ingress.yaml
    
  4. 验证流量切分
    • 访问 http://example.com,80% 的流量会分发到 service-v1,20% 的流量会分发到 service-v2

2. 基于客户端请求头的流量切分

场景

  • 根据客户端请求头(如 User-AgentCookie)将流量分发到不同的服务版本。

步骤

  1. 创建多个 Service
    • 例如,创建 service-v1service-v2
  2. 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: header-based-ingress
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "User-Agent"
        nginx.ingress.kubernetes.io/canary-by-header-value: "mobile"
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-v1
                port:
                  number: 80
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-v2
                port:
                  number: 80
    
  3. 应用配置文件
    kubectl apply -f header-based-ingress.yaml
    
  4. 验证流量切分
    • 使用 User-Agent: mobile 的请求会分发到 service-v2,其他请求会分发到 service-v1

3. 基于客户端来源 IP 的流量切分

场景

  • 根据客户端来源 IP 将流量分发到不同的服务版本。

步骤

  1. 创建多个 Service
    • 例如,创建 service-v1service-v2
  2. 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ip-based-ingress
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-ip: "192.168.1.100"
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-v1
                port:
                  number: 80
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-v2
                port:
                  number: 80
    
  3. 应用配置文件
    kubectl apply -f ip-based-ingress.yaml
    
  4. 验证流量切分
    • 来自 192.168.1.100 的请求会分发到 service-v2,其他请求会分发到 service-v1

4. 生产案例

场景

  • 一个生产环境中,需要根据客户端请求头和来源 IP 将流量分发到不同的服务版本。

解决方案

  1. 创建多个 Service
    • 例如,创建 service-v1service-v2
  2. 创建 Ingress 资源
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: production-ingress
      annotations:
        nginx.ingress.kubernetes.io/canary: "true"
        nginx.ingress.kubernetes.io/canary-by-header: "User-Agent"
        nginx.ingress.kubernetes.io/canary-by-header-value: "mobile"
        nginx.ingress.kubernetes.io/canary-by-ip: "192.168.1.100"
    spec:
      rules:
      - host: example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-v1
                port:
                  number: 80
          - path: /
            pathType: Prefix
            backend:
              service:
                name: service-v2
                port:
                  number: 80
    
  3. 应用配置文件
    kubectl apply -f production-ingress.yaml
    
  4. 验证流量切分
    • 使用 User-Agent: mobile 或来自 192.168.1.100 的请求会分发到 service-v2,其他请求会分发到 service-v1

5. 注意事项

  1. 流量切分的准确性
    • 确保流量切分的规则准确,避免误分发。
  2. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证流量切分的配置和操作。
  3. 灰度发布的策略
    • 根据实际需求选择合适的灰度发布策略(如权重、请求头、来源 IP)。
  4. 监控和日志
    • 监控流量切分的效果,并记录日志以便分析和排查问题。

好的!以下是关于 Etcd 在 Kubernetes 集群中的作用Etcd 集群选举算法Etcd 基本操作Etcd 快照备份Etcd 快照还原 的详细说明:

1. Etcd 在 Kubernetes 集群中的作用

什么是 Etcd?

  • Etcd 是一个分布式键值存储系统,用于存储 Kubernetes 集群的所有关键数据(如集群状态、配置、元数据等)。
  • 它是 Kubernetes 的核心组件之一,负责保证集群数据的一致性和高可用性。

Etcd 的作用

  1. 存储集群状态
    • 存储 Kubernetes 集群的所有资源对象(如 Pod、Service、Deployment 等)的状态。
  2. 配置管理
    • 存储 Kubernetes 集群的配置信息(如网络配置、安全策略等)。
  3. 服务发现
    • 存储 Kubernetes 集群中服务的注册和发现信息。
  4. 高可用性
    • 通过分布式架构和选举机制,确保集群的高可用性。

2. Etcd 集群选举算法

Raft 算法

  • Raft 是 Etcd 使用的分布式一致性算法,用于实现集群的选举和数据同步。

选举过程

  1. Leader 选举
    • 当集群中的 Leader 节点失效时,其他节点会发起选举,选出新的 Leader。
  2. 日志复制
    • Leader 节点将数据变更日志复制到其他节点,确保数据一致性。
  3. 故障恢复
    • 当节点发生故障时,Raft 算法会自动恢复集群的正常运行。

3. Etcd 基本操作

启动 Etcd

etcd

查看 Etcd 版本

etcdctl version

写入数据

etcdctl put /key value

读取数据

etcdctl get /key

删除数据

etcdctl del /key

列出所有键

etcdctl get / --prefix

4. Etcd 快照备份

场景

  • 定期备份 Etcd 数据,防止数据丢失。

步骤

  1. 创建快照
    etcdctl snapshot save snapshot.db
    
  2. 查看快照状态
    etcdctl snapshot status snapshot.db
    
  3. 备份快照文件
    • snapshot.db 文件备份到安全的位置。

5. Etcd 快照还原

场景

  • 当 Etcd 数据丢失或损坏时,使用快照文件恢复数据。

步骤

  1. 停止 Etcd 服务
    systemctl stop etcd
    
  2. 还原快照
    etcdctl snapshot restore snapshot.db --data-dir /var/lib/etcd
    
  3. 启动 Etcd 服务
    systemctl start etcd
    
  4. 验证数据
    etcdctl get / --prefix
    

6. 生产案例

场景

  • 一个生产环境中,需要定期备份 Etcd 数据,并在数据丢失时快速恢复。

解决方案

  1. 创建快照
    etcdctl snapshot save /backup/snapshot.db
    
  2. 备份快照文件
    • /backup/snapshot.db 文件备份到远程存储(如 S3、NFS)。
  3. 还原快照
    etcdctl snapshot restore /backup/snapshot.db --data-dir /var/lib/etcd
    
  4. 启动 Etcd 服务
    systemctl start etcd
    
  5. 验证数据
    etcdctl get / --prefix
    

7. 注意事项

  1. 快照的定期备份
    • 定期备份 Etcd 数据,确保数据的安全性。
  2. 快照的存储安全
    • 将快照文件存储到安全的位置,防止数据泄露。
  3. 生产环境的测试
    • 在生产环境中使用前,先在测试环境中验证快照备份和还原的配置和操作。
  4. 监控和日志
    • 监控 Etcd 的运行状态,并记录日志以便分析和排查问题。
posted @   Mugetsukun  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示