初探k8s中的资源对象

13 阅读7分钟

在 Kubernetes(k8s)中,有多种资源对象,每个资源对象都有其特定的作用和用途。以下是对 Kubernetes 中常见资源对象的详细解释:

1. Pod

  • 定义:Pod 是 Kubernetes 中最小的部署单元,可以包含一个或多个容器(通常是 Docker 容器)。
  • 特点
    • Pod 中的容器共享网络命名空间,可以使用 localhost 相互通信。
    • Pod 中的容器共享存储卷(Volume)。
  • 用途
    • 部署单个容器应用。
    • 部署多个紧密相关的容器,例如主应用容器和日志收集容器。
  • 示例 YAML
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-pod
    spec:
      containers:
      - name: my-container
        image: nginx:latest
    

2. Deployment

  • 定义:Deployment 是一种控制器,用于管理 Pod 的部署和更新。
  • 特点
    • 确保指定数量的 Pod 副本始终运行。
    • 支持滚动更新和回滚。
  • 用途
    • 管理无状态应用的部署。
  • 示例 YAML
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-container
            image: nginx:latest
    

3. Service

  • 定义:Service 是一种抽象,用于定义一组 Pod 的逻辑集合和访问策略。
  • 特点
    • 提供稳定的网络标识符(IP 地址和端口)。
    • 支持负载均衡。
    • 支持多种服务类型(ClusterIP、NodePort、LoadBalancer、ExternalName)。
  • 用途
    • 为 Pod 提供服务发现和负载均衡。
  • 示例 YAML
    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      selector:
        app: my-app
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      type: ClusterIP
    

4. StatefulSet

  • 定义:StatefulSet 是一种控制器,用于管理有状态应用。
  • 特点
    • 为每个 Pod 提供稳定的网络标识符和存储卷。
    • 支持有序的部署、扩展和更新。
  • 用途
    • 管理有状态应用,如数据库。
  • 示例 YAML
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: my-statefulset
    spec:
      serviceName: "my-service"
      replicas: 3
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-container
            image: mysql:latest
    

5. DaemonSet

  • 定义:DaemonSet 是一种控制器,用于确保每个节点上都运行一个 Pod 副本。
  • 特点
    • 适用于需要在每个节点上运行的系统级服务,如日志收集、监控代理等。
  • 用途
    • 确保每个节点上都运行一个特定的 Pod。
  • 示例 YAML
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: my-daemonset
    spec:
      selector:
        matchLabels:
          app: my-app
      template:
        metadata:
          labels:
            app: my-app
        spec:
          containers:
          - name: my-container
            image: fluentd:latest
    

6. Job

  • 定义:Job 是一种控制器,用于运行一次性任务。
  • 特点
    • 任务完成后,Pod 会自动终止。
    • 支持并行执行。
  • 用途
    • 执行批处理任务,如数据迁移、定时任务等。
  • 示例 YAML
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: my-job
    spec:
      template:
        spec:
          containers:
          - name: my-container
            image: busybox
            command: ["echo", "Hello, Kubernetes!"]
          restartPolicy: Never
    

7. CronJob

  • 定义:CronJob 是一种控制器,用于运行周期性任务。
  • 特点
    • 按照预设的时间表运行任务。
  • 用途
    • 执行周期性任务,如定时备份、定时清理等。
  • 示例 YAML
    apiVersion: batch/v1
    kind: CronJob
    metadata:
      name: my-cronjob
    spec:
      schedule: "*/1 * * * *"
      jobTemplate:
        spec:
          template:
            spec:
              containers:
              - name: my-container
                image: busybox
                command: ["echo", "Hello, Kubernetes!"]
              restartPolicy: OnFailure
    

8. ConfigMap

  • 定义:ConfigMap 是一种存储配置数据的资源对象。
  • 特点
    • 以键值对的形式存储配置数据。
    • 可以被 Pod 引用,用于配置应用。
  • 用途
    • 存储配置文件、环境变量等。
  • 示例 YAML
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-configmap
    data:
      key1: value1
      key2: value2
    

9. Secret

  • 定义:Secret 是一种存储敏感信息的资源对象。
  • 特点
    • 以键值对的形式存储敏感信息,如密码、密钥等。
    • 数据会被加密存储。
  • 用途
    • 存储敏感信息,如数据库密码、API 密钥等。
  • 示例 YAML
    apiVersion: v1
    kind: Secret
    metadata:
      name: my-secret
    type: Opaque
    data:
      username: <base64-encoded-username>
      password: <base64-encoded-password>
    

10. Ingress

  • 定义:Ingress 是一种资源对象,用于管理外部访问集群内服务的规则。
  • 特点
    • 提供基于 HTTP 和 HTTPS 的负载均衡。
    • 支持基于路径和域名的路由。
  • 用途
    • 管理外部访问集群内服务的流量。
  • 示例 YAML
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: my-ingress
    spec:
      rules:
      - host: myapp.example.com
        http:
          paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-service
                port:
                  number: 80
    

11. Namespace

  • 定义:Namespace 是一种逻辑隔离机制,用于将集群资源划分为多个虚拟子集群。
  • 特点
    • 逻辑隔离,不同 Namespace 中的资源互不干扰。
    • 资源配额和限制可以按 Namespace 设置。
  • 用途
    • 用于多租户环境,隔离不同团队或项目的资源。
  • 示例 YAML
    apiVersion: v1
    kind: Namespace
    metadata:
      name: my-namespace
    

