• Kubernetes ---- 资源配置清单格式及Label标签、标签选择器、Pod生命周期、Pod存活性探测及就绪型探测


     

    大部分资源的配置清单:

      apiVersion: group/version

      # 查看所支持的版本.
      $ kubectl api-versions

      kind: 资源类别(Pod,ReplicaSet,Deployment,StatefulSet,DaemonSet,Job,Cronjob,Service....)

      metadata: 元数据
        name(同一类别中名称要唯一,不同的namespace中name可以重名)
        namespace
        labels: 标签,方便控制器及Service进行管理.
        annotations: 资源注解

    每个的资源的引用PATH:
      /api/v1/namespaces/default/pods/client
      /组名/版本/名称空间/default的名称空间/pods(资源类型)/资源名称 

      spec: 定义目标期望的状态,让当前状态像期望状态靠近(副本数量)

      status: 当前状态,本字段由kubernetes集群维护,用户无法删除定义.

      # 查看Pod的定义规范
      $ kubectl explain pod
    
      # 二级字段查询定义规范(查询Pod下的metadata如何定义)
      $ kubectl explain pod.metadata
    
      # 查看spec如何定义
      $ kubectl explain pod.spec

    Pod资源:

      spec.containers []<object>

        - name <string>
        image <string>
        imagePullPolicy <string> # 镜像获取策略(Always, Never, IfNotPresent(如果本地不存在就去下载))

     

      如果要覆盖默认的 Entrypoint 与 Cmd,需要遵循如下规则:
      1. 如果在容器配置中没有设置command或者args那么将使用Docker镜像自带的命令及其入参。
      2. 如果在容器配置中只设置了command但是没有设置args那么容器启动时只会执行该命令,Docker 镜像中自带的命令及其入参会被忽略。
      3. 如果在容器配置中只设置了args那么Docker镜像中自带的命令会使用该新入参作为其执行时的入参。
      4. 如果在容器配置中同时设置了command与args,那么Docker镜像中自带的命令及其入参会被忽略。容器启动时只会执行配置中设置的命令,并使用配置中设置的入参作为命令的入参。
      帮助来源:https://kubernetes.io/zh/docs/tasks/inject-data-application/define-command-argument-container/
      args <[]string>

      command <[]string>

      标签
      # 键值对儿的长度不能超过63个字符
      key = value
      key: 字母、数字、_、-、.
      value: 可以为空,只能以字母或数字开头及结尾,中间可用字母、数字、_、-、.

    # 显示pod中标签为app的pod
    $ kubectl get pods -l app --show-labels
    
    # 另外一种绝对性查询,key=value
    等值关系: =、==、!=
    $ kubectl get pods -l app[=|==|!=]myapp --show-labels
    
    # 集合关系: KEY in (VALUE1,VALUE2...)
    KEY not in (VALUE1,VALUE2...)
    KEY
    !KEY
    $ kubectl get pods -l "release in (canary,beta,alpha)"
    $ kubectl get pods -l "release notin (canary,beta,alpha)"
    
    # 给资源对象增加标签
    $ kubectl label pod pod-demo release=canary
    
    # 修改资源对象的标签
    $ kubectl label pod pod-demo release=stable --overwrite
    
    # 删除资源对象的标签
    $ kubectl label pod pod-demo release-

    许多资源支持内嵌字段定义其使用的标签选择器:
      matchLabels: 直接给定键值(Service只能用这种)
      matchExpressions:基于给定的表达式来定义使用的标签选择器,{key:"KEY",operator:"OPERATOR",values:[VALUE1,VALUE2,VALUE3...]},键与值使用operator定义的格式符进行比较
        操作符(operator):
          In, NotIn: values字段的值必须为非空列表;
          Exists, NotExists: values字段的值必须为空列表;


      pod.spec.nodeSelector <map[string]string>
      节点标签选择器: 指定Pod运行在哪类节点上(给节点打上标签)

    # 给节点增加标签
    $ kubectl label node node1 disktype=ssd
    $ vim pod-demo.yaml
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod-demo
        namespace: default
        labels:
          app: myapp
          tier: frontend
      spec:
        containers:
        - name: myapp
         image: ikubernetes/myapp:v1
         ports:
         - name: http
         containerPort: 80
         - name: busybox
          image: busybox:latest
          imagePullPolicy: IfNotPresent
          command:
          - "/bin/sh"
          - "-c"
          - "sleep 3600"
    # 这里定义了标签,那么Pod只会运行到node1节点上,因为只有node1节点有"disktype=ssd"标签
    nodeSelector:
    disktype: ssd


    pod.spec.nodeName <string>

    pod.metadata.annotations:
      与label不同的是,不能用于挑选资源对象,仅用于为对象提供"元数据";
      metadata:
      annotations:
        kaikai.com/created-by: "cluster admin"

    Pod的生命周期:

      1. 初始化容器完成初始化,线性完成;
      2. 主容器启动时候,可以做启动后钩子;
      3. 主容器结束前,可以做结束前钩子;
      4. 可在容器运行过程中做容器探测(liveness probe和readiness probe)支持三中探测行为(1.执行自定义命令;2.像指定的tcp套接字发请求;3.像指定的http服务发请求)

    Pod探测:    

        livenessProbe(存活性探测): 探测主容器是否处于运行状态;
        readinessProbe(就绪型探测): 用于判定容器中的主进程是否已经就绪,并可以对外提供服务;

    livenessProbe探测中的ExecAction(自定义命令探测):
    apiversion: v1
    kind: Pod
    metadata:
      name: liveness-exec
      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

    #注释:
      livenessProbe: 对Pod做存活性检测;
      exec: 使用存活性检测方法中的ExecAction(自定义命令检测)方法进行检测;
      command: 使用哪个命令;
      initialDelaySeconds: 当Pod启动1秒后进行检测;
      periodSeconds: 执行探测的频率。默认是10秒,此处设为3秒;

    $ kubectl describe pod liveness-exec (由于没有做重启策略,所以会不断的重启Pod,Last State的状态还是Terminated,所以Pod有问题,检测验证成功)
    livenessProbe探测中的HTTPGetAction(像指定的http服务发请求探测):
    apiVersion: v1
    kind: Pod
    metadata:
      name: liveness-httpget-pod
      namespace: default
    spec:
      containers:
      - name: liveness-httpget-container
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
           containerPort: 80
        livenessProbe:
          httpGet:
            port: 80
            path: /index.html
          initialDelaySeconds: 1
          periodSeconds: 3
    #注释:
      livenessProbe: 对Pod进行存活性探测
      httpGet:采用HttpGetAction方法探测
      port: 要探测Pod的哪个端口
    path: 请求的URL路径

    $ kubectl create -f liveness-httpget.yaml
    $ kubectl describe pod liveness-httpget-pod(如下图,没有发现问题)
    
    

    # 创建问题,发现是否会产生异常

    $ kubectl exec -it liveness-httpget-pod -- /bin/sh

    / # rm /usr/share/nginx/html/index.html

    键盘同时按住Ctrl + P + Q 不终止容器运行退出容器

    $ kubecget describe pod liveness-httpget-pod (会发现已经出现了异常)

    readinessProbe(就绪型探测)中的HTTPGetAction(像指定的http服务发请求探测):其他探测方法类似此httpGet方法!

    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: 80
    path: /index.html
    initialDelaySeconds: 1
    periodSeconds: 3
    #注释:
      readinessProbe: 使用就绪型探测
      httpGet: 就绪型探测中的HTTPGet方法

    # 此时查看Pod状态为Running状态,且已经就绪,(READY字段下的第一个1代表已就绪,后边儿的1代表几个容器)
    $ kubectl get pods
    NAME                            READY   STATUS             RESTARTS   AGE
    readiness-httpget-pod           1/1     Running            0          10s

    # 制造问题,验证探测是否有效
    $ kubectl exec -it readiness-httpget-pod -- /bin/sh
    / # rm /usr/share/nginx/html/index.html
    Ctrl+P+Q不中断容器退出
    # 再次查询Pod的状态,发现已经左侧1已经变为0,说明容器此时未就绪;
    $ kubectl get pods
    NAME                            READY   STATUS             RESTARTS   AGE
    readiness-httpget-pod           0/1     Running            0          32s
    # 查看详细信息
    $ kubectl describe pod readiness-httpget-pod (ready状态为False,且日志为404;)

     # 解决此问题

     $ kubectl exec -it readiness-httpget-pod -- /bin/sh

     / # echo "hi" >> /usr/share/nginx/html/index.html

     $ kubecget get pods (会发现状态还原了)

      NAME                            READY   STATUS             RESTARTS   AGE

      readiness-httpget-pod           1/1     Running            0          14m

    Pod启动后操作:

      pod.spec.containers.lifecycle.postStart <Object>

    apiVersion: v1
    kind: Pod
    metadata:
      name: poststart-pod
      namespace: default
    spec:
      containers:
      - name: busybox-httpd
         image: busybox:latest
         imagePullPolicy: IfNotPresent
         lifecycle:
           postStart:
             exec:
               command: ['mkdir','-p','/data/web/html']
           command: ['/bin/sh','-c','sleep 3600']
    # 注释:
      lifecycle: 生命周期(包含了postStart(容器启动后操作)和preStop(容器停止前操作).)
      postStart: 容器启动后操作
    exec: 当容器启动后,要执行的命令
    command: 具体shell
    最下面的command: 是容器的命令
    注意:postStart要执行的命令必须在容器已经启动了之后才会执行,也就是说最后一个command如果命令无法执行,那么postStart也是无法执行的!

    pod.spec.containers.lifecycle.preStop <Object> 与上述类似,不再举例

    状态:

    1. Pending: 挂起,没有节点能够满足调度条件;
    2. Running: 运行
    3. Failed: 失败
    4. Succeeded: 成功
    5. Unknow: Pod状态是API Server与运行这个Pod的节点上的kubelet通信获取状态信息的,如果kubelet有问题了,那么就有可能unknown;

    创建Pod:
      1. 将请求提交给API Server;
      2. API Server请求的目标状态保存到ETCD中;
      3. API Server请求Scheduler进行调度,如果调度成功,则将调度结果保存到ETCD中;
      4. 目标节点的kubelet通过API Server当中的状态编号会收到Pod请求,随后kubelet拿到用户创建Pod的清单进行创建启动;
      5. 创建成功或失败会有状态,返还给API Server中,再次更新到ETCD中;

      restartPolicy:
        Always, OnFailure(错误才重启), Never. Default to Always.

  • 相关阅读:
    【BUG修复】视频综合管理平台EasyNVS首页设备接入情况显示与实际不符如何调整?
    数据库连接池
    手写SORM(simple object relation mapping)框架3—DBManager和TableContext的设计
    jdbc—总结
    jdbc—CLOB和BLOB
    jdbc—时间处理
    jdbc—事务
    递归(最大公约数)
    C++ return
    函数参数
  • 原文地址:https://www.cnblogs.com/k-free-bolg/p/13085869.html
Copyright © 2020-2023  润新知