Mr. Cappuccino的第39杯咖啡——Kubernetes之深入理解Pod

news2024/11/18 18:42:52

Kubernetes之深入理解Pod

      • Pod相关概念
      • Pod详细配置清单
      • Pod核心配置
        • Pod基本配置
          • 1. 创建yaml文件
          • 2. 创建namespace并根据yaml文件创建资源
          • 3. 查看namespace下的pod列表以及pod的详细信息
        • Pod中多个容器的名称和端口号不能相同
        • Pod镜像拉取策略
        • Pod环境变量
        • Pod端口相关设置
        • Pod资源相关配置
        • Pod启动命令配置

Pod相关概念

  1. Pod实际上是容器的集合,是k8s中最小调度单元;
  2. 一个Pod里面可以有n多个不同的容器;
  3. 一个Pod内的容器之间共享相同的Pod Ip网络;
  4. Pause容器,这是每个Pod都会有的一个根容器;
  5. 可以在根容器上设置ip地址,其它容器都共享相同Ip (Pod IP),以实现Pod内部的网路通信,Pod内部的通讯,Pod的之间的通讯采用虚拟二层网络技术来实现。

在这里插入图片描述

Pod详细配置清单

apiVersion: v1      #必填,版本号,例如v1
kind: Pod           #必填,资源类型,例如Pod、service、Deployment
metadata:           #必填,元数据
  name: pod-name    #必填,Pod名称
  namespace: namespace-name #Pod所属的命名空间, 默认为"default"
  labels:           #自定义标签列表
    - name: v1
spec:               #必填,Pod中容器的详细定义
  containers:       #必填,Pod中容器列表
    - name: container-name  #必填,容器名称
      image: nginx:1.7.9 #必填,容器的镜像名称
      imagePullPolicy: [ Always|Never|IfNotPresent] #获取镜像的策略
      command: [string]  #容器的启动命令列表,如不指定,使用打包时使用的启动命令
      args: [string]     #容器的启动命令参数列表
      workingDir: string #容器的工作目录
      volumeMounts:      #挂载到容器内部的存储卷配置
      - name: string     #引用Pod定义的共享存储卷的名称,需用volumes[ ]部分定义的卷名
        mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
        read0nly: boolean #是否为只读模式
      ports:              #需要暴露的端口库号列表
      - name: string      #端口的名称
        containerPort: int #容器需要监听的端口号
        hostPort: int   #容器所在主机需要监听的端口号,默认与Container相同
        protocol: string  #端口协议,支持TCP和UDP,默认TCP
      env:      #容器运行前需设置的环境变量列表
      - name: string    #环境变量名称
        value: string #环境变量的值
      resources: #资源限制和请求的设置
        limits:  #资源限制的设置
          cpu: string  #Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
          memory: string #内存限制,单位可以为Mib/Gib,将用于docker run --memory参数
        requests: #资源请求的设置
          cpu: string     #Cpu请求,容器启动的初始可用数量
          memory: string  #内存请求,容器启动时的初始可用数量
      lifecycle: #生命周期钩子
          postStart: #容器启动后立即执行此钩子,如果执行失败,会根据重启策略进行重启
          preStop:   #容器终止前执行此钩子,无论结果如何,容器都会终止
      livenessProbe: #对Pod内各容器健康检查的设置,当探测无响应几次后将自动重启该容器
        exec:        #对Pod容器内检查方式设置为exec方式
          command: [string] #exec方式需要制定的命令或脚本
        httpGet:     #对Pod内容器健康检查方法设置为HttpGet,需要制定path、port
          path: string
          port: number
          host: string
          scheme: string
          HttpHeaders:
          - name: string
            value: string
        tcpSocket: #对Pod内容器健康检查方式设置为tcpSocket方式
           port: number
