kubernetes 自主式Pod

作者: baiyongjie | 来源:发表于2019-01-21 23:12 被阅读2次

    pod资源

    Pod资源:
    spec.containers <[]object>
    
    - name <string>
      image <string>
    

    port

    # 仅仅是信息, 提示容器的暴露端口
      ports:
      - name: http
        protocol: TCP
        containerPort: 80
      - name: https
        protocol: TCP
        containerPort: 443
    

    imagePullPolicy

      imagePullPolicy <string>
        Always(总是下载,从仓库下载,不管本地是否存在)
        Never(从不下载,如果有就用,没有也不去下载)
        IfNotPresent(存在就使用,不存在就去下载)
        如果镜像标签是latest,那么默认就是Always
        如果不是latest,那么默认值是IfNotPresent
    

    command & args

    https://kubernetes.io/docs/tasks/inject-data-application/define-command-argument-container/

    Entrypoint:
    Image中运行程序的命令
    
    Cmd:
    Image中运行程序的命令中的参数
    
    command:
    Pod中运行程序的命令
    
    args:
    Pod中运行程序的命令中的参数
    
    描述 Docker file kubernetes
    command Entrypoint command
    arguments Cmd args
    • 如果既不提供command也不提供args,那么就是使用镜像中的Entrypoint和Cmd
    • 如果只定义了command,没定义args,那么只运行command
    • 如果只定义了args,没定义command,那么使用镜像中的Entrypoint当做命令,使用args作为参数,cmd无效
    • 如果定义了command和args,那么忽略镜像中的Entrypoint和Cmd
    Images Entrypoint Image Cmd Container command Container args Command run
    [/ep-1] [for bar] <not set> <not set> [ep-1 foo bar]
    [/ep-1] [for bar] [/ep-2] <not set> [ep-2]
    [/ep-1] [for bar] <not set> [zoo boo] [ep-1 zoo boo]
    [/ep-1] [for bar] [/ep-2] [zoo boo] [ep-2 zoo boo]

    labels

    每个Pod可以有多个标签
    每个标签也可以附加到多个Pod
    
    标签:
      key=value
        key: 字母、数字、_、-、.
        value:可以为空,只能字母或数字开头及结尾,中间可使用
        
    标签选择器:
      等值关系:=,==,!=
      集合关系:
        KEY in (VALUE1,VALUE2,...)
        KEY notin (VALUE1,VALUE2,...)
        KEY
        !KEY
        
      许多资源支持内嵌字段定义其使用的标签选择器:
        matchLabels:直接给定键值
        matchExpressions:基于给定的表达式来定义使用标签选择器,{key:"KEY", operator:"OPERATOR",values:[VAL1,VAL2,...]}
          操作符:
            In, NotIn:values字段的值必须为非空列表;
            Exists, NotExists:values字段的值必须为空列表
    
      nodeSelector <map[string]string> (容器的属性)
          节点标签选择器,
        spec:
          container:
            name: ...
            image: ...
            ....
          nodeSelector:
            disktype: ssd
            
      nodeName <string>
      
      annotations:
          与label不同的地方在于,它不能用于挑选资源对象,仅用于为对象提供“元数据”。
    
    

    labels常用命令

    # 查看所有标签
    [root@kubeadm-mater01 test]# kubectl get pods --show-labels
    NAME                    READY   STATUS    RESTARTS   AGE    LABELS
    curl-66959f6557-2tm4b   1/1     Running   2          7d2h   pod-template-hash=66959f6557,run=curl
    pod-demo               2/2     Running   1          79m    app=myapp,tier=frontend
    
    # 查看只有app标签的pod(标签过滤)
    [root@kubeadm-mater01 test]# kubectl get pods -l app
    NAME        READY   STATUS    RESTARTS   AGE
    pod-demo   2/2     Running   1          82m
    
    [root@kubeadm-mater01 test]# kubectl get pods -l app --show-labels
    NAME        READY   STATUS    RESTARTS   AGE   LABELS
    pod-demo   2/2     Running   1          82m   app=myapp,tier=frontend
    
    # 显示多个标签的标签值
    [root@kubeadm-mater01 test]# kubectl get pods -L app,run
    NAME                    READY   STATUS    RESTARTS   AGE    APP     RUN
    curl-66959f6557-2tm4b   1/1     Running   2          7d2h           curl
    pod-demo               2/2     Running   1          83m    myapp   
    
    # 给资源对象打标签
    [root@kubeadm-mater01 test]# kubectl label pods pod-demo release=canary
    pod/pod-demo labeled
    
    [root@kubeadm-mater01 test]# kubectl get pods pod-demo --show-labels
    NAME        READY   STATUS    RESTARTS   AGE   LABELS
    pod-demo   2/2     Running   1          86m   app=myapp,release=canary,tier=frontend
    
    # 修改标签
    [root@kubeadm-mater01 test]# kubectl label pods pod-demo release=stable --overwrite
    pod/pod-demo labeled
    
    [root@kubeadm-mater01 test]# kubectl get pods -l app --show-labels  
    NAME       READY   STATUS    RESTARTS   AGE   LABELS
    pod-demo   2/2     Running   0          43s   app=myapp,release=stable,tier=frontend
    
    #集合选择
    ## KEY in ()
    [root@kubeadm-mater01 test]# kubectl get pods -l 'release in (canary,stable)'
    NAME       READY   STATUS    RESTARTS   AGE
    pod-demo   2/2     Running   0          20m
    
    ## KEY notin ()
    [root@kubeadm-mater01 test]# kubectl get pods -l 'release notin (canary,stable)'
    NAME                    READY   STATUS    RESTARTS   AGE
    curl-66959f6557-2tm4b   1/1     Running   2          7d3h
    
    # 查看node节点标签
    [root@kubeadm-mater01 test]# kubectl get nodes --show-labels 
    NAME              STATUS   ROLES    AGE    VERSION   LABELS
    kubeadm-mater01   Ready    master   7d3h   v1.13.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=kubeadm-mater01,node-role.kubernetes.io/master=
    kubeadm-node01    Ready    <none>   7d2h   v1.13.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=kubeadm-node01
    
    # 给node节点打标签
    [root@kubeadm-mater01 test]# kubectl label nodes kubeadm-node01 disktype=ssd
    node/kubeadm-node01 labeled
    
    [root@kubeadm-mater01 test]# kubectl get nodes --show-labels                             
    NAME              STATUS   ROLES    AGE    VERSION   LABELS
    kubeadm-mater01   Ready    master   7d3h   v1.13.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/hostname=kubeadm-mater01,node-role.kubernetes.io/master=
    kubeadm-node01    Ready    <none>   7d2h   v1.13.1   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,disktype=ssd,kubernetes.io/hostname=kubeadm-node01
    

    Pod生命周期

    • 状态
      • Pending: 挂起,调度未完成: 已经创建, 但是没有适合运行的节点
      • Running: 运行状态
      • Failed: 失败
      • Succeeded: 成功
      • Unknown: 未知状态
    • 创建过程
      • 初始化容器
      • 容器探测
        • livenessProbe: 用于判断容器是否存活,即Pod是否为running状态,如果LivenessProbe探针探测到容器不健康,则kubelet将kill掉容器,并根据容器的重启策略是否重启,如果一个容器不包含LivenessProbe探针,则Kubelet认为容器的LivenessProbe探针的返回值永远成功。
        • readinessProbe: 用于判断容器是否启动完成,即容器的Ready是否为True,可以接收请求,如果ReadinessProbe探测失败,则容器的Ready将为False,控制器将此Pod的Endpoint从对应的service的Endpoint列表中移除,从此不再将任何请求调度此Pod上,直到下次探测成功
      • 支持的探测方法
        • exec:通过执行命令来检查服务是否正常,针对复杂检测或无HTTP接口的服务,命令返回值为0则表示容器健康。
        • httpGet:通过发送http请求检查服务是否正常,返回200-399状态码则表明容器健康。
        • tcpSocket:通过容器的IP和Port执行TCP检查,如果能够建立TCP连接,则表明容器健康。
        • failureThreshold: 失败x次后才认为失败, 默认是三次
        • initialDelaySeconds: 重启初始化时间, 默认是30秒, 30秒后开始探测
        • periodSeconds: 多久探测一次,
        • successThreshold: 成功几次认为程序就已经成功了
      • 探测的结果
        • Success:Container通过了检查。
        • Failure:Container未通过检查。
        • Unknown:未能执行检查,因此不采取任何措施。
    • restartPolicy: 重启策略
      • Always: 总是重启(默认)
      • OnFailure: 只有状态为错误是才重启
      • Never: 从不重启

    livenessProbe实例

    apiVersion: v1
    kind: Pod
    metadata:
      name: liveness-exec-pod
      namespace: default
    spec:
      containers:
      - name: liveness-exec-container
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        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
    

    readinessProbe实例

    apiVersion: v1
    kind: Pod
    metadata:
      name: readiness-httpget-pod
      namespace: default
    spec:
      containers:
      - name: readiness-httpget-container
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
        readinessProbe:
          httpGet:
            port: http
            path: /index.html
          initialDelaySeconds: 1
          periodSeconds: 3
    

    相关文章

      网友评论

        本文标题:kubernetes 自主式Pod

        本文链接:https://www.haomeiwen.com/subject/kukkjqtx.html