zoukankan      html  css  js  c++  java
  • 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:业务容器      
  • 相关阅读:
    WHERE col1=val1 AND col2=val2;index exists on col1 and col2, the appropriate rows can be fetched directly
    MySQL 交集 实现方法
    MBProgressHUD的使用
    Xcode4 使用 Organizer 分析 Crash logs(转)
    SimpleXML 使用详细例子
    PHP的XML Parser(转)
    iPhone,iPhone4,iPad程序启动画面的总结 (转)
    Pop3得到的Email 信件格式介绍
    yii总结
    隐藏Tabbar的一些方法
  • 原文地址:https://www.cnblogs.com/lichunke/p/14030402.html
Copyright © 2011-2022 走看看