apiVersion: v1 # 必选,API的版本号
kind: Pod      # 必选,类型Pod
metadata:      # 必选,元数据即基础信息
name: nginx    # 必选,符合RFC 1035规范的Pod名称
namespace: web-testing # 可选,不指定默认为default,Pod所在的命名空间
labels:        # 可选,标签选择器,一般用于Selector
- app: nginx
annotations:   # 可选,注释列表
- app: nginx
spec:          # 必选,用于定义容器的详细信息
containers:    # 必选,容器列表
name: nginx    # 必选,符合RFC 1035规范的容器名称
image: nginx:v1 # 必选,容器所用的镜像地址
imagePullPolicy: Always # 可选,镜像拉取策略
镜像拉取策略分三种:
Always 不管镜像存不存在本地都拉取(默认)
Nerver 不管镜像存不存在本地都不拉取
IfNotpresent 本地有镜像不拉取,没有就拉取
workingDir: /usr/share/nginx/html # 可选,容器的工作目录
volumeMounts: # 可选,存储卷配置
name: webroot # 存储卷名称
mountPath: /usr/share/nginx/html # 挂载目录
readOnly: true # 只读
ports: # 可选,容器需要暴露的端口号列表
name: http # 端口名称
containerPort: 80 # 端口号
protocol: TCP # 端口协议,默认TCP
env: # 可选,环境变量配置
name: TZ # 变量名
value: Asia/Shanghai
name: LANG
value: en_US.utf8
resources: # 可选,资源限制和资源请求限制
limits: # 最大限制设置
cpu: 1000m
memory: 1024MiB
requests: # 启动所需的资源
cpu: 100m
memory: 512MiB
readinessProbe: # 可选,容器状态检查
httpGet: # 检测方式
path: /  # 检查路径
port: 80 # 监控端口
timeoutSeconds: 2 # 超时时间
initialDelaySeconds: 60 # 初始化时间
livenessProbe: # 可选,监控状态检查
exec:    # 检测方式
command:
- cat
- /health
httpGet: # 检测方式
path: /_health
port: 8080
httpHeaders:
- name: end-user
value: jason
tcpSocket: # 检测方式
port: 80
initialDelaySeconds: 60 # 初始化时间
timeoutSeconds: 2 # 超时时间
periodSeconds: 5 # 检测间隔
successThreshold: 2 # 检查成功为2次表示就绪
failureThreshold: 1 # 检测失败1次表示未就绪
securityContext:    # 可选,限制容器不可信的行为
provoleged: false
restartPolicy: Always # 可选,默认为Always
nodeSelector: # 可选,指定Node节点
region: subnet7
imagePullSecrets: # 可选,拉取镜像使用的secret
name: default-dockercfg-86258
hostNetwork: false # 可选,是否为主机模式,如是,会占用主机端口
volumes: # 共享存储卷列表
name: webroot # 名称,与上述对应
emptyDir: {} # 共享卷类型,空
hostPath: # 共享卷类型,本机目录
path: /etc/hosts
secret: # 共享卷类型,secret模式,一般用于密码
secretName: default-token-tf2jp # 名称
defaultMode: 420 # 权限
configMap: # 一般用于配置文件
name: nginx-conf
defaultMode: 420

Pod核心配置

Pod基本配置

1. 创建yaml文件

文件名称:pod.yaml

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: nginx-pod
  namespace: bubble-dev
  labels:
    user: v1 # 标签值
spec:
  containers:
  - name: nginx   # 容器1
    image: nginx:1.17.9
  - name: tomcat  # 容器2
    image: tomcat:8
2. 创建namespace并根据yaml文件创建资源
kubectl create ns bubble-dev
kubectl create -f pod.yaml
3. 查看namespace下的pod列表以及pod的详细信息
kubectl get pods -n bubble-dev
kubectl describe pods -n bubble-dev

在这里插入图片描述
说明pod运行在192.168.102.160这台工作节点上

[root@master ~]# kubectl describe pods -n bubble-dev
Name:         nginx-pod
Namespace:    bubble-dev
Priority:     0
Node:         node1/192.168.102.160
Start Time:   Thu, 12 Jan 2023 08:34:01 -0500
Labels:       user=v1
Annotations:  <none>
Status:       Running
IP:           172.17.0.2
IPs:
  IP:  172.17.0.2
Containers:
  nginx:
    Container ID:   docker://53e89cea6f2dab821a4f274be8b6fa60e39cde65dd7ecd9d3786c2618f5be6db
    Image:          nginx:1.17.9
    Image ID:       docker-pullable://nginx@sha256:88ea86df324b03b3205cbf4ca0d999143656d0a3394675630e55e49044d38b50
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Thu, 12 Jan 2023 08:34:03 -0500
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-lnn96 (ro)
  tomcat:
    Container ID:   docker://bd2b47f17f18a5983dcb0e2c2da60a96bd016da8c2eb644b095430b1f9132884
    Image:          tomcat:8
    Image ID:       docker-pullable://tomcat@sha256:421c2a2c73f3e339c787beaacde0f7bbc30bba957ec653d41a77d08144c6a028
    Port:           <none>
    Host Port:      <none>
    State:          Running
      Started:      Thu, 12 Jan 2023 08:34:58 -0500
    Ready:          True
    Restart Count:  0
    Environment:    <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-lnn96 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  default-token-lnn96:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-lnn96
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type    Reason     Age    From               Message
  ----    ------     ----   ----               -------
  Normal  Scheduled  2m26s  default-scheduler  Successfully assigned bubble-dev/nginx-pod to node1
  Normal  Pulled     2m25s  kubelet, node1     Container image "nginx:1.17.9" already present on machine
  Normal  Created    2m25s  kubelet, node1     Created container nginx
  Normal  Started    2m24s  kubelet, node1     Started container nginx
  Normal  Pulling    2m24s  kubelet, node1     Pulling image "tomcat:8"
  Normal  Pulled     90s    kubelet, node1     Successfully pulled image "tomcat:8"
  Normal  Created    90s    kubelet, node1     Created container tomcat
  Normal  Started    89s    kubelet, node1     Started container tomcat
