Kubernetes中Pod容器的使用

这篇具有很好参考价值的文章主要介绍了Kubernetes中Pod容器的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 概述

Pod是K8S系统中可以创建和管理的最小单元,是资源对象模型中由用户创建或部署的最小资源对象模型

有许多组件围绕Pod进行扩展和支持,比如控制器对象是用来管控Pod对象的,Service或者Ingress资源对象是用来暴露Pod引用对象的,PersistentVolume资源对象是用来为Pod提供存储等。

1.1 Pod结构

Pod是多进程设计,一个Pod里面包含多个容器,而一个容器里面运行一个应用程序。

每个Pod都有一个特殊的被称为 “根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,为其他的业务容器作支撑。一般把业务相关联的容器放到一个pod里,从而方便相关容器之间网络互通和文件共享。

1.2 实现机制

Pod实现主要依赖于共享网络共享存储两大机制

  • 共享网络:docker创建的容器由于namespace和group而相互隔离的,在创建业务容器时会注册到 pause容器 中从而共享其 ip地址,mac地址,port 等信息,这样便处于同一个网络中实现网络的共享。

  • 共享存储:如下所示,每个容器会挂载到公共的数据卷Volume上,然后其数据都持久化存储到其中,当一个容器挂掉后,新的容器也能从Volume读取到之前的数据

  apiversion: v1
  kind: Pod
  metadata:
    name: my-pod
  spec:
    containers:
    -name: write
      image: centos
      command: ["bash", "-u","for i in {1..100};do echo $i » /data/hello;sleep 1;done"]
      # 挂载数据卷
      volumeMounts:
        -name: data
          mountPath: /data 
          
    -name: read
      image: centos
      command: [“bash",”-c","tail -f /data/hello"]
      # 挂载数据卷
      volumeMounts:
      -name: data
        mountPath: /data
    
    # 定义数据卷
    volumes:
    -name: data
      emptyDir: {}

2 Pod机制

2.1 镜像拉取策略

Pod的拉取策略主要分为了以下几种

  • IfNotPresent:默认值,镜像在宿主机上不存在才拉取
  • Always:每次创建Pod都会重新拉取一次镜像
  • Never:Pod永远不会主动拉取这个镜像
apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
    -name: nginx
    image: nginx:1.14
    # 拉取策略
    imagePullPolicy: Always

2.2 Pod资源限制

Pod在进行调度时,可以在调度器对资源的分配进行设置。例如限制使用的资源是 2C4G,那么在调度到对应的node节点时,只会占用对应的资源,对于不满足资源的节点则会跳过。

有两种资源配置的方式:

  • request:表示调度所需最少的资源
  • limits:表示最多允许使用的资源
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - name: db
    image: mysql
    env:
    - name: MYSQL__ROOT_PASSWORD
      value: "password"
        
    resources:
      # 资源限制
      requests:
        memory: "64Mi"
        cpu: "250m"
        
      limits:
        memory: "128Mi"
        cpu: "500m"

2.3 Pod重启机制

当Pod中的容器出现问题时就会触发重启机制,重启策略主要分为以下三种

  • Always:当容器终止退出后,总是重启容器,默认策略 【nginx等,需要不断提供服务】
  • OnFailure:当容器异常退出(退出状态码非0)时,才重启容器。
  • Never:当容器终止退出,从不重启容器
apiVersion: v1
kind: Pod
metadata:
  name: dns-test
spec:
  containers:
  - name: busybox
    image: busybox:1.28
    args:
    - /bin/sh
    - -c
    - sleep 33000
  # 重启策略
  restartPolicy: Never

2.4 Pod健康检查

通过容器检查来判断服务是否可用,共有两种检查方式:存活检查livenessProbe,如果检查失败,将杀死容器,根据Pod的restartPolicy来操作;就绪检查readinessProbe,如果检查失败,Kubernetes会把Pod从Service endpoints中剔除

