Kubernetes-Pod

1. 简介

Pod 是可以在 Kubernetes 中创建和管理的、 最小的可部署的计算单元

Pod 是一组(一个或多个) 容器; 这些容器 共享存储、网络、以及怎样运行这些容器的声明。 Pod 中的内容总是并置(colocated)的并且一同调度,在共享的上下文中运行。 Pod 所建模的是特定于应用的”逻辑主机”,其中包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。 在非云环境中,在相同的物理机或虚拟机上运行的应用类似于 在同一逻辑主机上运行的云应用。

就 Docker 概念的术语而言,Pod 类似于共享名字空间和文件系统卷的一组 Docker 容器。

2. pod 怎样管理多个容器

Pod 被设计成支持形成内聚服务单元的多个协作过程(形式为容器)。 Pod 中的容器被自动安排到集群中的同一物理机或虚拟机上,并可以一起进行调度。 容器之间可以共享资源和依赖、彼此通信、协调何时以及何种方式终止自身。

例如,你可能有一个容器,为共享卷中的文件提供 Web 服务器支持,以及一个单独的 “sidecar(挂斗)”容器负责从远端更新这些文件,如下图所示:

Kubernetes-Pod

3. 使用 Pod

很少会在 Kubernetes 中直接创建一个个的 Pod,甚至是单实例(Singleton)的 Pod。 这是因为 Pod 被设计成了相对临时性的、用后即抛的一次性实体。 当 Pod 由你或者间接地由 控制器创建时,它被调度在集群中的节点上运行。 Pod 会保持在该节点上运行,直到 Pod 结束执行、Pod 对象被删除、Pod 因资源不足而被 驱逐 或者节点失效为止。

说明: 重启 Pod 中的容器不应与重启 Pod 混淆。 Pod 不是进程,而是容器运行的环境。 在被删除之前,Pod 会一直存在。

3.1 Pod 和控制器

你可以使用工作负载资源来创建和管理多个 Pod。 资源的控制器能够处理副本的管理、上线,并在 Pod 失效时提供自愈能力。 例如,如果一个节点失败,控制器注意到该节点上的 Pod 已经停止工作, 就可以创建替换性的 Pod。调度器会将替身 Pod 调度到一个健康的节点执行。

下面是一些管理一个或者多个 Pod 的工作负载资源的示例:

3.2 quick start

3.2.1 创建pod

my-pod.yaml 资源模板内容如下:

apiVersion: v1
kind: Pod
metadata:
  labels:
    my-pod: helloworld
  name: helloworld
  namespace: test1
spec:
  containers:
  - image: nginx
    name: helloworld
  restartPolicy: Always

创建pod

$ kubectl create -f my-pod.yaml

可以使用 –dry-run 快速创建一个pod资源模板

--dry-run=client 以客户端的方式空跑一个资源服务 该参数会导致 请求不会发送给server,也就不会创建pod,可以使用此参数生成一个想要的资源模板
-oyaml 以yaml的方式输出资源模板内容
$ kubectl run helloworld1 --image=nginx --dry-run=client -oyaml -n test1
输出内容如下
apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: helloworld1
  name: helloworld1
  namespace: test1
spec:
  containers:
  - image: nginx
    name: helloworld1
    resources: {}
  dnsPolicy: ClusterFirst
  restartPolicy: Always
status: {}

3.2.2 查看pod

查看pod 基本信息

$ kubectl get po -n test1

NAME         READY   STATUS    RESTARTS   AGE
helloworld   1/1     Running   0          5m29s

查看pod更多的信息

$ kubectl get po -n test1 -o wide

NAME         READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES
helloworld   1/1     Running   0          7m26s   10.100.132.162   k8s-woker-01

可以看到pod容器ip地址为 10.100.132.162,尝试访问服务

$ curl 10.100.132.162

Welcome to nginx!

html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }

Welcome to nginx!

If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.

For online documentation and support please refer to
nginx.org.

Commercial support is available at
nginx.com.

Thank you for using nginx.

查看pod运行详情信息

kubectl describe -f my-pod.yaml
$ kubectl describe po/helloworld -n test1

Name:         helloworld
Namespace:    test1
Priority:     0
Node:         k8s-woker-01/192.168.0.202
Start Time:   Sun, 12 Dec 2021 18:58:14 +0800
Labels:       my-pod=helloworld
Annotations:  cni.projectcalico.org/podIP: 10.100.132.162/32
              cni.projectcalico.org/podIPs: 10.100.132.162/32
Status:       Running
IP:           10.100.132.162
IPs:
  IP:  10.100.132.162