12. PersistentVolume (PV) 和 PersistentVolumeClaim (PVC)

  • 定义
    • PersistentVolume (PV):集群中的一块存储资源。
    • PersistentVolumeClaim (PVC):用户对存储资源的请求。
  • 特点
    • PV 是集群管理员创建的存储资源,PVC 是用户对存储资源的请求。
    • 支持多种存储后端,如本地存储、云存储等。
  • 用途
    • 提供持久化存储,用于有状态应用。
  • 示例 YAML
    # PersistentVolume
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: my-pv
    spec:
      capacity:
        storage: 10Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: "/data"
    
    # PersistentVolumeClaim
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 5Gi
    

13. ResourceQuota

  • 定义:ResourceQuota 是一种资源对象,用于限制 Namespace 中资源的使用。
  • 特点
    • 限制 Namespace 中的资源总量。
    • 支持多种资源类型,如 CPU、内存、Pod 数量等。
  • 用途
    • 用于多租户环境,限制不同团队或项目的资源使用。
  • 示例 YAML
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: my-quota
      namespace: my-namespace
    spec:
      hard:
        pods: "10"
        requests.cpu: "2"
        requests.memory: "1Gi"
        limits.cpu: "4"
        limits.memory: "2Gi"
    

14. LimitRange

  • 定义:LimitRange 是一种资源对象,用于限制 Namespace 中资源的使用范围。
  • 特点
    • 限制 Namespace 中单个 Pod 或容器的资源使用范围。
    • 支持多种资源类型,如 CPU、内存等。
  • 用途
    • 用于多租户环境,限制不同团队或项目的资源使用范围。
  • 示例 YAML
    apiVersion: v1
    kind: LimitRange
    metadata:
      name: my-limitrange
      namespace: my-namespace
    spec:
      limits:
      - type: Container
        max:
          cpu: "2"
          memory: "1Gi"
        min:
          cpu: "0.1"
          memory: "20Mi"
    

15. Node

  • 定义:Node 是 Kubernetes 集群中的一个工作机器,可以是物理机或虚拟机。
  • 特点
    • 运行 Pod。
    • 由 kubelet 管理。
  • 用途
    • 提供计算资源,运行应用容器。
  • 示例 YAML
    apiVersion: v1
    kind: Node
    metadata:
      name: my-node
    spec:
      podCIDR: 10.240.0.0/24
    

16. Endpoint

  • 定义:Endpoint 是一种资源对象,表示 Service 的后端 Pod。
  • 特点
    • 由 Kubernetes 自动管理。
    • 用于 Service 和 Pod 之间的通信。
  • 用途
    • 提供 Service 和 Pod 之间的映射关系。
  • 示例 YAML
    apiVersion: v1
    kind: Endpoints
    metadata:
      name: my-endpoints
    subsets:
    - addresses:
      - ip: 10.240.0.4
      ports:
      - port: 80
    

17. NetworkPolicy

  • 定义:NetworkPolicy 是一种资源对象,用于控制 Pod 之间的网络通信。
  • 特点
    • 基于标签选择器和策略规则控制 Pod 之间的通信。
  • 用途
    • 用于网络安全,限制 Pod 之间的通信。
  • 示例 YAML
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    metadata:
      name: my-networkpolicy
      namespace: my-namespace
    spec:
      podSelector:
        matchLabels:
          role: frontend
      policyTypes:
      - Ingress
      - Egress
      ingress:
      - from:
        - ipBlock:
            cidr: 172.17.0.0/16
            except:
            - 172.17.1.0/24
        - namespaceSelector:
            matchLabels:
              project: myproject
        - podSelector:
            matchLabels:
              role: backend
      egress:
      - to:
        - ipBlock:
            cidr: 10.0.0.0/24
        ports:
        - protocol: TCP
          port: 5978
    

18. Role 和 RoleBinding

  • 定义
    • Role:定义了一组权限。
    • RoleBinding:将 Role 绑定到用户或组。
  • 特点
    • 用于细粒度的访问控制。
    • 作用范围是 Namespace。
  • 用途
    • 用于管理用户或组的权限。
  • 示例 YAML
    # Role
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      namespace: my-namespace
      name: my-role
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list"]
    
    # RoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: my-rolebinding
      namespace: my-namespace
    subjects:
    - kind: User
      name: my-user
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: Role
      name: my-role
      apiGroup: rbac.authorization.k8s.io
    

19. ClusterRole 和 ClusterRoleBinding

  • 定义
    • ClusterRole:定义了一组权限。
    • ClusterRoleBinding:将 ClusterRole 绑定到用户或组。
  • 特点
    • 用于细粒度的访问控制。
    • 作用范围是整个集群。
  • 用途
    • 用于管理用户或组的权限。
  • 示例 YAML
    # ClusterRole
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: my-clusterrole
    rules:
    - apiGroups: [""]
      resources: ["pods"]
      verbs: ["get", "list"]
    
    # ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: my-clusterrolebinding
    subjects:
    - kind: User
      name: my-user
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: my-clusterrole
      apiGroup: rbac.authorization.k8s.io
    

20. CustomResourceDefinition (CRD)

  • 定义:CustomResourceDefinition 是一种资源对象,用于扩展 Kubernetes API。
  • 特点
    • 允许用户定义自己的资源类型。
    • 可以通过 Kubernetes 的 API 管理自定义资源。
  • 用途
    • 扩展 Kubernetes 的功能,支持自定义资源。
  • 示例 YAML
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      name: myresources.example.com
    spec:
      group: example.com
      versions:
      - name: v1
        served: true
        storage: true
        schema:
          openAPIV3Schema:
            type: object
            properties:
              spec:
                type: object
                properties:
                  key:
                    type: string
      scope: Namespaced
      names:
        plural: myresources
        singular: myresource
        kind: MyResource
        shortNames:
        - mr
    

总结

Kubernetes 提供了丰富的资源对象,每种资源对象都有其特定的作用和用途。了解这些资源对象的定义、特点和用途,可以帮助你更好地管理和使用 Kubernetes 集群。