【云原生】Kubernetes(k8s)之Pod概念和使用
k8s之Pod概念和使用
- 一、Pod简介
- 1.1、Pod的阶段(状态)
- 1.2、容器状态
- 二、Pod的定义
- 2.1、restartPolicy
- 2.2、imagePullPolicy
- 2.3、command
- 2.4、args
- 2.5、resources
- 三、Pod的使用
- 3.1、创建并访问Pod
- 3.2、多个应用容器
- 3.3、Init容器
- 3.3.1、Init容器与普通容器的区别
- 3.3.2、Init容器的使用
- 3.4、容器的生命周期处理函数
一、Pod简介
Pod是可以在Kubernetes中创建和管理的最小可部署单元。Pod是一组(一个或多个)容器的打包,这一组容器共享存储、网络;pod中的容器地位均等且一同调度,在共享的上下文中运行。这些容器在业务上是紧密耦合在一起的。
Pod就像一台“逻辑主机”为这一组紧密相关的容器提供运行上下文。Pod除了正常运行的业务容器外还可以在启动期间运行Init容器。也可以在集群支持临时容器的情况下,以调试为目的注入临时容器。
1.1、Pod的阶段(状态)
通过kubectl get pod -o yaml 查看pod的信息,其中status.phase字段表示该pod的阶段。 通过kubectl describe pod 查看pod详情,其中State字段表示该pod的状态(阶段)。
kubectl get pod -o yaml
kubectl describe pod
阶段(状态) | 描述 |
---|---|
Pending | Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。 |
Running | Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。 |
Succeeded | Pod 中的所有容器都已成功终止,并且不会再重启。 |
Failed | Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。 |
Unknown | 因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败 |
1.2、容器状态
状态值 | 描述 |
---|---|
Waiting | 如果容器并不处在 Running 或 Terminated 状态之一,它就处在 Waiting 状态。处于 Waiting 状态的容器仍在运行它完成启动所需要的操作。使用 kubectl 来查询包含 Waiting 状态的容器的 Pod 时,会看到一个 Reason 字段,其中给出了容器处于等待状态的原因 |
Running | Running 状态表明容器正在执行状态并且没有问题发生。 如果配置了 postStart回调,那么该回调已经执行且已完成。 如果使用 kubectl 来查询包含 Running 状态的容器的 Pod 时,也会看到 关于容器进入 Running 状态的信息。 |
Terminated | 处于 Terminated 状态的容器已经开始执行并且正常结束或者因为某些原因失败。如果使用 kubectl 来查询包含 Terminated 状态的容器的 Pod 时,会看到 容器进入此状态的原因、退出代码以及容器执行期间的起止时间。 |
二、Pod的定义
myhello-pod.yaml配置文件配置:
apiVersion: v1
kind: Pod
metadata:name: myhello-podnamespace: defaultlabels:name: myhello-podenv: dev
spec:restartPolicy: Alwayscontainers:- name: myhelloimage: nongtengfei/hello:1.0.0imagePullPolicy: IfNotPresentports:- containerPort: 80command: ["./app"]args: ["--param1=k8s-p1", "--param2=k8s-p2"]resources:limits:cpu: 200mmemory: 500Mirequests:cpu: 100mmemory: 200Mienv: # 注入到容器的环境变量- name: env1value: "k8s-env1"- name: env2value: "k8s-env2"
关键词的解释如下:
2.1、restartPolicy
容器重启策略,可选值为:Always、Never、OnFailure,默认值为 Always。restartPolicy 适用于 Pod中的所有容器。当pod中的容器退出时,kubelet 会按指数回退 方式计算重启的延迟(10s、20s、40s、…),其最长延迟为 5 分钟。 一旦某容器执行了 10 分钟并且没有出现问题,kubelet 对该容器的重启回退计时器执行重置操作。
2.2、imagePullPolicy
镜像拉取策略,可选值为:Always、Never、IfNotPresent,默认为:Always。
- Always: 表示每次都尝试重新拉取镜像。
- Never:表示从不拉取镜像,仅使用本地镜像。
- IfNotPresent:表示如果本地有该镜像,这使用该镜像;如果本地没有该镜像这拉取镜像。
2.3、command
指定容器启动命令,若未指定该值则默认为镜像中指定的启动命令。
2.4、args
容器启动命令参数,若未指定则该值默认为容器镜像中指定的启动参数。
2.5、resources
容器使用资源设置。
- requests:表示为容器分配最低资源配额
- limits:表示容器可使用的最高资源配额,一旦容器资源的使用超出了该配置,那么容器将会被杀死。
- CPU资源单位:Kubernetes将1CPU以1000m来表示,CPU的最小资源单位为m,1m表示千分之一CPU。通常一个容器使用的CPU配额为100m~ 300m。
- 内存资源单位:例如:Ei、Pi、Ti、Gi、Mi、Ki,与通常使用的空间单位一致。
三、Pod的使用
3.1、创建并访问Pod
(1)创建pod。
kubectl create -f myhello-pod.yaml
(2)访问pod中的容器。
# 通过端口转发来查看该pod是否可以正常提供服务
kubectl port-forward pod/myhello-pod 5000:80
# 通过curl访问,该pod,查看其环境变量、启动参数等信息是否生效
curl http://localhost:5000/print/env
curl http://localhost:5000/print/startup
3.2、多个应用容器
(1)定义。
apiVersion: v1
kind: Pod
metadata:name: myhello-podnamespace: defaultlabels:name: myhello-podenv: dev
spec:restartPolicy: Alwayscontainers:- name: myhelloimage: nongtengfei/hello:1.0.0imagePullPolicy: IfNotPresentports:- containerPort: 80command: ["./app"]args: ["--param1=k8s-p1", "--param2=k8s-p2"]resources:limits:cpu: 200mmemory: 500Mirequests:cpu: 100mmemory: 200Mienv: # 注入到容器的环境变量- name: env1value: "k8s-env1"- name: env2value: "k8s-env2"- name: myredis #容器的名称image: redis #容器对应的 Docker ImageimagePullPolicy: IfNotPresentports:- containerPort: 6379resources:limits:cpu: 200mmemory: 500Mirequests:cpu: 100mmemory: 200Mi
# 根据文件删除资源
kubectl delete -f myhello-pod.yaml
# 根据文件应用资源
kubectl apply -f myhello-pod.yaml
(2)访问pod中的容器。
# 通过端口转发来查看该pod是否可以正常提供服务
kubectl port-forward pod/myhello-pod 5001:80 5002:6379 --address 192.168.0.142 --address localhost
# 访问myhello容器
curl http://localhost:5001/ping
# 访问redis,通过新创建一个其他redis,然后通过其他redis的客户端访问上面redis-server
kubectl run myredis --image=redis
# 进入redis交互
kubectl exec -it pod/myredis -- /bin/bash
# 以转发的地址和端口访问
redis-cli -h 192.168.0.142 -p 5002
# 以pod ip 访问
redis-cli -h <podIP> -p 6379
3.3、Init容器
3.3.1、Init容器与普通容器的区别
Init 容器是一种特殊容器,在 Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。
每个 Pod 中可以包含多个容器, 应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
如果 Pod 的 Init 容器失败,kubelet 会不断地重启该 Init 容器直到该容器成功为止。 然而,如果 Pod对应的 restartPolicy 值为 “Never”,并且 Pod 的 Init 容器失败, 则 Kubernetes 会将整个 Pod 状态设置为失败。
Init 容器与普通容器的区别:
- 它们总是运行到完成,即init容器提供的不是通过守护进程提供服务,而是通过启动容器来执行处理任务,当任务处理完成容器即完成。
- 每个都必须在下一个启动之前成功完成,多个init容器按定义的顺序一次执行。
- 只有当所有init容器完成时,Kubernetes才会为Pod初始化应用容器。
3.3.2、Init容器的使用
init 容器的特殊性,依次执行、容器必须来到完成状态、init容器完成后才会启动应用容器。
(1)定义。
apiVersion: v1
kind: Pod
metadata:name: myhello-podnamespace: defaultlabels:name: myhello-podenv: dev
spec:restartPolicy: AlwaysinitContainers:- name: init-myserviceimage: busybox
# 查找命名空间下myservice服务,如果存在则执行成功,如果不存在则一直查找command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]- name: init-mydbimage: busybox
# 查找命名空间下mydb服务,如果存在则执行成功,如果不存在则一直查找command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]containers:- name: myhelloimage: nongtengfei/hello:1.0.0imagePullPolicy: IfNotPresentports:- containerPort: 80command: ["./app"]args: ["--param1=k8s-p1", "--param2=k8s-p2"]resources:limits:cpu: 200mmemory: 500Mirequests:cpu: 100mmemory: 200Mienv: # 注入到容器的环境变量- name: env1value: "k8s-env1"- name: env2value: "k8s-env2"- name: myredis #容器的名称image: redis #容器对应的 Docker ImageimagePullPolicy: IfNotPresentports:- containerPort: 6379resources:limits:cpu: 200mmemory: 500Mirequests:cpu: 100mmemory: 200Mi
(2)创建容器。
# 删除原有pod
kubectl delete -f myhello-pod.yaml
# 重新应用
kubectl apply -f myhello-pod.yaml
(3)获取pod,可以看到pod一直处于init阶段。
# 获取pod
kubectl get -f myhello-pod.yaml
(4)查看pod详情。
kubectl describe -f myhello-pod.yaml
输出详细信息,pod状态为Pending,容器状态:仅init-myservice 为running,其他容器均为:Waiting。
(5)查看容器日志。
kubectl logs -f myhello-pod -c init-myservice
(6) 创建myservice服务。
内容:
apiVersion: v1
kind: Service
metadata:name: myservice
spec:ports:- protocol: TCPport: 80
kubectl create -f myservice.yaml
(7)查看pod状态,容器日志。
kubectl get -f myhello-pod.yaml
kubectl describe -f myhello-pod.yaml
kubectl logs -f myhello-pod -c init-mydb
(8)创建mydb服务。
apiVersion: v1
kind: Service
metadata:name: mydb
spec:ports:- protocol: TCPport: 80
kubectl create -f mydb.yaml
(9)查看pod状态,容器日志。
kubectl get -f myhello-pod.yaml
kubectl describe -f myhello-pod.yaml
kubectl logs -f myhello-pod -c init-mydb
以上示例可以看出:
- init容器按定义顺序依次执行。
- init容器的启动命令必须为有执行结果的命令,否则init容器将无法来到完成状态。
- init容器全部完成之后才会初始化应用程序容器(普通容器)。
3.4、容器的生命周期处理函数
Kubernetes 支持 postStart 和 preStop 事件。 当一个容器启动后,Kubernetes 将立即发送 postStart事件;在容器被终结之前, Kubernetes 将发送一个 preStop 事件。容器可以为每个事件指定一个处理程序。
apiVersion: v1
kind: Pod
metadata:name: myhello-podnamespace: defaultlabels:name: myhello-podenv: dev
spec:restartPolicy: AlwaysinitContainers:- name: init-myserviceimage: busybox# 查找命名空间下myservice服务,如果存在则执行成功,如果不存在则一直查找command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]- name: init-mydbimage: busybox# 查找命名空间下mydb服务,如果存在则执行成功,如果不存在则一直查找command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]containers:- name: myhelloimage: nongtengfei/hello:1.0.0imagePullPolicy: IfNotPresentports:- containerPort: 80command: ["./app"]args: ["--param1=k8s-p1", "--param2=k8s-p2"]resources:limits:cpu: 200mmemory: 500Mirequests:cpu: 100mmemory: 200Mienv: # 注入到容器的环境变量- name: env1value: "k8s-env1"- name: env2value: "k8s-env2"lifecycle:postStart:exec:command: ["/bin/sh", "-c","echo post start command exec >> /tmp/data"]preStop:exec:command: ["/bin/sh", "-c","echo pre stop command exec >> /tmp/data"]- name: myredis #容器的名称image: redis #容器对应的 Docker ImageimagePullPolicy: IfNotPresentports:- containerPort: 6379- resources:limits:cpu: 200mmemory: 500Mirequests:cpu: 100mmemory: 200Mi
kubectl delete -f myhello-pod.yaml
kubectl apply -f myhello-pod.yaml
# 使用shell 连接到pod中的容器
kubectl exec -it pod/myhello-pod -c myhello -- sh
# 查看postStart处理函数写入的文本
cat /tmp/data
相关文章:

