kubernetes概述之深入理解pod对象

一.深入理解Pod对象

 1.Pod容器的分类

  Pod的概念:

  • 最小部署单元
  • 一组容器的集合
  • 一个Pod中的容器共享网络命名空间
  • Pod是短暂的

  Pod的容器分类:

  Infrastructure Container:基础容器 -- 维护整个Pod的网络空间

  

  一般这里的pause镜像的作用就是维护pod的网络空间

  InitContainers:初始化容器 -- 先与业务容器开始执行

  Containers:业务容器 -- 并行启动

 2.镜像拉取策略

  • IfNotPresent:默认值,镜像在宿主机上不存在时才拉取
  • Always:每次创建Pod都会被重新拉取一次镜像
  • Never:Pod永远不会主动拉取这个镜像

apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
    - name: foo
      image: nginx:latest
      imagePullPolicy: IfNotPresent

测试镜像拉取策略yaml

  

 3.资源限制

  Pod和container的资源请求和限制:

  • spec.containers[].resources.limits.cpu
  • spec.containers[].resources.limits.memory
  • spec.containers[].resources.requests.cpu
  • spec.containers[].resources.requests.memory

  主要是limit和requests两个参数,request是k8s预分配的内存大小,k8s根据这个大小进行调度,而limit是限制pod的容量大小,只有这么多容量可用

  这里强调下cpu的参数:500m代表0.5个cpu,1000m代表1个cpu

apiVersion: v1
kind: Pod
metadata:
  name: fronted
spec:
  containers:
  - name: db
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "password"
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

资源限制实例yaml

  

 4.重启策略(restartPolicy)

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

apiVersion: v1
kind: Pod
metadata:
  name: foo
spec:
  containers:
    - name: foo
      image: nginx:latest
  restartPolicy: Always

重启策略实例yaml

  

 5.健康检查(Probe)

  Probe有以下两种类型:

  (1)livenessProde

    如果检查失败,将杀死容器,根据Pod的restartPolicy来操作

  (2)readlinessProde

    如果检查失败,kubernetes会把Pod从service  endpoints中剔除

  Probe支持以下三种检查方法:

  (1)httpGet:发送HTTP请求,返回200-400范围状态码为成功。

  (2)exec:执行shell命令返回状态码是0为成功。

  (3)tcpSocket:发起TCP Socket建立成功

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec
spec:
  containers:
  - name: liveness
    image: k8s.gcr.io/busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

健康检查策略yaml

  这里是调用shell创建文件休眠30s,之后删除在休眠600s,之后cat这个文件根据状态码进行监控检查,默认策略是根据Pod的restartPolicy来重启的

  官网参考:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/

  

  可以看出没经过一段时间便会重启pod,以实现效果

 6.调度约束

  创建一个pod的过程:

  

  总体来说:用户创建完pod提交至API server,之后写入Etcd,Api server的watch方法通知Scheduler有pod需要调度,Scheduler将调度完的列表响应给Api server,Api server将列表信息写入etcd,Apiserver通知node节点上的kubelet,kubelet绑定自身的pod,然后run docekr 返回给Api server,将机器状态写入etcd。

  也可以指定pod调度到某些节点上

  (1).通过nodeName指定

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
  labels:
    app: nginx
spec:
  nodeName: k8s-node1
  containers:
  - name: nginx
    image: nginx:latest

调度到指定Nodename

  

  (2).nodeSelector用于将Pod调度到匹配Label的Node上

  为节点创建分组:

   kubectl label nodes k8s-node1 team=dev1

  

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  nodeSelector:
    team: dev1
  containers:
  - name: nginx
    image: nginx:latest

分组调度策略yaml

  

 7.故障排查

  通常的值与描述:

  

  kubectl describe TYPE/NAME

   kubectl logs TYPE/NAME [-c CONTAINER]

   kubectl exec POD [-c CONTAINER] -- COMMAND [args...]

  pod创建失败一般用上述命令查看具体原因

  官网参考:https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/

