一、概述
如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个逻辑资源对象,它存在的价值与意义是什么? |