Containers:
  helloworld:
    Container ID:   docker://06d589c242e5aa16962ce0e52cd6d51b6b8f95205edcb860fb83f66ba580d0d3
    Image:          nginx
    Image ID:       docker-pullable://nginx@sha256:9522864dd661dcadfd9958f9e0de192a1fdda2c162a35668ab6ac42b465f0603
    Port:
    Host Port:
    State:          Running
      Started:      Sun, 12 Dec 2021 18:58:20 +0800
    Ready:          True
    Restart Count:  0
    Environment:
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-pxmm6 (ro)
Conditions:
  Type              Status
  Initialized       True
  Ready             True
  ContainersReady   True
  PodScheduled      True
Volumes:
  default-token-pxmm6:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-pxmm6
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:
Tolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  10m   default-scheduler  Successfully assigned test1/helloworld to k8s-woker-01
  Normal  Pulling    10m   kubelet            Pulling image "nginx"
  Normal  Pulled     10m   kubelet            Successfully pulled image "nginx" in 4.762471154s
  Normal  Created    10m   kubelet            Created container helloworld
  Normal  Started    10m   kubelet            Started container helloworld

3.2.3 修改pod

  1. 使用命令修改

    使用 kubectl edit 命令直接修改对应的pod信息即可

$ kubectl edit po/helloworld -n test1
  1. 使用资源模板

    直接修改资源模板 my-pod.yaml,修改完执行apply操作

$ kubectl apply -f my-pod.yaml

3.2.4 删除pod

  1. 使用命令删除
$ kubectl delete po/helloworld -n test1
  1. 使用资源文件
$ kubectl delete -f my-pod.yaml

3.2.5 查看pod日志

  • -f :监听pod日志
  • –tail:输出最近的20条日志
$ kubectl logs -f po/helloworld --tail=20 -n test1

3.2.6 进入pod

$ kubectl exec -it po/helloworld -n test1 -- /bin/bash

4. 生命周期

Pod 在其生命周期中只会被调度一次。 一旦 Pod 被调度(分派)到某个节点,Pod 会一直在该节点运行,直到 Pod 停止或者 被终止。

Pod 自身不具有自愈能力。如果 Pod 被调度到某节点而该节点之后失效,Pod 会被删除;类似地,Pod 无法在因节点资源 耗尽或者节点维护而被驱逐期间继续存活。Kubernetes 使用一种高级抽象 来管理这些相对而言可随时丢弃的 Pod 实例,称作 控制器。

5. 容器重启策略

Pod 的 spec 中包含一个 restartPolicy 字段,其可能取值包括 Always、OnFailure 和 Never。默认值是 Always。

restartPolicy 适用于 Pod 中的所有容器。 restartPolicy 仅针对同一节点上 kubelet 的容器重启动作。当 Pod 中的容器退出时, kubelet 会按指数回退 方式计算重启的延迟(10s、20s、40s、…),其最长延迟为 5 分钟。 一旦某容器执行了 10 分钟并且没有出现问题, kubelet 对该容器的重启回退计时器执行 重置操作。

6. pod 模板

apiVersion: v1            //版本
kind: pod                 //类型,pod
metadata:                 //元数据
  name: String            //元数据,pod的名字
  namespace: String       //元数据,pod的命名空间
  labels:                 //元数据,标签列表
    - name: String        //元数据,标签的名字
  annotations:            //元数据,自定义注解列表
    - name: String        //元数据,自定义注解名字
spec:                     //pod中容器的详细定义
  containers:             //pod中的容器列表,可以有多个容器
  - name: String
    image: String         //容器中的镜像
    imagesPullPolicy: [Always|Never|IfNotPresent]//获取镜像的策略
    command: [String]     //容器的启动命令列表(不配置的话使用镜像内部的命令)
    args: [String]        //启动参数列表
    workingDir: String    //容器的工作目录
    volumeMounts:         //挂载到到容器内部的存储卷设置
    - name: String
      mountPath: String
      readOnly: boolean
    ports:                //容器需要暴露的端口号列表
    - name: String
      containerPort: int  //容器要暴露的端口
      hostPort: int       //容器所在主机监听的端口(容器暴露端口映射到宿主机的端口)
      protocol: String
    env:                  //容器运行前要设置的环境列表
    - name: String
      value: String
    resources:            //资源限制
      limits:
        cpu: Srting
        memory: String
      requeste:
        cpu: String
        memory: String
    livenessProbe:         //pod内容器健康检查的设置
      exec:
        command: [String]
      httpGet:             //通过httpget检查健康
        path: String
        port: number
        host: String
        scheme: Srtring
        httpHeaders:
        - name: Stirng
          value: String
      tcpSocket:           //通过tcpSocket检查健康
        port: number
      initialDelaySeconds: 0//首次检查时间
      timeoutSeconds: 0     //检查超时时间
      periodSeconds: 0      //检查间隔时间
      successThreshold: 0
      failureThreshold: 0
      securityContext:      //安全配置
        privileged: falae
    restartPolicy: [Always|Never|OnFailure]//重启策略
    nodeSelector: object    //节点选择
    imagePullSecrets:
    - name: String
    hostNetwork: false      //是否使用主机网络模式,默认否
  volumes:                  //在该pod上定义共享存储卷
  - name: String
    meptyDir: {}
    hostPath:
      path: string
    secret:                 //类型为secret的存储卷
      secretName: String
      item:
      - key: String
        path: String
    configMap:             //类型为configMap的存储卷
      name: String
      items:
      - key: String
        path: String