二.部署应用常用控制器

 1.Deployment(无状态应用部署)

  Pod与Controllers的关系:

  • controllers:在集群上管理和运行容器的对象
  • 通过label-selector相关联
  • Pod通过控制器实现应用的运维,如伸缩,滚动升级等

  

  Deployment主要作用:

  • 部署无状态应用
  • 管理Pod和ReplicaSet
  • 具有上线部署,副本设定,滚动升级,回滚等功能
  • 提供声明式更新,例如只更新一个新的Image

  应用场景:Web服务,微服务

  有状态的应用一般包含需要数据持久化的应用,或者启动服务有顺序的那种

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

部署deployment实例代码

  

 2.DaemonSet(守护进程状态控制器)

  • 在每一个node上运行一个Pod
  • 新加入的Node也同样会自动运行一个Pod

  应用场景: Agent

  flannel的网络模式就是累死这种agent

  

 3.Job(批处理任务)

  Job分为普通任务和定时任务,一次性执行

  应用场景:离线数量处理,视频解码等业务

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

job任务实例yaml

  执行kubectl create -f my-job.yaml结果如下:

  

 4.CronJob(定时任务)

  定时任务,像linux的Crontab一样,定时任务,应用场景:通知,备份

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

cronjob运行实例yaml

  

  小结:

  •  Deployment:无状态部署
  • DaemonSet:守护进程部署
  • Job & CronJob:批处理

三.Service - 统一入口访问应用

 1.什么是Service

  Service提供了统一访问应用的服务,能够动态添加管理Pod资源

  • 防止Pod失联(服务发现)
  • 定义一组Pod的访问策略(做负载均衡使用)
  • 支持ClusterIP,NodePort以及LoadBalancer三种类型
  • Service的底层实现主要有iptables和ipvs二种网络模式

 2.Pod与Service的关系

  • Pod与Service通过label-selector相关联
  • 通过Service实现Pod的负载均衡(TCP/UDP 4层)

  

 3.Service 类型

  Service有三种类型,分别是ClusterIp,NodePort,LoadBalancer

  ClusterIP:分配一个内部集群IP地址,只能在集群内部访问也就是(同Namespace内的Pod),默认ServiceType,ClusterIP模式的Service为你提供的,就是一个Pod的稳定的Ip地址,即VIP

  

  属于默认的service类型,只能集群内部访问使用

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

ClusterIp模式测试代码

  执行创建命令创建后的结果如下:

  

  此时访问这个VIP即可通信:

  

  NodePort:分配一个集群IP地址,并在每个节点上启用一个端口来暴露服务,可以在集群外部访问

kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx

NodePort方式部署yaml实例

  执行创建结果:

  

  这个时候我们可以利用这个nodeip+端口访问这个服务

  

  LoadBalancer:分配一个内部集群Ip地址,并在每个节点上启用一个端口来暴露服务,除此之外,kubernetes会请求底层平台上的负载均衡器,将每个Node作为后端添加进去

  一般此种方式用于公有云的负载

 4.Service代理模式

  

  Service支持的两种网络代理模式Iptables和IPVS

  iptables:灵活功能强大,规则从上到下匹配,遍历匹配和更新,呈线性延时,可扩展性

  ipvs:工作又内核态,有更好的性能,调度算法丰富,rr,wrr,lc,wlc,ip,hash

 5.DNS

  DNS服务监视Kubernetes API,为每个Service创建DNS记录用于域名解析

  用service.namespace调用即可

原文地址:https://www.cnblogs.com/datastart/p/11506592.html

时间: 2024-08-04 05:26:43

kubernetes概述之深入理解pod对象的相关文章

kubernetes-深入理解pod对象(七)

Pod中如何管理多个容器 Pod中可以同时运行多个进程(作为容器运行)协同工作.同一个Pod中的容器会自动的分配到同一个 node 上.同一个Pod中的容器共享资源.网络环境和依赖,它们总是被同时调度. 注意在一个Pod中同时运行多个容器是一种比较高级的用法.只有当你的容器需要紧密配合协作的时候才考虑用这种模式.例如,你有一个容器作为web服务器运行,需要用到共享的volume,有另一个"sidecar"容器来从远端获取资源更新这些文件,如下图所示: Pod中可以共享两种资源:网络和存

《三》深入理解Pod对象

