zoukankan      html  css  js  c++  java
  • Kubernetes(十七)深入理解Pod

     
    • 理解pod
    • 基础知识 
      • pod是kubernetes最基本的执行单元(最小、最简单的单元),pod表示在集群上运行的进程。
      • pod封装了应用程序容器(某些情况下多个容器),存储资源、唯一网络IP、以及控制器该如何运行的选项。
        • 运行单个容器的pod:一个pod运行一个容器是kubernetes最常见的。
        • 运行多个容器的pod:pod可能封装多个紧密耦合且需要共享资源的共处容器组成的应用程序。
      • 如果希望横向扩展应用程序,则应该使用多个pod,在kubernetes中,称为副本。
      • pod是短暂的。
    • 网络
      • 每个pod分配一个唯一的IP地址,pod的每个容器共享网络命名空间。包括IP地址和端口。pod内的容器可以使用localhsot相互通信。
    • 存储
      • 一个pod可以指定一组共享存储卷。pod中所有的容器都可以访问共享卷,允许这些容器共享数据。卷数据可以持久化
    • pod的分类
      • Infrastructure Container 基础容器
        • 在node节点:cat /opt/kubernetes/cfg/kubelet.kubeconfig 可以看到指定的容器,每创建一个pod都会创建一个,和pod一一对应。
        • 在node节点:通过 docker ps 会看到name为*/pause-amd64:3.0的就是了。
        • 负责维护pod的网络空间。
        • 该容器对用户无感知,由后台自动完成。
      • InitContainers 初始化容器
      • containers 业务容器
        • 我们主要使用的容器
    • pod的意义
      • 解决一个docker容器只运行一个程序的限制;pod是多进程模型,可以运行多个应用程序,每个程序由容器来管理。
      • 某些亲密性应用场景是需要多个容器一起运行的;例如:频繁交互数据的两个应用,通过localhost相互访问可以提供性能,防止出现跨节点、跨网络的通信。
    • pod实现机制
    • 镜像拉取策略
      • IfNotPresent 默认值,镜像在宿主机上不存在时才拉取
      • Always 每次创建pod都拉取镜像
      • Never pod永远不会主动拉取镜像
      • 示例:使用Always方式拉取一个私有的镜像
        • 官方链接 https://kubernetes.io/zh/docs/tasks/configure-pod-container/pull-image-private-registry/ 
        • 生成secret有2种方式:
        • 一、使用docker登录的凭证来生成 
          • 1.先登录镜像仓库 docker login -u *** -p *** https://registry.cn-shanghai.aliyuncs.com
          • 2.查看docker登录的凭证 cat .docker/config.json
          • 3.将凭证base64位编码 cat .docker/config.json |base64 -w 0
          • 4.生成token成功,将token保存到yaml模板即可;
        • 二、使用kubectl来生成(在集群中创建保存授权令牌的secret)
          • 1.创建 kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>
          • 2. 查看  kubectl get secret regcred --output=yaml
        • 创建一个使用secret的pod
          • 我们取名叫 useridentity-deployment.yaml
          • 执行 kubectl create -f useridentity-deployment.yaml
          • 如果镜像拉取失败,查看详细信息 kubectl describe pods useridentity
          • 基本的创建pod和service的yaml示例
     
     
    • pod资源限制
      • 官方链接 https://kubernetes.io/zh/docs/concepts/configuration/manage-compute-resources-container/
      • 当您定义pod的时候,可以选择未每个容器指定需要的CPU和内存大小。当为容器指定了资源请求后,调度器就能更好的判断将容器调度到哪个节点上。
      • 资源类型
        • cpu和内存都是资源类型,cpu单位是核心数,内存单位是字节     
      • pod和容器的资源请求和限制
        • pod中的每个容器都可以指定以下一个或者多个值
          • spec.containers[].resources.limits.cpu
          • spec.containers[].resources.limits.memory
          • spec.containers[].resource.requests.cpu
          • spec.containers[].resource.requests.memory          
      • cpu的含义
        • 0.1cpu=100m;0.1的cpu在双核,多核机器中的意义是一样的。     
      • 内存的含义
        • 内存的限制和请求以字节为单位。常见单位 Ei,Pi,Ti,Gi,Mi,Ki。     
      • 具有资源请求的pod如何调度
        • 当你创建一个pod时,kubernetes调度程序将为pod选择一个节点。每个节点具有每种资源类型的最大容量,调度程序确保对每种资源类型,调度的容器的资源请求综合人小于节点的容量。     
      • 具有资源限制的pod如何运行
        • 当kubectl启动一个容器时,它会将cpu和内存限制传递到容器运行时 。
          • spec.containers[].resource.request.cpu 作用于docker run 命令中的--cpu-shares
          • spec.containers[].resource.limits.cpu 作用于docker run 命令中的--cpu-quota
          • spec.containers[].resource.limits.memory 作用于 docker run 命令中的--memory   
      • 监控计算资源的使用
        • 如果为集群配置了可选监控,则可以从监控系统检索pod资源使用情况     
      • 疑难解答
        • pod状态为pending,并且时间信息显示failedScheduling     
          • 如果调度器找不到任何可以匹配的节点,则该pod将保持不可调度状态,直到找到一个可以被调度的位置。 
          • pod事件查看  kubectl describe pod nginx | grep -A 3 Events   
          • 查看pod资源限制利用率 kubectl describe nodes k8s-node1
        • 容器意外终止
          • 容器终止了要查看是否是因为资源限制被杀死,要查看容器详情
          • 查看详情 kubectl describe pod nginx
          • 查看容器终止前后状态对比  kubectl get pod -o go-template='{{range.status.containerStatuses}}{{"Container Name: "}}{{.name}}{{" LastState: "}}{{.lastState}}{{end}}' nginx-59d795d786-czfj4
        • 含资源限制的yaml示例文件
     
    • pod重启策略(restartPolicy)
      • 官方链接 https://kubernetes.io/zh/docs/concepts/workloads/pods/pod-lifecycle/#%e9%87%8d%e5%90%af%e7%ad%96%e7%95%a5
      • 重启的三种策略
        • Always  当容器终止退出后,总是重启(默认)
        • OnFailure 当容器异常退出(退出状态码非0),才重启容器
        • Never 当容器终止退出,从不重启容器
      • spec.restartPolicy
        • restartPolicy: Always
      • 含重启策略yaml示例文件
    pod健康检查(Probe)
    • 官方链接 https://kubernetes.io/zh/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
    • probe探测器类型
      • kubectl使用存活探测器(livenessProbe)来知道要什么时候来重启容器。
        • 如果检查失败,将容器杀死,使用restartPolicy策略来操作容器     
      • kubectl使用就绪探测器(readinessProbe)来知道容器什么时候准备好了可以接受流量请求。
        • 如果检查失败,kubernetes会把pod从service 负载均衡器中移除     
      • kubectl使用启动探测器(startupProbe就可以知道应用程序什么时候启动了。
        •     可以控制容器在启动成功后进行活性和就绪检查,确保存活和就绪探测器不会影响程序的启动。
    • probe探测器支持3种检测方法
      • exec 执行shell命令,返回状态码0表示成功 
      • httpGet 发送http请求,返回200-400为成功
      • tcpScoket 发送tcp Socket建立成功
    • 探测器配置      
      • initialDelaySeconds:容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认0秒;
      • periodSeconds:执行探测器的时间间隔,默认是10秒;
      • timeoutSeconds:探测的超时后等待多少秒。默认值是1,最小值是1;
      • sucsessThreshold:探测器失败后,被视为成功的最小连续成功数。默认值1.存活探测器必须是1.最小值是1;
      • failureThreshold:当pod启动了并探测到失败,kubernetes重试次数,默认值3,最小值1; 
    • http探测器可以在httpGet上配置额外的字段 
      • host:链接使用的主机名,默认是pod的IP
      • scheme:链接方式,httphttps
      • path:访问http的路径 
      • httpHeaders:请求证自定义的http头
      • port:访问容器的端口号和端口名,必须在1-65535之间      
    pod调度约束
    • 官方链接 https://kubernetes.io/zh/docs/concepts/configuration/assign-pod-node/
    • 当我们集群里面运行多个项目时候,可能就会使用到node划分;虽然kunernetes默认的分配基本上满足需求了;
    • NodeName 进行节点约束
      • apiVersion: v1
        kind: Pod
        metadata:
          name: nginx
        spec:
          containers:
          - name: nginx
            image: nginx
          nodeName: kube-01
    • NodeSelector 通过lable进行节点约束
      •     
        apiVersion: v1
        kind: Pod
        metadata:
          name: nginx
          labels:
            env: test
        spec:
          containers:
          - name: nginx
            image: nginx
            imagePullPolicy: IfNotPresent
          nodeSelector:
            disktype: ssd
    pod故障排查
    • pod状态
      • pending :Pod创建已经提交到了kubernetes,但是因为某种原因不能顺利创建,例如镜像比较慢,调度节点不成功。
      • running :Pod已经绑定到一个节点,并且已经创建了所有容器。至少有一个容器运行中 ,或正在启动或重新启动。
      • succeded:pod中所有容器都已经终止,不会重新启动。
      • failed:Pod的所有容器均已经终止,至少有一个容器在故障终止,也就是说要么容器以非0状态退出,要么被系统终止。
      • Unkown:由于某种原因apiserver无法获得Pod状态,通过是由于master与pod所在主机kubelet通信时出错。
    • 常用查看异常命令
      • kubectl logs type/name #查看容器日志
      • kuberctl describe type/name #查看容器详细描述
      • kubectl exec -it name bash #进入容器内部查看
  • 相关阅读:
    Mac brew命令踩坑
    Git 使用总结
    idea debug的使用技巧和快捷键
    pv、uv、ip,tps、qps、rps术语
    MySQL进阶(八)MySQL表设计原则
    反射机制
    Gradle 依赖关系中 compile和 implementation的区别
    HashMap的最大容量为什么是2的30次方?
    深入理解SELECT ... LOCK IN SHARE MODE和SELECT ... FOR UPDATE
    $.query.get()
  • 原文地址:https://www.cnblogs.com/TSir/p/12255328.html
Copyright © 2011-2022 走看看