curl 172.17.0.2
curl 172.17.0.2:8080

在这里插入图片描述

Pod中多个容器的名称和端口号不能相同

名称不能相同

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: pod
  namespace: bubble-dev
  labels:
    user: v1 # 标签值
spec:
  containers:
  - name: nginx # 容器1
    image: nginx:1.17.9
  - name: nginx # 容器2
    image: nginx:1.17.9

在这里插入图片描述

端口号不能相同

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: pod
  namespace: bubble-dev
  labels:
    user: v1 # 标签值
spec:
  containers:
  - name: nginx1 # 容器1
    image: nginx:1.17.9
  - name: nginx2 # 容器2
    image: nginx:1.17.9

在这里插入图片描述

在这里插入图片描述
其中nginx2由于端口号被占用无法启动,一直在重试启动
在这里插入图片描述
在这里插入图片描述

Pod镜像拉取策略

  1. Always:每次都是从远程仓库拉取镜像
  2. IfNotPresent:如果本地有该镜像则使用本地,如果本地没有该镜像则使用远程
  3. Never:只使用本地镜像,不去远程仓库拉取,本地没有该镜像则会报错

yaml配置清单实例:

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: pod-name
  namespace: bubble-dev
  labels:
    user: v1 # 标签值
spec:
  containers:
  - name: nginx # 容器名称
    image: nginx:1.17.9
    imagePullPolicy: IfNotPresent # 用于设置镜像拉取策略

Pod环境变量

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: pod-env
  namespace: bubble-dev
  labels:
    user: v1 # 标签值
spec:
  containers:
  - name: nginx # 容器名称
    image: nginx:1.17.9
    env: # 设置环境变量列表
    - name: "username"
      value: "honey"
    - name: "age"
      value: "22"

在这里插入图片描述
进入容器

kubectl exec -it pod的名称 -n 命名空间 -c 容器名称 /bin/sh
kubectl exec -it pod-env -n bubble-dev -c nginx /bin/sh

读取环境变量

echo $username
echo $age

在这里插入图片描述
退出容器

exit

在这里插入图片描述

Pod端口相关设置

name <string> # 端口的名称,name在pod中是唯一的,不允许重复
containerPort <integer> # 容器要暴露的端口 (0<x<65536)
hostPort <integer> # 容器要映射到主机上的端口
hostIP <string> # 容器要映射到主机的IP(一般省略)
protocol <string> # 端口协议,必须是UDP、TCP或SCTP,默认为“TCP"
apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: pod-port
  namespace: bubble-dev
  labels:
    user: v1 # 标签值
spec:
  containers:
  - name: nginx # 容器名称
    image: nginx:1.17.9
    ports: # 设置容器暴露的端口号列表
    - name: expose-port
      containerPort: 80
      protocol: TCP

在这里插入图片描述
在这里插入图片描述

Pod资源相关配置

可以通过资源配置Pod对应的cpu核数、内存配置等

  1. limits:限制容器运行时的最大占用资源,当容器占用资源超过limits设置的值时会被终止,并进行重启;
  2. requests:用于设置限制容器需要的最小资源,如果环境资源不够,容器则将无法启动
    cpu:核心数
    memory:内存大小,可以使用Gi、Mi、G、M等形式

资源不够无法启动案例

apiVersion: v1
kind: Pod # 类型为pod
metadata:
  name: pod-resource
  namespace: bubble-dev
  labels:
    user: v1 # 标签值
