• POD基础


    一.pod基本概念

    pod是kubernetes创建和管理的最小单元。
    一个pod由单个或多个容器组成,这些容器共享存储和网络
    pod的特点:
    • 一个pod可以理解为一个应用实例,提供服务  
    • pod中的容器部署在Node上
    • pod中的容器共享网络和存储资源
    • kubernetes直接管理pod,而不是容器

    二.pod存在的意义

    pod主要用法

    • 运行单个容器:最常见的应用场景。在这行情况下,可以把pod看做单个容器的抽象封装
    • 运行多个容器:封装多个紧密耦合且需要共享资源的应用程序

    三.pod资源实现共享机制

      

    pause容器:
      pause容器全称infrastucture container(又叫infra)基础容器
      每个pod里运行着一个特殊的被称为pause的容器,其他容器则为业务容器。这些业务容器共享pause容器的网络栈和Volume挂在卷,因此他们之间通信和数据交换更为高效
      在设计业务架构时,可以充分利用这一特性将一组密切相关的服务进程放入同一个pod中。同一个pod里的容器之间仅需localhost就能互相通信    

    四.pod日常管理

    创建Pod:
      kubectl apply -f pod.yaml
      或者使用命令 kubectl run nginx --image=nginx
    查看Pod:
      kubectl get pods
      kubectl describe pod <Pod名称>
    查看日志:
      kubectl logs <Pod名称> [-c CONTAINER]
      kubectl logs <Pod名称> [-c CONTAINER] -f
    进入容器终端:
      kubectl exec <Pod名称> [-c CONTAINER] -- bash
    删除Pod:
      kubectl delete <Pod名称> 

    五、重启策略和健康检查,实现应用自修复

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

    健康检查:

      livenessProbe(存活检查):如果检查失败,将杀死容器,根据pod的restartPolicy来操作

      readinessProbe(就绪检查):如果检查失败,kubernetes会把pod从service endpoint中剔除(不分发流量给它)

      startupProbe(启动检查)

    三种检查方法:

      httpGET:发送http get请求。返回200-400范围的状态码为成功

      exec:执行shell命令返回状态码是0为成功(echo $?)

      tcpSocket:发起tcp socket建立成功

    #exec存活检查示例:
    
    apiVersion: v1
    kind: Pod
    metadata:
      labels:
        test: liveness
      name: liveness-exec
    spec:
      containers:
      - name: liveness
        image: busybox
        args:
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
        livenessProbe:
          exec:
            command:
            - cat
            - /tmp/healthy
          initialDelaySeconds: 5     # 启动容器5秒后开始检查
          periodSeconds: 5            # 间隔5秒检查一次
    
    
    # describe查看event事件验证:
    Events:
      Type     Reason     Age                    From                Message
      ----     ------     ----                   ----                -------
      Normal   Scheduled  5m48s                  default-scheduler   Successfully assigned default/liveness-exec to k8s-node1
      Normal   Pulled     5m31s                  kubelet, k8s-node1  Successfully pulled image "busybox" in 14.880201986s
      Normal   Pulled     4m6s                   kubelet, k8s-node1  Successfully pulled image "busybox" in 10.527461536s
      Normal   Created    2m34s (x3 over 5m31s)  kubelet, k8s-node1  Created container liveness
      Normal   Pulled     2m34s                  kubelet, k8s-node1  Successfully pulled image "busybox" in 18.074284946s
      Normal   Started    2m33s (x3 over 5m31s)  kubelet, k8s-node1  Started container liveness
      Normal   Killing    112s (x3 over 4m47s)   kubelet, k8s-node1  Container liveness failed liveness probe, will be restarted
      Normal   Pulling    82s (x4 over 5m46s)    kubelet, k8s-node1  Pulling image "busybox"
      Warning  Unhealthy  37s (x10 over 4m57s)   kubelet, k8s-node1  Liveness probe failed: cat: can't open '/tmp/healthy': No such file or directory

    参考文档:https://v1-17.docs.kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

     六.向pod中注入环境变量

    # 变量的3种定义方式:
    • 自定义变量值
    • 变量值从pod属性中获取
    • 变量值从Secret、ConfigMap中获取
    apiVersion: v1
    kind: Pod
    metadata:
      name: pod-envars
    spec:
      containers:
        - name: test
          image: busybox
          command: [ "sh", "-c", "sleep 36000"]
          env:
            - name: MY_NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName           
            - name: MY_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name           
            - name: MY_POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace       
            - name: MY_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP              
            - name: nginx 
              value: "/usr/local/nginx/bin"            # 自定义

    验证:

        [root@k8s-master yaml]# kubectl exec -it pod-envars -- sh
        / # echo $MY_NODE_NAME
        k8s-node1
        / # echo $MY_POD_NAME
        pod-envars
        / # echo $MY_POD_NAMESPACE
        default
        / # echo $MY_POD_IP
        10.244.36.90
        / # echo $nginx
        /usr/local/nginx/bin

     七.init container

    init container:顾名思义,用于初始化工作,执行完就结束,可以理解为一次性任务
    • 支持大部分应用容器的配置,但不支持健康检查
    • 优先应用容器执行
    应用场景:
      环境检查:确保应用容器以来的服务启动之后再启动应用容器(nginx需要等待mysql启动后,才能启动)
      初始化配置:给应用容器准备配置文件(从配置中心拉取)

    示例:启动一个web服务器前,从指定位置拉取最新代码(网站代码没有打包到镜像中),wget模拟

    apiVersion: v1
    kind: Pod
    metadata:
      name: init-demo
    spec:
      initContainers:
      - name: download
        image: busybox
        command:
        - wget
        - "-O"
        - "/opt/index.html"
        - http://www.ctnrs.com
        volumeMounts:
        - name: wwwroot
          mountPath: "/opt"
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: wwwroot
          mountPath: /usr/share/nginx/html
      volumes:
      - name: wwwroot
        emptyDir: {}

    总结

    pod中会有这几种类型的容器
    
        infra container:基础容器 维护整个pod网络空间
        init container:初始化容器  先于业务容器运行
        containers:业务容器      
  • 相关阅读:
    排序总结[3]_线性排序算法
    Spring九问
    DP-最大递增子序列与最大递增子数组; 最大公共子序列与最大公共子数组。
    java 8 新特性
    数据库事务隔离等级
    算法思维方式之二——DP与DFS
    算法思维方式—— 由排列组合想到的
    java Servlet简介
    java hashCode, 引用以及equals().
    java反射简介
  • 原文地址:https://www.cnblogs.com/lichunke/p/14030402.html
Copyright © 2020-2023  润新知