【云原生】Kubernetes(k8s)之Pod概念和使用
k8s之Pod概念和使用一、Pod简介1.1、Pod的阶段(状态)1.2、容器状态二、Pod的定义2.1、restartPolicy2.2、imagePullPolicy2.3、command2.4、args2.5、resources三、Pod的使用3.1、创建并访问Pod3.2、多个应用容器3.3、Init容器3.3.1、Init容器与普通容器…...

数组(九)-- LC[316][321][402] 去除重复字母
1 移掉 K 位数字 1.1 题目描述 题目链接:https://leetcode.cn/problems/remove-k-digits/ 1.2 思路分析 这道题让我们从一个字符串数字中删除 k 个数字,使得剩下的数最小。也就说,我们要保持原来的数字的相对位置不变。 以题目中的 num1432…...

ubuntu下Thrift安装
thrift是一种常用rpc框架,工作中经常会用到,本文记录一下其安装过程。 目录 1.下载软件包 1.1thrift下载 1.2libevent下载 1.3boost下载 2.安装(注意步骤) 2.1安装libevent 2.2安装boost 2.3安装与Python2.7版本对应的py…...

读懂AUTOSAR :DiagnosticLogAndTrace DLT(四)-- API解析
一、周期调用的函数:Dlt_TxFunction 根据参数DltGeneralTrafficShapingSupport,决定如何去发送DLT消息。如果为TRUE,那需要参考参数DltLogChannelTrafficShapingBandwidth为每个Log通道设置发送带宽;如果为FALSE,那么…...