Pod容器分类 最小部署单元 一组容器的集合 一个Pod中的容器共享网络命名空间 Pod是短暂的 Infrastructure Container:基础容器? 维护整个Pod网络空间InitContainers:初始化容器? 先于业务容器开始执行Containers:业务容器? 并行启动 镜像拉取策略(imagePullPolicy) IfNotPresent:默认值,镜像在宿主机上不存在时才拉取 Always:每次创建 Pod 都会重新拉取一次镜像 Never: Pod 永远不会主动拉取这个镜

第四章 Kubernetes进阶之深入理解Pod

Pod 最小部署单元 一组容器的组合 一个Pod中容器共享网络命名空间 Pod是短暂的 Pod容器分类 Infrastructure Container 基础容器 维护整个Pod网络空间 InitContainers 初始化容器 先于业务容器运行 Container 业务容器 并行启动 镜像拉取策略 IfNotPresent:默认值,镜像在宿主机上不存在时才拉取 Alway:每次创建Pod都会拉取一次镜像 Never:Pod永远不会拉取这个镜像 查看默认镜像拉取参数是否是IfNotPresent

Kubernetes — 深入解析Pod对象:基本概念(一)

在上一篇文章中,我详细介绍了 Pod 这个 Kubernetes 项目中最重要的概念. 现在,你已经非常清楚:Pod,而不是容器,才是 Kubernetes 项目中的最小编排单位.将这个设计落实到 API 对象上,容器(Container)就成了 Pod 属性里的一个普通的字段.那么,一个很自然的问题就是:到底哪些属性属于 Pod 对象,而又有哪些属性属于 Container 呢? 要彻底理解这个问题,你就一定要牢记我在上一篇文章中提到的一个结论:Pod 扮演的是传统部署环境里“虚拟机”的角色.

深入理解Java对象的创建过程:类的初始化与实例化

"-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 深入理解Java对象的创建过程:类的初始化与实例化 - Rico's Blogs - 博客频道 - CSDN.NET Rico's Blogs 潜心修炼,成为一个更好的人. 目录视图 摘要视图 订阅 [活动]2017 CSDN博客专栏评选 &nbsp [5月书讯]流畅

Pod对象的基本概念

概念 pod是k8s的基本调度单元  pod扮演的是传统部署环境中的虚拟机角色 容器扮演的运行在虚拟机中的用户进程 Pod对象字段 NodeSelector       提供用户将Pod与Node进行绑定的字段  Pod只能运行在满足NodeSelector的节点上 否则会调度失败 NodeName          一旦Pod的这个字段被赋值 k8s就会被认为此Pod已经通过了调度 调度的结果就是赋值的节点名字(可以用来调试) HostAliases        定义Pod的hosts文件(

理解javascript 对象,原型对象、闭包

javascript作为一个面向对象的语言,理解 对象.原型.闭包.模块模式等技术点对于成为一名合格的javascript程序员相当重要,多年没写过blog,今天就先拋个玉,在下基本也不做前端,但颇感兴趣,愿意和大家一起学习.此篇只是对自己认为的比较重要的知识点进行了说明,连贯性不是特别好,大家共同进步. 注意:文中中文并非英文翻译,只是个人理解. 理解面向对象 对象(object) An object is a collection of properties and has a single

深入理解JSON对象

深入理解JSON对象 前面的话 json(javascript object notation)全称是javascript对象表示法,它是一种数据交换的文本格式,而不是一种编程语言,用于读取结构化数据.2001年由Douglas Crockford提出,目的是取代繁琐笨重的XML格式.本文将详细介绍关于json的内容 语法规则 JSON的语法可以表示以下三种类型的值 [1]简单值 简单值使用与JavaScript相同的语法,可以在JSON中表示字符串.数值.布尔值和null 字符串必须使用双引号

【java】理解java对象序列化

关于Java序列化的文章早已是汗牛充栋了,本文是对我个人过往学习,理解及应用Java序列化的一个总结.此文内容涉及Java序列化的基本原理,以及多种方法对序列化形式进行定制.在撰写本文时,既参考了Thinking in Java, Effective Java,JavaWorld,developerWorks中的相关文章和其它网络资料,也加入了自己的实践经验与理解,文.码并茂,希望对大家有所帮助.(2012.02.14最后更新) 1. 什么是Java对象序列化 Java平台允许我们在内存中创建可