spec:
  containers:
  - name: nginx # 容器名称
    image: nginx:1.17.9
    resources: # 资源配额
      limits:  # 最大资源限制
        cpu: "2" # 限制CPU核心线程数
        memory: "10Gi" # 内存限制
      requests: # 最小资源限制
        cpu: "1" # CPU限制,单位是core数
        memory: "10Gi" # 内存限制

在这里插入图片描述
在这里插入图片描述

Pod启动命令配置

容器启动成功之后 可以执行一些脚本

apiVersion: v1
kind: Pod
metadata:
  name: pod-command-test
  namespace: bubble-dev
spec:
  containers:
  - name: busybox
    image: busybox:1.30

在这里插入图片描述
在这里插入图片描述
查看pod信息,busybox停止了
在这里插入图片描述
这是因为busybox容器启动后,它会自动关闭,我们可以通过启动命令写脚本,让busybox一直在运行。

apiVersion: v1
kind: Pod
metadata:
  name: pod-command
  namespace: bubble-dev
spec:
  containers:
  - name: busybox
    image: busybox:1.30
    command: [ "/bin/sh","-c","while true;do  sleep 3; done;"]

“/bin/sh”,“-c”:使用sh执行命令
“while true;do sleep 3; done;”:一直死循环,为了避免cpu飙高的问题 休眠3s时间

在这里插入图片描述
在这里插入图片描述
可以发现,busybox仍在运行。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

echarts修改饼图,环形图的圆环宽度,大小

echarts修改环形图的圆环宽度&#xff0c;大小 环形图圆环的大小需要通过series-pie. radius属性来修改 radius 饼图的半径。 Array.<number|string>&#xff1a;数组的第一项是内半径&#xff0c;第二项是外半径。每一项遵从上述 number string 的描述。 把数组的第…

前端高频面试题—JavaScript篇(四)

&#x1f4bb; 前端高频面试题—JavaScript篇&#xff08;四&#xff09;&#x1f3e0;专栏&#xff1a;前端面试题 &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享方向…

150家半导体企业IPO最新进展(附企业名录)

前言 根据Omdia的数据显示&#xff0c;2022年全球在第一季度、第二季度、第三季度实现的半导体收入分别为1593亿美元、1581亿美元、1470亿美元&#xff0c;分别环比下降0.03%、1.9%、7.0%。 目前&#xff0c;半导体产业链经历了自2022上半年的欣欣向荣&#xff0c;到2022年下半…

万字长文掌握Python高并发

文章目录0 前言1 并发、并行、同步、异步、阻塞、非阻塞1.1 并发1.2 并行1.3 同步1.4 异步1.5 阻塞1.6 非阻塞2 多线程2.1 Python线程的创建方式2.1.1 方式一2.1.2 方式二 继承Thread2.1.3 通过线程池创建多线程2.2 聊聊GIL2.2.1 Python线程与操作系统线程的关系2.3 线程同步2.…

【CICD】Jenkins 部署 Docker 容器形态的后端服务

在实现 Jenkins 构建部署前端项目之后&#xff0c;逐渐对使用 Jenkins 部署后端服务有了一定兴趣&#xff1b;总体流程没有什么很大的变化&#xff0c;不过是后端服务需要以 Docker 的形式进行启动&#xff0c;在此记录一下具体过程&#xff08;部分过程与构建部署前端相同不做…

windows下载安装jdk1.8(jdk8)基础篇

一、前言 目前jdk最高升级到JDK19版本了&#xff0c;但是大部分应用系统都是用的1.8&#xff0c;对于初学者来说&#xff0c;也需要下载安装这个版本的jdk。 二、下载安装步骤 一、我已经下载下来&#xff0c;大家到【我的下载目录】下载&#xff0c;密码3360&#xff0c;分…

使用Benchto框架对Trino进行SQL性能对比测试

有时需要对魔改源码前后的不同版本Trino引擎进行性能对比测试&#xff0c;提前发现改造前后是否有性能变差或变好的现象&#xff0c;避免影响数据业务的日常查询任务性能。而Trino社区正好提供了一个性能测试对比框架&#xff1a;GitHub - trinodb/benchto: Framework for runn…

金额大写转换

金额大写转换&#xff08;C语言 &#xff09; 本人喜欢探索各种算法。见站内好多此类文章&#xff0c;有些很好&#xff0c;有些不完整。姑且也来凑下热闹。 金额大写应用在很多方面&#xff0c;如支票、发票、各种单据&#xff0c;各种财务凭证&#xff0c;合同文本金额部分。…

【逐步剖C】-第七章-数据的存储