Probe支持以下三种检查方式

  • http Get:发送HTTP请求,返回200 - 400 范围状态码为成功
  • exec:执行Shell命令返回状态码是0为成功
  • tcpSocket:发起TCP Socket建立成功
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;
    # 通过exec来执行存活检查
    livenessProbe:
      exec:
        command:
        -cat
        -/tmp/healthy
      initialDelaySeconds: 5
      periodSeconds: 5

3 调度策略

创建Pod流程如下:

  • 首先创建一个pod,然后创建一个API Server 和 Etcd,把创建出来的信息存储在etcd中
  • 然后创建 Scheduler,监控API Server是否有新的Pod,如果有的话,会通过调度算法把pod调度具体node上
  • 在node节点,会通过 kubelet -- apiserver 读取etcd 拿到分配在当前node节点pod信息,然后通过docker创建容器
影响Pod调度的属性

在Pod调度时会有多个条件影响调度结果。

首先调度器会考虑Pod的资源限制,根据request找到满足条件的node节点进行调度

3.1 节点选择器NodeSelector

调度器会根据节点的标签将任务调度到符合条件的节点上,例如下面将任务调度到标签为dev的节点上

apiVersion: v1
kind: Pod
metadata:
  name: pod-example
spec:
  # 根据节点选择器标签进行调度
  nodeSelector:
    env role: dev
  containers:
  -name: nginx
    image: nginx:1.15

可以通过以下命令为节点新增标签,然后节点选择器就会进行调度了

kubectl label node node1 env_role=prod

3.2 节点亲和性NodeAffinity

节点亲和性和之前nodeSelector 基本一样的,根据节约束条件来决定Pod调度到哪些节点上

  • 硬亲和性:约束条件必须满足,不满足则不分配
  • 软亲和性:尝试满足,不保证
apiVersion: v1                                              
kind: Pod                                                    
metadata:                                                    
   name: with-node-affinity                                    
spec:                                                             
   affinity:                                                   
     nodeAffinitv:
       # 硬亲和性
       requiredDuringSchedulinglgnoredDuringExecution:
         nodeSelectorTerms:
         - matuhExpEessions:
           - key: env sle
             operator: In
             values:
               - dev
               - test
       # 软亲和性
       preferredDuringSchedulinglgnoredDuringExecution:
       - weight: 1
         preference:
           matchExpressions:
           - key: group
             operator: In
             values:
             - otherprod

支持常用操作符:in、NotIn、Exists、Gt、Lt、DoesNotExists

反亲和性:就是和亲和性刚刚相反,如 NotIn、DoesNotExists等

3.3 污点Taint

通过Taint 将节点添加污点,从而使本节点不做普通分配调度。nodeSelector 和 NodeAffinity,都是Pod的属性,而污点是节点的属性。

可以通过污点

  • 专用节点【限制ip】
  • 配置特定硬件的节点【固态硬盘】
  • 基于Taint驱逐【在node1不放,在node2放】

通过如下命令查看污点情况

kubectl describe node k8smaster | grep Taint

污点值有三个

  • NoSchedule:一定不被调度
  • PreferNoSchedule:尽量不被调度【也有被调度的几率】
  • NoExecute:不会调度,并且还会驱逐Node已有Pod

通过如下命令为节点添加污点

kubectl taint node [node] key=value:污点的三个值

举例:文章来源地址https://www.toymoban.com/news/detail-609671.html

kubectl taint node k8snode1 env_role=yes:NoSchedule

# 删除污点
kubectl taint node k8snode1 env_role:NoSchedule-

