Infrastructure Container:基础容器
• 维护整个Pod网络空间
• InitContainers:初始化容器
• 先于业务容器开始执行
• Containers:业务容器
• 并行启动
官方文档网址:https://kubernetes.io/docs/concepts/containers/images/
IfNotPresent:默认值,镜像在宿主机上不存在时才拉取
• Always:每次创建 Pod 都会重新拉取一次镜像
• Never: Pod 永远不会主动拉取这个镜像
重启逻辑:每次重启会有等待时间,最长为300s
当你的pod调度在某个node节点上的时候,容器重启只会帮你重新拉起来,并不会更换节点,除非你删除pod,他会按照调度分配来帮你重新拉起一个pod
当结束一个pod的时候,会像pod中的所有容器发送关闭信号,给一个时间限制,在xx时间内平滑的关闭,如果时间到了没关,会强制关闭,以防止数据丢失,默认30s,可以自己指定
• Always:当容器终止退出后,总是重启容器,默认策略。
• OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
• Never:当容器终止退出,从不重启容器。
创建pod
初始化容器
容器探测
Liveness probe
Readines probe
Init初始化前的准备
Post start启动后钩子
Post stop结束前钩子
Liveness probe存活状态检测 判定主容器是否处于运行状态
Readines probe就绪状态检测 判定主容器中的主进程是否准备就绪并可以对外提供服务
Liveness probe如果出问题要受控于Readines probe来决定是否重启
容器如果Running 存活探测是成功的,容器存活并不一定可以对外提供服务,docker如果容器不提供的话容器就结束了,而k8s中一个pod中可以有多个容器,一个容器死亡,并不会让pod死亡,Liveness probe和Readines probe都有三种方式
在容器启动前做一些操作lifecycle(钩子)包括poststart和poststop,也支持ExecAction、TCPSocketAction、HTTPGetAction,极少情况会用到,下面的command(有红框的)优先级要比exec下方的command优先级高,也就意味之先执行带红框的command,后执行exec下面的command,
官网为:https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/
• nodeName用于将Pod调度到指定的Node名称上
nodeName: 192.168.31.65
• nodeSelector用于将Pod调度到匹配Label的Node上
nodeSelector:
env_role: dev
Api server负责总调度,scheduler负责调度分配新的pod在那个节点上创建(有资源的节点),然后api server写入etcd中,并且把表交给kubelet来做pod的创建,调用docker来镜像拉取,容器的创建
官方文档地址:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/
kubectl describe TYPE/NAME
kubectl logs TYPE/NAME [-c CONTAINER]
kubectl exec POD [-c CONTAINER] – COMMAND [args…]
出现问题别慌张,可以根据他发生的事件以及日志或者进去容器查看,来迅速锁定原因并解决
大部分资源的配置清单:
apiVersion: apps/v1 group/version
$ kubectl api-versions
kind:资源类别
metadata:元数据
name
namespace
labels
annotaions
spec:期望的状态 disired state
status:当前状态 current state,这个字段由kuernetes集群维护
也可以protocol定义tcp或者udp
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: default #指定命名空间
labels:
app: nginx #控制器的标签
spec: #控制器期望的状态
replicas: 1 #指定副本个数
selector: #标签选择器
matchLabels: #逻辑域(可以写多个标签)
app: nginx
template: #pod模板定义
metadata: #pod的元数据
labels: #pod标签一定符合标签选择器,至少符合标签选择器的一个
app: nginx
spec: #pod的期望的状态
nodeName: k8s-node1 #指定分配节点
containers: #列表所以下面会有-
- name: nginx-deployment #镜像
image: nginx:1.15
imagePullPolicy: Always #拉取镜像策略
livenessProbe: #Http探测
httpGet:
path: index.html
port: 80
httpHeaders:
- name: Custom-Header
value: Awesome
initialDelaySeconds: 60
periodSeconds: 3
resources: #限制策略
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 80
restartPolicy: Always #重启策略
官网文档:https://kubernetes.io/docs/tasks/inject-data-application/
如果在dockerfile中既有Entrypoint又有Cmd,那么cmd将作为Entrypoint命令中的参数运行
1.如果你的k8s 的yaml文件中没有command和args的情况下默认使用dockerfile的Entrypoint和Cmd,当然如果镜像中只有cmd,那么就按照cmd的命令来执行,如果两者都有那么cmd将作为参数传入Entrypoint中
2如果k8s的yaml文件中只提供了args,那么如果dockerfile中有Entrypoint,args将作为参数,传入Entrypoint,cmd将被忽略。如果dockerfile中没有Entrypoint,那么将执行args
3.如果既有command又有args,那么args将作为command的参数来运行
4.如果只有command,那么dockerfile的所有将被忽略,之运行command
例如image表示镜像 container表示容器 not set 表示没有