Kubernetes—Pod对象

1. Pod容器分类

Infrastructure Container:基础容器
• 维护整个Pod网络空间
• InitContainers:初始化容器
• 先于业务容器开始执行
• Containers:业务容器
• 并行启动

2. 镜像拉取策略

官方文档网址:https://kubernetes.io/docs/concepts/containers/images/
IfNotPresent:默认值,镜像在宿主机上不存在时才拉取

• Always:每次创建 Pod 都会重新拉取一次镜像
• Never: Pod 永远不会主动拉取这个镜像

3. 重启策略

重启逻辑:每次重启会有等待时间,最长为300s
当你的pod调度在某个node节点上的时候,容器重启只会帮你重新拉起来,并不会更换节点,除非你删除pod,他会按照调度分配来帮你重新拉起一个pod
当结束一个pod的时候,会像pod中的所有容器发送关闭信号,给一个时间限制,在xx时间内平滑的关闭,如果时间到了没关,会强制关闭,以防止数据丢失,默认30s,可以自己指定

• Always:当容器终止退出后,总是重启容器,默认策略。
• OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
• Never:当容器终止退出,从不重启容器。

4.POD生命周期

Kubernetes—Pod对象_第1张图片

创建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都有三种方式

Kubernetes—Pod对象_第2张图片
在容器启动前做一些操作lifecycle(钩子)包括poststart和poststop,也支持ExecAction、TCPSocketAction、HTTPGetAction,极少情况会用到,下面的command(有红框的)优先级要比exec下方的command优先级高,也就意味之先执行带红框的command,后执行exec下面的command,
官网为:https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/

5. 调度约束

• nodeName用于将Pod调度到指定的Node名称上
nodeName: 192.168.31.65
• nodeSelector用于将Pod调度到匹配Label的Node上
nodeSelector:
env_role: dev
Kubernetes—Pod对象_第3张图片
Api server负责总调度,scheduler负责调度分配新的pod在那个节点上创建(有资源的节点),然后api server写入etcd中,并且把表交给kubelet来做pod的创建,调用docker来镜像拉取,容器的创建

6. 故障排查

官方文档地址:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/

Kubernetes—Pod对象_第4张图片

kubectl describe TYPE/NAME
kubectl logs TYPE/NAME [-c CONTAINER]
kubectl exec POD [-c CONTAINER] – COMMAND [args…]
出现问题别慌张,可以根据他发生的事件以及日志或者进去容器查看,来迅速锁定原因并解决

7.YAML文件范本

大部分资源的配置清单:
apiVersion: apps/v1 group/version
$ kubectl api-versions
kind:资源类别
metadata:元数据
name
namespace
labels
annotaions
spec:期望的状态 disired state
status:当前状态 current state,这个字段由kuernetes集群维护
Kubernetes—Pod对象_第5张图片

也可以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              #重启策略

9.command和args比较

官网文档: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 表示没有
Kubernetes—Pod对象_第6张图片

你可能感兴趣的:(kubernetes,pod,deploy)