到了这里,关于Kubernetes中Pod容器的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Kubernetes系列-通过kubectl实现重启pod的方法

    kubectl 没有 restart pod 这个命令,主要是由于在 k8s 中pod 的管理属于rs 等控制器,并不需要手动维护,但有时更新了yaml文件后,期望破都能够\\\"重启\\\"重新加载yaml文件,比如修改了configmap 的配置文件后,希望重启pod 加载配置,此时就需要 “重启” Pod。而\\\"重启\\\"准确地来说是重建

    2024年02月12日
    浏览(48)
  • 云原生Kubernetes:kubectl管理命令

    目录 一、理论 1.K8S资源管理方法 2.kubectl 管理命令 3.项目的生命周期 4.Kubernetes 服务发布方式 5.金丝雀发布(Canary Release)部署 6.声明式管理方法 二、实验  1.kubectl 管理命令 2.项目的生命周期 3.金丝雀发布(Canary Release)部署 4.声明式管理方法 三、问题 1.为何每个pod有两个标签 四

    2024年02月09日
    浏览(39)
  • Kubernetes(k8s)容器编排Pod介绍和使用

    Pod是kubernetes中你可以创建和部署的最小也是最简的单位,一个Pod代表着集群中运行的一个进程。 Pod有两个必须知道的特点 通过yaml文件或者json描述Pod和其内容器的运行环境和期望状态,例如一个最简单的运行nginx应用的pod,定义如下 3.1.1 参数描述 下面简要分析一下上面的

    2024年02月08日
    浏览(84)
  • 容器和云原生(三):kubernetes搭建与使用

            目录 单机K8S docker containerd image依赖 kubeadm初始化 验证 crictl工具 K8S核心组件 上文安装单机docker是很简单docker,但是生产环境需要多个主机,主机上启动多个docker容器,相同容器会绑定形成1个服务service,微服务场景中多个service会互相调用,那么就需要保证多个servi

    2024年02月11日
    浏览(32)
  • 云原生Kubernetes:pod基础

    目录 一、理论 1.pod 2.pod容器分类 3.镜像拉取策略 4.pod 的重启策略 二、实验 1.Pod容器的分类 2.镜像拉取策略 三、问题 1.apiVersion 报错 2.pod v1版本资源未注册 3.格式错误 4.取行显示指定pod信息 四、总结 (1)  概念  Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应

    2024年02月09日
    浏览(45)
  • 云原生之深入解析Kubernetes中Kubectl Top如何进行资源监控

    kubectl top 是基础命令,但是需要部署配套的组件才能获取到监控值: 1.8 以下:部署 heapter; 1.8 以上:部署 metric-server; kubectl top node:查看 node 的使用情况: kubectl top pod:查看 pod 的使用情况: 不指定 pod 名称,则显示命名空间下所有 pod,–containers 可以显示 pod 内所有的

    2024年02月10日
    浏览(55)
  • Kubernetes —Pod 和容器日志

    应用日志可以让你了解应用内部的运行状况。日志对调试问题和监控集群活动非常有用。 大部分现代化应用都有某种日志记录机制。同样地,容器引擎也被设计成支持日志记录。 针对容器化应用,最简单且最广泛采用的日志记录方式就是写入标准输出和标准错误流。 但是,

    2024年02月13日
    浏览(60)
  • 【云原生】Kubernetes之 Pod hook(钩子)

    Pod hook(钩子)是由 Kubernetes 管理的 kubelet 发起的,当容器中的进程启动前或者容器中的进程终止之前运行,这是包含在容器的生命周期之中。可以同时为 Pod 中的所有容器都配置 hook。 Hook 的类型包括两种: exec:执行一段命令 HTTP:发送 HTTP 请求 示例如下: 说明: postStar

    2024年02月15日
    浏览(35)
  • 云原生之深入解析Kubernetes中如何使用临时容器进行故障排查

    容器及其周围的生态系统改变了工程师部署、维护和排查工作负载故障的方式。但是,在 Kubernetes 集群上调试应用程序有时可能会很困难,因为可能在容器中找不到所需的调试工具。许多工程师使用基于精简、发行版构建无发行版的基础镜像,其中甚至没有包管理器或shell,

    2024年02月05日
    浏览(48)
  • Kubernetes在容器内获取Pod信息

    我们知道,每个 Pod 在被成功创建出来之后,都会被系统分配唯一的名字、IP 地址,并且处于某个 Namespace 中,那么我们如何在 Pod 的容器内获取 Pod 的这些重要信息呢?答案就是使用 Downward API。 Downward API 可以通过以下两种方式将 Pod 信息注入容器内部。 (1)环境变量:用于单

    2024年02月10日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包