一、概述
如droplet之于CloudFoundry,docker容器之于docker-compose,在kubernetes的狭义paas实现中,容器组(POD)是业务逻辑落地的载体。
容器组实现了对应用主程序、初始化处理以及辅助能力的逻辑抽象。
二、容器组的定义
如前文所述,下图为一个典型容器组结构:
在容器组中,各容器角色各司其职:
1、pause容器持有该容器组网络命名空间
2、init容器进行前置准备工作,如准备容器运行中依赖的数据包,安装主进程依赖的工具套件
3、main容器处理主业务逻辑,比如响应外部web请求
4、sidecar容器提供支撑服务,比如采集容器运行日志
上述结构的一个容器组定义范例如下:
apiVersion: v1                
kind: Pod                
metadata:               
  name: string             #必选,Pod名称       
  namespace: string       
  labels:             
    - name: string       
  annotations:          
    - name: string
spec:                
  containers:             #必选,Pod中容器列表
  - name: init              #可选,容器组急先锋
    ....
  - name: sidecar           #可选,容器勤务组
    ....
  - name: main
    image: string         #必选,容器的镜像名称
    imagePullPolicy: [Always | Never | IfNotPresent]  
    command: [string]       #容器的启动命令列表
    args: [string]        
    workingDir: string    
    volumeMounts:         #挂载到容器内部的存储卷配置
    - name: string         
      mountPath: string   
      readOnly: boolean  
    ports:               #需要暴露的端口号列表
    - name: string         
      containerPort: int    
      hostPort: int       
      protocol: string      
    env:                
    - name: string       
      value: string      
    resources:            #资源限制和请求的设置
      limits:            
        cpu: string      
        memory: string
      requests:          
       ...
    readnessProbe:          #可读探针,检测失败则将容器从服务摘除
      ...
    livenessProbe:         #存活探针,检测失败重启
      ...
      httpGet:            
        ...
      tcpSocket:       
         ...
      exec:              #对Pod容器内检查方式设置为exec方式
        command: [string] 
    restartPolicy: [Always | Never | OnFailure] #重启策略
    nodeSelector: obeject
    imagePullSecrets:        
    - name: string
    hostNetwork: false     
    volumes:             #定义共享存储卷列表
    - name: string          
      emptyDir: {}          
      hostPath: string        
        path: string        
      secret:           #使用类型为secret的存储卷
        ...
      configMap:         #使用类型为configMap的存储卷
        name: string
        items:
        - key: string
          path: string    
三、容器组的实现
1、容器组的隔离与共享
在kubernetes中,容器组代表了一个紧密协作的业务程序集及其上下文,是namespace技术落地实践之一:

通常情况下:
a)相同容器组不同容器共享了相同的net、uts以及ipc命名空间
b)相同容器组不同容器独占了不同的pid、mnt命名空间
2、容器组在kubernetes的位置以及与其他资源关系
毋庸置疑,容器组作为业务逻辑的载体在kubernenetes中是C位大咖。
狭义paas的实现围绕容器组展开实现:

容器组与周边资源典型关系如下:
1、容器组使用configmap获取配应用配置
2、容器组使用pvc挂载外部存储
3、容器组使用secret获取加密信息
4、容器组受DaemonSet控制,保障单节点单容器组的部署
5、容器组受StatefulSet控制,实现有状态应用的部署
6、容器组受RelicaSet控制,实现固定数量的容器组保障
7、容器组绑定Node后,将由Node上kubelet负责拉起
最后抛出1个讨论题,欢迎交流。
| 讨论:容器组作为1个逻辑资源对象,它存在的价值与意义是什么? |