• [云原生 | k8s ]k8s中Pod、ReplicaSet、Deployment、Service的区别


    Pod、ReplicaSet、Deployment、Service关系图

    Pod、ReplicaSet、Deployment、Service之间的关系如下图

    在这里插入图片描述

    在这里插入图片描述

    Pod:

    Pod是一个或多个容器的组合,这些容器共享存储、网络和命名空间,以及如何运行的规范。Pod是Kubernetes的最小可部署单元。Pod的中文译词是豌豆荚,docker容器就像是豆子运行在豌豆荚内。

    ReplicaSet:

    Replication Controller的作用是确保Pod以指定的副本个数运行。ReplicaSet是Replication Controller升级版。ReplicaSet和Replication Controller之间的唯一区别是对选择器支持。Replication Controller只支持基于等式的selector(env=dev或environment!=qa),但ReplicaSet还支持新的,基于集合的selector(version in (v1.0,v2.0)或env notin (dev, qa))。
    在yaml文件中通过spec.replicas声明pod的副本数。

    Deployment:

    Deployment用于管理Pod、ReplicaSet,可实现滚动升级和回滚应用、扩容和缩容。

    Service:

    试想一个问题,ReplicaSet定义了pod的数量是2,当一个pod由于某种原因停止了,ReplicaSet会新建一个pod,以确保运行中的pod数量始终是2。但每个pod都有自己的ip,前端请求不知道这个新pod的ip是什么,那前端的请求如何发送到新pod中呢?

    答案是使用Service
    k8s的Service定义了一个服务的访问入口地址,前端的应用通过这个入口地址访问其背后的一组由Pod副本组成的集群实例,来自外部的访问请求被负载均衡到后端的各个容器应用上。Service与其后端Pod副本集群之间则是通过Label Selector实现关联。
    请说人话:前端请求不是直接发送给Pod,而是发送到Service,Service再将请求转发给pod。

    总结

    Pod被ReplicaSet管理,ReplicaSet控制pod的数量;ReplicaSet被Deployment管理,Deployment控制pod应用的升级、回滚,当然也能控制pod的数量。Service提供一个统一固定入口,负责将前端请求转发给Pod。

    Deployment与service区别

    特性DeploymentStatefulSet
    是否暴露到外网YESNO
    请求面向的对象serviceName指定pod域名
    灵活性只能通过service/serviceIp访问到k8s自动转发的pod可以访问任意一个自定义的pod
    易用性只需要关心Service的信息即可需要知道要访问的pod启动的名称、headlessService名称
    PV/PVC绑定关系的稳定性(多replicas)(pod挂掉后重启)无法保证初始的绑定关系可以保证
    pod名称稳定性不稳定,因为是通过template创建,每次为了避免重复都会后缀一个随机数稳定,每次都一样
    启动顺序(多replicas)随机启动,如果pod宕掉重启,会自动分配一个node重新启动pod按 app-0、app-1…app-(n-1),如果pod宕掉重启,还会在之前的node上重新启动
    停止顺序(多replicas)随机停止倒序停止
    集群内部服务发现只能通过service访问到随机的pod可以打通pod之间的通信(主要是被发现)
    性能开销无需维护pod与node、pod与PVC 等关系比deployment类型需要维护额外的关系信息
    适用场景无状态有状态

    NodePort, ClusterIp, LoadBalancer区别

    ClusterIp: 此服务仅能在k8s集群内访问
    NodePort: 节点端口,可以让service接收来自k8s集群外的请求
    LoadBalancer:
    Port: k8s 集群内部访问service端口, 通过clusterip:port 请求某个service
    nodePort: 使用nodeIp:nodePort 从外部访问请求某个service
    targetPort:是pod的端口,从port和nodePort来的流量经过kube-proxy流入到后端pod的targetPort上,最后进入容器

    containerPort:是pod内部容器的端口,targetPort映射到containerPort
    在这里插入图片描述

    案例

    apiVersion: apps/v1
    # 声明一个Deployment资源对象
    kind: Deployment
    metadata:
      name: deployment-myapp
    spec:
    # 通过replicas声明pod个数是2  
      replicas: 2
    # 通过标签选择被控制的pod    
      selector:
        matchLabels:
          app: myapp
    # 在template中定义pod      
      template:
        metadata:
    # 给pod打上标签app=myapp    
          labels:
            app: myapp
        spec:
          containers:
    # 声明容器名称,注意不是pod名称,pod名称应该定义在metadata中
          - name: myapp
            image: ikubernetes/myapp:v1
            ports:
            - name: http
              containerPort: 80
    # 在一个yaml文件中通过---分割多个资源对象          
    ---
    apiVersion: v1
    # 声明一个Service资源对象
    kind: Service
    metadata:
      name: service-myapp
    spec:
    # service-myapp将选择标签包含app=myapp的pod
      selector:
        app: myapp
      ports:
      - name: http
    # Service监听端口  
        port: 80
    # 转发到后端Pod的端口号   
        targetPort: 80
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    K8s创建Service与创建Deployment

    参考样例
    创建Service, 配置myName-service.yaml:

    apiVersion: v1
    # 类型为Service
    kind: Service
    # 元数据
    metadata:
      # Service的名称
      name: myName
      # 标签key-value键值对
      labels:
        app: myName
    # 声明
    spec:
      # 端口
      ports:
        # Service在集群内部暴露的端口
      - port: 80
        # 内部端口映射到Pod暴露出的端口
        targetPort: 80
        # 端口名称(标识类型)
        name: http
        # 对外暴露的端口号。不指定,则随机生成
        nodePort: 30000
      # 选择器
      selector:
        # 指定label中app=myName的Pod都归属于当前Service
        app: myName
      # Service类型,NodePort类型可以对外暴露。
      # 不指定的话,则默认为ClusterIP,只能集群内部访问
      type: NodePort  
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    创建Deployment
    配置myName-deploy.yaml:

    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      labels:
        app: myName
      # 决定了Pod的显示名称
      name: myName
    spec:
      # 副本个数。若为3,k8s会保证pod个数为3个,少了就增加,多了就删除
      replicas: 1
      template:
        metadata:
          labels:
            # 标识Pod,在Service中的selector指定匹配label为app:myName
            app: myName
          name: myName
        spec:
          # Pod中包含的容器
          containers:
            # 项目容器
          - name: myName
            imagePullPolicy: IfNotPresent
            image: $image
            env:
            - name: PRODUCTION_NGINX
              value: "1"
            - name: PRODUCTION_SETTINGS
              value: "1"
            ports:
              # 容器暴露的端口
            - containerPort: 8000
              name: http-8000
            volumeMounts:
            - name: nginx-config
              mountPath: /mnt/nginx
            - name: static
              mountPath: /mnt/static
            # Nginx容器
          - name: nginx
            image: nginx:1.16
            ports:
            - containerPort: 80
              name: http
            volumeMounts:
            - name: nginx-config
              mountPath: /etc/nginx/conf.d
            - name: static
              mountPath: /usr/share/nginx/html
          volumes:
          - name: static
            emptyDir: {}
          - name: nginx-config
            emptyDir: {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    参考

    K8S-概念-service-deployment

    kubernetes Container、Pod、Replicaset、Service、Deployment、Lable、Statefulset关系和区别

  • 相关阅读:
    Dubbo的架构设计是怎样的?
    NC17383 A Simple Problem with Integers
    如何利用 promise 影响代码的执行顺序?
    用于一般光学系统的光栅元件
    手记系列之二 ----- 关于IDEA的一些使用方法经验
    【python因果推断库15】使用 sci-kit learn 模型进行回归断点分析
    20220625阶段总结
    mindspore1.5版本下能正常运行到了1.6‘_check_version.py’报错
    吃鸡游戏出现msvcp140.dll缺失的四个解决方法
    CSP-J/S第二轮认证注意事项
  • 原文地址:https://blog.csdn.net/pingyufeng/article/details/125828535