5. kubernetes pod控制器应用

5. kubernetes pod控制器应用

[TOC]

本文基于马哥的docker和k8s视频总结, 在此致谢马哥.

apiVersion: v1
kind: Pod
metadata:
    name: pod-demo
    namespace: default
    labels: # 直接在metadata中打标签
        app: myapp
        tier: frontend # 分层标签
    annotations: # 自定义的资源注解
        alexti/created-by: "cluster admin"
spec:
    containers: 
        - name: myapp # 创建的第一个容器的容器名
            image: nginx:1.14-alpine # 容器所使用的镜像
            ports: # 暴露端口
                - name: http
                    containerPort: 80
                - name: https
                    containerPort: 443
    - name:  busybox # 创建的第二个容器的容器名
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        command: # 修改容器启动时使用的默认命令
            - "/bin/sh"
            - "-c"
            - "sleep 3600"
    nodeSelector: # 选择安装在标签为diskytpe且值为ssd的node上, 需要先给节点打上标签
        disktype: ssd # 必须要装在有此标签的node上, 找不到此标签, pod会被pending

配置Pod资源中的spec内嵌字段

spec.containers <[]object>
    - name 
        image  # 指定特定路径中的镜像
        imagePullPolicy  
            # Always, Never, IfNotPresent, 此字段在对象创建后不可更改
            # Always: 就算本地有镜像, 也不用而是直接去下载, latest标签的镜像默认使用Always
            # Never: 本地有就用, 没有则不下载, 想用必须用户手动下载
            # IfNotPresent: 本地存在就用, 没有就去下载
        ports <[]object>
            # name 
            # containerPort  -required-
    args <[]object>
        # 如果自行手动指定了args参数, 则会覆盖镜像中CMD指定的内容
        # 特别注意变量引用使用的格式: $(VAR_NAME)
        # 如果一定要使用命令引用的方式: $$(VAR_NAME)
        command <[]object>
        # Entrypoint array. Not executed within a shell
        # 一旦定义了command, 镜像中的Cmd和Entrypoint都会失效
        # 如果只定义了args, 没定义command, 
        # 则会将args定义的值作为参数传递给镜像中的Entrypoint
        livenessProbe 
        readinessProbe 
            # exec
            # httpGet
            # tcpSocket
            # initialDelaySeconds  初始化之后延迟探测时间, 默认立刻探测
            # failureThreshold  探测几次失败, 才认为是失败的, 默认3次
            # periodSeconds  每次探测间隔, 默认10s
            # timeoutSeconds  每次探测无响应时等待时间, 默认1s
        lifecycle
            # postStart
            # preStop
                # exec
                # httpGet
                # tcpSocket
 
 
spec.nodeSelector 
    # 节点标签选择器
spec.nodeName 
    # 指定部署在哪个节点上
spec.restartPolice 
    # Always, OnFailure, Never. Default to Always
    # Always 一旦容器挂了, 就会重启
    # OnFailure 只有状态为Failure时才重启, 正常终止时不会重启
    # Never 从不重启
metadata.annotations
    # 与label不同的是, 它不能用于挑选资源对象, 仅用于为对象提供"元数据"
  • args和command区别示例:
args和command区别示例.png

标签

标签与对象是多对多的关系(一个标签可以贴多个对象, 一个对象也可以被贴多个标签)

  • key=value
    • key和value字符长度都要小于等于63
    • key不可为空, value可为空
# 显示标签为app的那类pod
kubectl get pods -l app [--show-labels]
kubectl get pods -l app=myapp,tire!=frontend
kubectl get pods -l "release notin (canary,beta,alpha)"

# 显示标签以及标签值
kubectl get pods -L app,run

# 打标签, 已有标签时会报错, 除非使用--overwrite
kubectl label pods pod-demo release=canary
kubectl get pods -l app [--show-labels]

标签选择器

  • 等值关系: =, ==, !=
  • 集合关系:
    • KEY in|notin (VALUE1, VALUE2, ...)
    • !KEY : 不存在此键的资源

许多资源支持内嵌字段定义其使用的标签选择器:

matchLabels: # 直接给定键值
matchExpressions: # 基于给定的表达式来定义使用的标签选择器, 
    # {key:"KEY", operator:"OPERATOR", values:[VAL1,VAL2,...]}
    # 操作符: In, NotIn  values字段的值必须为非空列表
    #            Exists, NotExists  values字段的值必须为空列表

Pod的生命周期

  • 状态: Pending (挂起), Running(运行), Failed, Succeeded, Unknown
  • Pod生命周期中的重要行为:
    • 初始化容器
    • 容器探测:
      • 存活性探测 liveness
      • 就绪性探测 readiness
Pod的生命周期.png

探针类型

  • (1) ExecAction
  • (2) TCPSocketAction
  • (3) HTTPGetAction

livenessreadiness

对于容器来讲一般要做存活性探测和就绪性探测 !

exec

apiVersion: v1
kind: Pod
metadata:
    name: liveness-exec-pod
    namespace: default
spec:
    containers:
        - name: liveness-exec-container
            image: busybox:latest
            command:
                - "/bin/sh"
                - "-c"
                - "touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 3600"
            livenessProbe:
                exec:
                    command: 
                        - "test -e /tmp/healthy"
                initialDelaySeconds: 1
                periodSeconds: 3
    restartPolicy: OnFailure

httpGet

apiVersion: v1
kind: Pod
metadata:
    name: readiness-httpget-pod
    namespace: default
spec:
    containers:
        - name: readiness-httpget-container
            image: nginx:1.14-alpine
            ports: 
                name: http
                containerPort: 80
            livenessProbe:
                httpGet: 
                    port: http # 可以直接根据ports的name进行指定, 也可以直接设置为80
                    path: /index.html # 指定请求内容
                initialDelaySeconds: 1
                periodSeconds: 3
            readinessProbe:
                httpGet:
                    port: http
                    path: /index.html
                initialDelaySeconds: 1
                periodSeconds: 3
    restartPolicy: OnFailure

postStartpreStop

  • 特别要注意postStartcommandcontainerscommand执行的先后顺序 !!!
    • containers内的command先执行, postStartcommand后执行!
apiVersion: v1
kind: Pod
metadata:
    name: poststart-pod
    namespace: default
spec:
    containers:
    - name: busybox-httpd
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        lifecycle:
            postStart:
                exec:
                    command: 
                    - "/bin/sh"
                    - "-c"
                    - "mkdir -p /data/web/html/"
        command: 
        - "/bin/sh"
        - "-c"
        args:
        - "sleep 3600"
# 如果去掉上面代码块中的第15,16两行, 创建pod然后连入pod中的容器查看进程,
# 会发现PID为1的进程会有一开始设置的/bin/sh替换为sleep 3600, 所以后面
# exec中的command指定的命令会有报错.
kubectl create -f /tmp/poststart-pod.yml
kubectl exec poststart-pod -c busybox-httpd -it -- /bin/sh
/ # ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 sleep 3600
   11 root      0:00 /bin/sh
   17 root      0:00 ps -ef

你可能感兴趣的:(5. kubernetes pod控制器应用)