Original: https://www.cnblogs.com/ludangxin/p/15680672.html
Author: 张铁牛
Title: Kubernetes-Pod

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581161/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 随机生成数组+冒泡排序

    示例如下: public class MaoPaoPaiXu { public static int[] mp(int[] nums) { for (int i = 0; i &l…

    Java 2023年6月6日
    098
  • Java实现两种队列(数组和链表)

    @date 2022-09-13 17:50*/public class QueueLinked{ private static class Node{E item;Node ne…

    Java 2023年6月15日
    069
  • java基础篇 —— int和Integer有什么区别

    int和Integer的区别 1 、类型不同:Integer 是对象类型,int 是基本数据类型。Integer 是int 的包装类。 2 、Integer 变量需要实例化之后才能…

    Java 2023年6月5日
    086
  • nginx实现虚拟主机

    博客园 :当前访问的博文已被密码保护 请输入阅读密码: Original: https://www.cnblogs.com/chrdai/p/11324388.htmlAuthor…

    Java 2023年5月30日
    069
  • 设计模式 — Flyweight(享元模式)

    享元模式(Flyweight) 运用共享技术有效地支持大量的细粒度对象 在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行是代价——主要指内…

    Java 2023年6月16日
    068
  • 如何基于Security实现OIDC单点登录?

    一、说明 本文主要是给大家介绍 OIDC 的核心概念以及如何通过对 Spring Security 的授权码模式进行扩展来实现 OIDC 的单点登录。 OIDC 是 OpenID …

    Java 2023年6月6日
    079
  • Aop-Transaction事物

    事物注解:@Transactional 事物举例: sql: undefined DROP TABLE IF EXISTS account;CREATE TABLE account…

    Java 2023年6月5日
    059
  • java关于for循环的效率优化

    循环作为三大结构之一,我们在编写代码的时候使用频率非常的高;循环结构的重要性也是不言而喻的,他让我们操作数组、集合和其他一些有规律的事物变得更加的方便,但是如果运用不得当,就会给性…

    Java 2023年5月29日
    059
  • Java中使用java.awt.geom.Point2D进行坐标相关的计算(距离、平方等)

    在Java中需要对坐标点进行一些计算和判断。 比如计算两点之间的距离、距离的平方、两点是否相等、坐标赋值、克隆等。 可以使用Java自带的java.awt.Point2D的相关AP…

    Java 2023年5月29日
    064
  • [学习笔记] Java变量和常量

    根据变量指代的数据类型的不同, Java中的变量分为基本类型变量和引用类型变量。变量必须先声明后使用。声明格式: type为数据类型,identifier为变量名。若要同时声明多个…

    Java 2023年6月5日
    059
  • Java实现动态数组【数据结构与算法】

    1、数组 类型固定、长度固定 连续的内存空间 顺序存储、随机读取 查询快、新增删除慢。 最好初始化的时候就指定数组大小。这样就可以避免一定的数组扩容出现的内存消耗。 import …

    Java 2023年6月15日
    067
  • Spring Boot快速开发Web项目

    我们以前使用Spring框架的时候,需要首先在pom文件中增加对相关的的依赖,然后新建Spring相关的xml文件,而且往往那些xml文件还不会少。然后继续使用tomcat或者je…

    Java 2023年5月30日
    070
  • Spring系列19:SpEL详解

    本文内容 SpEL概念 快速入门 关键接口 全面用法 bean定义中使用 SpEL概念 Spring 表达式语言(简称”SpEL”)是一种强大的表达式语言,…

    Java 2023年6月5日
    086
  • 准备好写播客的准备:Markdown基础语法

    Markdown学习 标题 一级标题 二级标题 三级标题 字体 Hello,World! Hello,World! Hello,World! Hello,World! 引用 引用内…

    Java 2023年6月6日
    078
  • AOP

    AOP AOP的入门案例: AOP的工作流程 SpringAop的本质是:代理模式 AOP的切入点表达式 重用切入点表达式: ①声明 @Pointcut(“execut…

    Java 2023年6月16日
    058
  • Java(15)Object类

    Object类是Java中所有类的始祖,在Java中每个类都扩展了Object。如果没有明确地指出超类,Object就被认为是这个类的超类。由于在Java中每个类都是由Object…

    Java 2023年6月9日
    054
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球