一 Pod的概念
(1)pod和容器的关系
pod和容器'containers'的关系 --> '一个pod至少包含两个容器'-->'一个pause容器,一个业务容器'
Pod:Kubernetes部署和管理的最小单位,也是'最小的调度单位'
(2)pause容器
Pause容器的'作用' --> 所有的'业务容器''共享'pause的'网络命名空间和数据卷'
pause:沙盒容器,它永远是pod中'第一个被创建'的容器,其它定义的容器都是通过'join network namespace'的方式,与infra容器'关联'在一起的
1)所有的业务容器-->'网络模式类似Docker container模式'-->'同一个pod内容器共享同一个网络栈(命名空间)' -->'共享ip和port'
效果1:一个POD里的容器都可以通过'localhost'访问
效果2:'流量进出'都是通过infra容器
2)Pod中的所有容器都可以'访问共享的volume'
所以:pause总是先启动,自然'网络和数据卷会先创建' --> '因为要为其它业务容器提供'
############### '原理' ###############
每当'一个Pod被创建',那么首先创建一个 'pause' 容器,之后这个pod里面的其他容器通过'共享'这个pause容器的网络栈,实现与外部pod'进行通信',然后通过'localhost'进行pod内部的'container的通信'
(3)Kubernetes为什么让一个POD里放置多个容器
Docker的理念:'一个容器一个进程'
为什么:KUbernetes设计出一个'全新的Pod概念',并且Pod有这样'特殊的组成结构'?
1) 引入'业务无关且不易死亡'的Pause容器作为'Pod的根容器',通过pasue状态代表'整个容器的状态',作为pod是否'健康的标准'
2) Pod里多个业务容器共享Pause的IP和Port,共享Pause容器挂接的Volume,简化了'紧密关联'的业务容器之间的'通信问'题,很好的解决容器间'文件共享'
******************* 'pod多容器的劣势' *******************
违反'一个容器一个进程'的原则
因为同一个容器中有'多个进程',系统将很难排错,因为来自不同进程的'日志'将'被混合在一起',很难管理进程的'生命周期'
二 Pod定义详解
说明:'Deployment、DaemonSet、StatefulSet'都是基于'pod',所以必须详细了解pod的'配置文件'
1)Pod属于'namespace'级别的资源
2)从Pod的配置文件引出一些'核心的概念'-->'Annoations等'
3)pod是k8s'最小的调度单位'
(1)常见的
apiVersion: v1 --YAML描述文件'所使用的Kubernetes API版本'-->kubectl explain pods -->'不同版本可能不一样'
kind: Pod --Kubernetes '对象资源'
metadata: --pod'元数据'(名称、标签和注解)
labels:
run: httpd --'pod的自定义标签,方便标签选择器进行选择'
name: httpd-gv4bl --'pod的名字'-->'后续贴出规范'
namespace: default --'pod所处的命名空间'
spec: --'pod中容器的详细定义' --> '规格/内容(pod的容器列表、volume)'
containers:
- image: httpd -- '容器的镜像名称' -->'仓库:标签'
imagePullPolicy: Always -- '镜像的拉取策略'
name: httpd -- '容器的镜像名称'
ports: -- '容器暴露的端口列表'
- containerPort: 80 -- '容器需要监听的端口号'
protocol: TCP -- '端口协议,默认是TCP'
resources: {} -- '资源限制和资源请求-->后续讲解'
dnsPolicy: ClusterFirst -- 'DNS策略' --> '后续自定义DNS引入kubernetes'
nodeName: minikube -- '定向调度-->非必须'
restartPolicy: Always -- 'pod的重启策略'
securityContext: {} -- '安全上下文'
serviceAccount: default -- '用户身份'
(2)网络
(3)存储
(3)安全
(4)账户
(5)健康检查