【Kubernets】Kubernetes 的基础知识,Pod是什么? 和容器的关系?多个容器如何在同一个 Pod 里协作?

1. Kubernetes 的核心概念

(1) Node(节点)

  • 定义:Node 是 Kubernetes 集群中的工作机器,可以是物理机或虚拟机。
  • 类型
    • Master Node:运行控制平面组件(如 API Server、Scheduler)。
    • Worker Node:运行应用负载(如 Pod)。
  • 关键组件
    • Kubelet:负责与 Master Node 通信,管理 Pod 和容器。
    • Kube Proxy:负责网络代理和负载均衡。
    • 容器运行时:负责运行容器(如 Docker、containerd)。

(2) Namespace(命名空间)

  • 定义:Namespace 是 Kubernetes 中用于隔离资源的虚拟集群。
  • 作用
    • 将资源分组,便于管理。
    • 实现多租户环境下的资源隔离。
  • 常见 Namespace
    • default:默认命名空间。
    • kube-system:Kubernetes 系统组件的命名空间。
    • kube-public:公共资源的命名空间。

(3) Label 和 Selector(标签和选择器)

  • Label
    • 键值对,用于标识和分类资源(如 Pod、Service)。
    • 示例:app=web, env=prod
  • Selector
    • 用于根据 Label 选择资源。
    • 示例:选择所有 app=web 的 Pod。

(4) Annotation(注解)

  • 定义:Annotation 是附加到资源上的元数据,用于存储非标识性信息。
  • 作用
    • 记录构建信息、版本号等。
    • 配置工具或库的行为。
  • 示例:build-version: v1.2.3

2. Kubernetes 的核心资源

(1) Pod

  • 定义:Kubernetes 的最小调度单元,包含一个或多个容器。
  • 特点
    • 共享网络和存储资源。
    • 生命周期短暂,通常由控制器(如 Deployment)管理。

(2) Deployment

  • 定义:用于定义 Pod 的副本数和更新策略。

  • 作用

    • 确保指定数量的 Pod 副本始终运行。
    • 支持滚动更新和回滚。
  • 示例

    yaml 复制代码
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: web-app
    spec:
      replicas: 3
      template:
        spec:
          containers:
          - name: web
            image: nginx

(3) Service

  • 定义:用于定义如何访问 Pod。

  • 作用

    • 提供稳定的 IP 和 DNS 名称。
    • 实现负载均衡和服务发现。
  • 类型

    • ClusterIP:集群内部访问。
    • NodePort:通过节点端口访问。
    • LoadBalancer:通过云提供商的负载均衡器访问。
  • 示例

    yaml 复制代码
    apiVersion: v1
    kind: Service
    metadata:
      name: web-service
    spec:
      selector:
        app: web
      ports:
      - protocol: TCP
        port: 80
        targetPort: 80

(4) ConfigMap 和 Secret

  • ConfigMap

    • 用于存储配置数据(如环境变量、配置文件)。

    • 示例:

      yaml 复制代码
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: app-config
      data:
        log-level: "info"
  • Secret

    • 用于存储敏感数据(如密码、密钥)。

    • 示例:

      yaml 复制代码
      apiVersion: v1
      kind: Secret
      metadata:
        name: db-secret
      data:
        username: YWRtaW4=
        password: MWYyZDFlMmU2N2Rm

3. Kubernetes 的核心功能

(1) 自动扩展

  • Horizontal Pod Autoscaler (HPA)

    • 根据 CPU 使用率或其他指标自动调整 Pod 的副本数。
  • 示例

    yaml 复制代码
    apiVersion: autoscaling/v2beta2
    kind: HorizontalPodAutoscaler
    metadata:
      name: web-app-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: web-app
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50

(2) 自我修复

  • 功能
    • 自动重启失败的容器。
    • 替换不可用的 Pod。
  • 实现
    • 通过控制器(如 Deployment、StatefulSet)确保 Pod 的期望状态。

(3) 滚动更新和回滚

  • 滚动更新

    • 逐步替换旧版本的 Pod,确保应用不中断。
  • 回滚

    • 回滚到之前的版本。
  • 示例

    bash 复制代码
    kubectl set image deployment/web-app web=nginx:1.19
    kubectl rollout undo deployment/web-app

4. Kubernetes 的常用命令

(1) 查看资源

  • 查看 Pod:

    bash 复制代码
    kubectl get pods
  • 查看 Deployment:

    bash 复制代码
    kubectl get deployments

(2) 创建资源

  • 通过 YAML 文件创建:

    bash 复制代码
    kubectl apply -f deployment.yaml

(3) 删除资源

  • 删除 Pod:

    bash 复制代码
    kubectl delete pod <pod-name>

(4) 查看日志

  • 查看 Pod 日志:

    bash 复制代码
    kubectl logs <pod-name>