一、数据类型介绍 1. C语言基本内置类型&#xff1a; char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点数 double //双精度浮点数2. 类型的基本归类 &#xff08;1&#xff09;整型&#xff1a; charunsign…

c语言指针

指针 指针是存放地址的变量&#xff0c;也可以说指针地址。 对于定义p&#xff08;这里的话&#xff0c;只是定义&#xff0c;说明p是指针&#xff09;&#xff0c;p作为一个指针去指向存放数据的位置&#xff0c;而p意思是取&#xff08;p指向的内存位置的数据&#xff09;&…

es启动,浏览器无法访问9200

通过brew成功启动es&#xff0c;但是访问http://localhost:9200/报错&#xff0c;连接被拒绝 %:brew services start elasticsearch-full> Successfully started elasticsearch-full (label: homebrew.mxcl.elasticsearc可能原因如下&#xff1a; 1、安装java 要先安装ja…

聊聊async/await原理

前言 我们知道Promise的出现极大地解决了回调地狱&#xff0c;但是如果使用流程非常复杂的话&#xff0c;就非常容易过多地调用Promise的then()方法&#xff0c;这样也不利于使用和阅读。 例如&#xff1a;我希望在请求 www.baidu.com 后输出请求的结果&#xff0c;再去请求 …

【基于腾讯云的远程机械臂小车】

1. 项目来源 项目源码地址&#xff1a;https://gitcode.net/VOR234/robot_arm_car/-/blob/master/TencentOS-tiny123.zip https://gitee.com/vor2345/robot_arm_car 程序分别 视频演示&#xff1a;https://www.bilibili.com/video/BV15M4y1D7MD/?vd_source530bf85167de80ff…

46.在ROS中实现global planner(2)

前文实现了一个global planner的模板&#xff0c;并且可以工作&#xff0c;本文将实现astar算法&#xff0c;为后续完成一个astar global planner做准备 1. AStar简介 1.1 AStar Astar算法是一种图形搜索算法,常用于寻路。Astar算法原理网上可以找到很多&#xff0c;简单的说…

企业/品牌新闻稿怎么写?

撰写出优质的企业/品牌新闻稿对于任何一个希望通过新闻媒体推广自己品牌的公司来说都是十分重要的。在新闻稿中&#xff0c;您可以通过介绍自己的公司&#xff0c;披露最新的产品和服务信息以及宣传最新的成就来吸引媒体和读者的关注。下面是一些关于如何撰写出优质的企业/品牌…

【工具篇】Firmwalker车联网实用小工具介绍

前言 firmwalker这个小工具在工作中也一直在用&#xff0c;正好领导说要写一篇这个工具的分析说明文章&#xff0c;经过询问可以发表博客。由于一直在用&#xff0c;所以末尾优劣势部分存在一些主观想法。 编写不易&#xff0c;如果能够帮助到你&#xff0c;希望能够点赞收藏加…

SpringCloud, SpringCloud-Alibaba,Nacos概述

目录 SpingCloud概述 1.SpringCloud是什么? 2.SpringCloud和SpringBoot的关系 3.SpringCloud-Alibaba概述 3.1.Netflix公司项目进入维护模式 3.2.Spring Cloud Alibaba是什么&#xff1f; 3.3.Spring Boot和Spring Cloud的版本号说明 3.Nacos总结 SpingCloud概述 1.Spri…

蓝桥杯刷题——基础篇(一)

这部分题目&#xff0c;主要面向有志参加ACM与蓝桥杯竞赛的同学而准备的&#xff0c;蓝桥杯与ACM考察内容甚至评测标准基本都一样&#xff0c;因此本训练计划提供完整的刷题顺序&#xff0c;循序渐进&#xff0c;提高代码量&#xff0c;巩固基础。因竞赛支持C语言、C、Java甚至…

【JAVA八股文】算法、数据结构、基础设计模式

算法、数据结构、基础设计模式1. 二分查找2. 冒泡排序3. 选择排序4. 插入排序5. 希尔排序6. 快速排序7. ArrayList8. Iterator9. LinkedList10. HashMap1&#xff09;基本数据结构2&#xff09;树化与退化3&#xff09;索引计算4&#xff09;put 与扩容5&#xff09;并发问题6&…

从lettcue插件看skywalking

lettcue 的写操作是异步的。io.lettuce.core.RedisChannelWriter.write进行写入&#xff0c;io.lettuce.core.protocol.RedisCommand进行异步读取数据 skywalking 插件大体逻辑 在方法执行前&#xff0c;通过ContextManager创建span创建span的同时&#xff0c;判断trace上下文…