【LeetCode】剑指 Offer 56. 数组中数字出现的次数 p275 -- Java Version
1. 题目介绍(56. 数组中数字出现的次数) 面试题56.:数组中数字出现的次数, 一共分为两小题: 题目一:数组中只出现一次的两个数字题目二:数组中唯一只出现一次的数字 2. 题目1:数组中…...

Zookeeper集群 + Fafka集群
目录 第一章Zookeeper 概述 1.1.Zookeeper 定义 1.2.Zookeeper 工作机制 1.3.Zookeeper 特点 1.4.Zookeeper 数据结构 1.5.Zookeeper 应用场景 1.6.Zookeeper 原理之选举机制 1.7.部署 Zookeeper 集群 总结 第二章消息队列概述 2.1消息队列需求原因 2.2消息队列的优…...
全国青少年电子信息智能创新大赛(复赛)python·模拟四卷
目录 一、编程题 答案解析如下: 下载文档打印做题: 全国青少年电子信息智能创新大赛(复赛)python模拟四卷 一、编程题 第一题:描述 班上有学生若干名,给出每名学生的年龄《整数),求班上所有学生的平均年龄,保留到小数点后两企 输入 第一行有一个整数n (1<= n...
Redis - 介绍与使用场景
简介 Redis 的全称是 Remote Dictionary Server,是一个使用 C 语言编写的、开源的(BSD 许可)高性能非关系型(NoSQL)的键值对数据库。 Redis 的数据是存储在内存中的,所以读写速度非常快,被广泛…...

Spark SQL实战(07)-Data Sources
1 概述 Spark SQL通过DataFrame接口支持对多种数据源进行操作。 DataFrame可使用关系型变换进行操作,也可用于创建临时视图。将DataFrame注册为临时视图可以让你对其数据运行SQL查询。 本节介绍使用Spark数据源加载和保存数据的一般方法,并进一步介绍…...
Django DRF - 权限Permissions
权限Permissions 权限控制可以限制用户对于视图的访问和对于具体数据对象的访问。 在执行视图的dispatch()方法前,会先进行视图访问权限的判断在通过get_object()获取具体对象时,会进行对象访问权限的判断 1.提供的权限 AllowAny 允许所有用户IsAuth…...

二叉树(OJ)
单值二叉树(力扣) ---------------------------------------------------哆啦A梦的任意门------------------------------------------------------- 我们来看一下题目的具体要求: 既然我们都学了二叉树了,我们就应该学会如何去…...

mysql中增删改成的练习
文章目录一、表的创建1.student表的数据2、课程表的数据course3、学生成绩表的数据二、操作序列1、查询计算机系cs的全体学生学号、姓名和性别2、检索选修了课程号为2的学生号和姓名3、检索至少选修了三门课以上的学生号4、检索选修了全部课程的学生5、在原表的基础上创建一个视…...

谈一谈Java的ThreadLocal
目录 先说原理: 再上代码: 运行结果: 先说原理: ThreadLocal 是一个本地线程副本变量工具类,它可以在每个线程中创建一个副本变量,每个线程可以独立地修改自己的副本变量,而不会影响其他线程…...
边缘检测与阈值分割
Canny [1] Canny Edge Detection. https://docs.opencv.org/3.4/da/d22/tutorial_py_canny.html [2] OpenCV Edge Detection ( cv2.Canny ). https://pyimagesearch.com/2021/05/12/opencv-edge-detection-cv2-canny/ 由John F. Canny提出 1、由于边缘检测容易受噪声影响&…...
QQ空间无敌装逼,复制下面的任一代码粘贴即可出现意想不到的图案。
复制下面的任一代码粘贴即可出现意想不到的图案。 打赏代码: [em]e10033[/em]{uin:123,nick: 打赏了你一个冰淇淋,who:1} [em]e10033[/em] 打赏了100000000000.00元红包 [em]e10011[/em] 赞代码:{uin:0000,nick: xx、xx、xx、xx、xx、xx、xx、xx、xx、xx、xx、x…...
必看!总结5种JavaScript异步解决方案
1.回调 回调简单地理解为一个函数作为参数传递给另一个函数,回调是早期最常用的异步解决方案之一。 回调不一定是异步的,也不直接相关。 举个简单的例子: function f1(cb) {setTimeout(() > {cb && cb();}, 2000); }f1(() >…...

JUC并发编程高级篇第四章之ThreadLocal(人手一份,天下安)
文章目录1、ThreadLocal的简介1.1、常见的面试题(也是本次的讲解的内容)1.2、什么是ThreadLocal1.3、ThreadLocal的所用1.4、没有出现ThreadLocal前后的变化1.5、ThreadLocal代码示例1.6、阿里巴巴对ThreadLocal的使用要求1.7、ThreadLocal的源码分析2、ThreadLocal…...

dump 定位分析
在缺少pdb的时候如何分析dump? windbgidaWindbg定位崩溃位置 通过windbg打开dump,并且分析dump !analyze -v 分析: 分析dump: !analyze -v错误原因:读取空指针错误线程:00001e04,可通过命令…...

(十二)排序算法-插入排序
1 基本介绍 1.1 概述 插入排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。 插入排序的工作方式非常像人们排序一手扑克牌一样。开始时,我们的左手为空并且桌子上的牌面朝下。然后,…...
elasticsearch 认知
1.大数据领域需要解决以下三个问题 如何存储数据 传统的关系数据库(MySQL、Oracle、和Access等)主导了20世纪的数据存储模式,但当数据量达到太字节级,甚至拍字节级时,关系型数据库表现出了难以解决的瓶颈问题。为了解决…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

LabVIEW双光子成像系统技术
双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制,展现出显著的技术优势: 深层组织穿透能力:适用于活体组织深度成像 高分辨率观测性能:满足微观结构的精细研究需求 低光毒性特点:减少对样本的损伤…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...

小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
2.2.2 ASPICE的需求分析
ASPICE的需求分析是汽车软件开发过程中至关重要的一环,它涉及到对需求进行详细分析、验证和确认,以确保软件产品能够满足客户和用户的需求。在ASPICE中,需求分析的关键步骤包括: 需求细化:将从需求收集阶段获得的高层需…...

未授权访问事件频发,我们应当如何应对?
在当下,数据已成为企业和组织的核心资产,是推动业务发展、决策制定以及创新的关键驱动力。然而,未授权访问这一隐匿的安全威胁,正如同高悬的达摩克利斯之剑,时刻威胁着数据的安全,一旦触发,便可…...