Pod定义,和容器的关系

  • Pod 是 Kubernetes 中的最小部署单位 ,它封装了一个或多个容器 ,这些容器共享 存储、网络、生命周期
  • Pod 是对容器的抽象 ,它解决了单个容器无法满足的需求,比如 多个进程协作、共享存储、共享网络

可以简单理解为:

Pod 是一个"容器组" ,里面可以有 1 个或多个容器 ,但这些容器是相互依赖的,需要协作完成任务。


多个容器如何在同一个 Pod 里协作?

在同一个 Pod 里的容器,可以通过以下 三种方式协作

1. 共享网络(Network)
  • Pod 里的所有容器共享同一个 IP 地址(Pod IP)
  • 容器之间可以用 localhost 直接通信
  • 适用于:一个主应用 + 辅助应用(如 Nginx + PHP)

示例

shell 复制代码
# 在 Pod 里,两个容器可以这样通信:
curl http://localhost:8080

不需要跨 Pod 访问,容器间直接使用 localhost 访问


2. 共享存储(Storage)
  • Pod 内的容器可以共享 Volume(存储卷),用于共享数据
  • 适用于:日志收集、数据缓存、共享配置等

示例

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: shared-volume-pod
spec:
  volumes:
    - name: shared-storage
      emptyDir: {}  # 共享存储
  containers:
    - name: app
      image: my-app
      volumeMounts:
        - mountPath: /data
          name: shared-storage
    - name: sidecar
      image: log-collector
      volumeMounts:
        - mountPath: /data
          name: shared-storage

两个容器(app 和 log-collector)共享 /data 目录,可以用于日志处理。


3. Sidecar 模式(辅助容器)
  • 在同一个 Pod 里运行一个 主容器 和一个 辅助容器(Sidecar)
  • Sidecar 负责 日志处理、监控、数据同步等任务
  • 适用于:日志收集、代理服务、自动更新等场景

示例:日志收集

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: sidecar-pod
spec:
  containers:
    - name: app
      image: my-app
    - name: log-agent
      image: fluentd

Fluentd(日志收集器)和业务容器一起运行,专门处理日志


总结

协作方式 作用 适用场景
共享网络 容器之间可以用 localhost 直接通信 主应用 + 代理(如 Nginx + PHP)
共享存储 共享 Volume 数据 日志收集、数据缓存
Sidecar 模式 辅助主容器 日志收集、自动更新

Pod 中多容器协作的实际示例

示例 1:Web 应用与日志收集

  • 场景
    • 一个 Web 应用需要将日志发送到集中式日志系统。
  • Pod 配置
    • 主容器:运行 Web 应用。
    • Sidecar 容器:运行日志收集工具(如 Fluentd)。
  • 协作方式
    • Web 应用容器将日志写入共享存储卷。
    • Sidecar 容器从共享存储卷读取日志并发送到日志系统。

示例 2:数据预处理与应用

  • 场景
    • 一个应用需要处理大量数据,但数据需要先进行预处理。
  • Pod 配置
    • Init 容器:运行数据预处理工具。
    • 主容器:运行应用。
  • 协作方式
    • Init 容器从远程存储下载数据并进行预处理。
    • 预处理完成后,主容器启动并使用处理后的数据。

示例 3:Web 应用与代理

  • 场景
    • 一个 Web 应用需要通过代理访问外部服务。
  • Pod 配置
    • 主容器:运行 Web 应用。
    • Sidecar 容器:运行代理(如 Envoy)。
  • 协作方式
    • Web 应用容器通过 localhost 访问代理容器。
    • 代理容器负责将请求转发到外部服务。

https://github.com/0voice

相关推荐
桂月二二3 小时前
云原生容器编排:Kubernetes的架构演进与实践
云原生·架构·kubernetes
奔跑中的小象3 小时前
Deepin通过二进制方式升级部署高版本 Docker
docker·容器·eureka·deepin
行者Sun19895 小时前
【K8s】专题十六(3):Kubernetes 包管理工具之 Helm 语法
云原生·容器·kubernetes·helm
全是操作15 小时前
k8s scheduler源码阅读
云原生·容器·kubernetes
obboda16 小时前
Docker基础入门
运维·docker·云原生·容器·eureka
cooldream200917 小时前
Docker Desktop 安装与使用详解
运维·docker·容器
川石课堂软件测试18 小时前
涨薪技术|Kubernetes(k8s)之Service服务
功能测试·adb·docker·云原生·容器·kubernetes·单元测试
钰紫薇18 小时前
玩转K8S,轻松部署SpringBoot项目,实现hello K8s
运维·kubernetes
RedCong19 小时前
k8s之PodDisruptionBudget详解
云原生·容器·kubernetes