Pod:Kubernetes最小执行单元
Pod基本概念理解
Pod是什么
Pod 是 Kubernetes 应用程序的基本执行单元,它是 Kubernetes 对象模型中创建或部署的最小和最简单的单元。
一个Pod可以包括一个或者多个容器。当一个pod包含多个容器时,这些容器总是运行于同一个工作节点上,一个pod绝不会跨越多个工作节点。
为什么需要Pod
由上面可以知道,一个Pod由一个或多个容器构成,那这里首先需要问一个问题:为何多个容器(每个容器单进程)比单个容器包含多个进程要好?
我们可以这样想,一个容器相当于一台独立的机器,而这台机器运行多个进程是利索当然的,我们现在电脑也是这样做的。容器被设计为每个容器只运行一个进程(除非进程本身产生子进程)。像上面那样一个机器里运行多个进程,记录每个进程运行的日志信息是我们必须要做的事情。这些进程的日志是记录到相同的标准输出中,此时我们很难确定每个进程分别发生了什么,所以要让每个进程运行在自己的容器中。这也是Kubernetes和Docker期望做的事情。
由于不能将多个进程聚集在一个单独的容器中,我们需要另一种更高级的结构来将单进程的多个容器绑定在一起提供服务,并将它们作为一个单元进行管理,这就是为什么需要Pod的原因。
通过Pod合理管理容器
将多层应用分散到多个pod中:
如果前端和后端都在同一个容器中,那么两者将始终在同一台节点上运行;如果你有一个双节点Kubemetes集群, 而只有一个单独的pod,那么你将始终只会用一个工作节点,而不会充分利用第二个节点上的计算资源(CPU和内存)。因此更合理的做法是将pod拆分到两个工作节点上,允许Kubemetes将前端安排到一个节点, 将后端安排到另一个节点, 从而提高基础架构的利用率。
基于扩缩容(scaling)考虑而分割到多个pod中:
对应K8s来说,不能横向的scale 容器,只能scale pod。此时,如果你的frontend,backend容器属于同一个Pod,k8s scale pod为2个pod,此时你就有了两个frontend,backend容器。但真实情况是,你想要两个backend,一个frontend。通常情况也是这样,frontend和backend有不同的scaling需求,就不能放在一个Pod里。
何时在Pod中使用多个容器:
这个Pod由,一个主进程和多个辅进程构成。
决定两个容器放入一个pod中还是两个单独的pod,我们需要考虑以下问题:
- 它们需要一起运行还是可以在不同的主机上运行?
- 它们代表的是一个整体还是相互独立的组件?
- 它们必须一起进行扩缩容(scaling)还是可以分别进行?
Pod 配置清单
manifest是我们经常会遇到的,特别是 config manifest :配置清单。
在准备manifest时,这里有个非常好用的工具,以pod为例:
kubectl explain pod
:配置清单KIND: Pod
VERSION: v1 DESCRIPTION:
Pod is a collection of containers that can run on a host. This resource is
created by clients and scheduled onto hosts
FIELDS:
apiVersion <string>
...
kind <string>
...
metadata <Object>
...
spec <Object>
...
status <Object>
...kubectl explain pod.metadata
:配置清单里每一项的明细kubectl explain pod.spec.nodeSelector
:具体到某一项
运行中的Pod Yaml情况
一个正在运行的pod的完整描述包括三大重要部分,也几乎在所有Kubemetes资源中都可以找到的三大重要部分:
- metadata 包括名称、命名空间、标签和关于该容器的其他信息。
- spec (specification) 包含pod的明细,例如pod的容器、卷和其他数据。
- status包含运行中的pod的当前信息,Pod中包含每个容器的信息和状态。
一个正在运行的pod的完整描述,其中包含了它的状态。status部分包含只读的运行时数据,该数据展示了这个时刻的资源状态。而在创建新的pod时,并不需要提供status部分。
定义一个简单的Pod Yaml
这是由一个容器构成的Pod,myapp.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod # Pod name
namespace: myapp
labels:
app: myapp
spec:
containers:
- name: myapp-container # 容器的name
image: busybox:latest
ports:
- containerPort: 8888 # 容器监听的端口
protocol: TCP
command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']
- 使用这个yaml文件
kubectl apply -f myapp.yaml
与Pod通信的两种方式
1. 通过Service服务发现,Service请看这里。
2. 通过port-forward方式:
具体使用方式:kubectl port-forward -h
# Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in the pod
kubectl port-forward pod/mypod 5000 6000
# Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in a pod selected by the
deployment
kubectl port-forward deployment/mydeployment 5000 6000
# Listen on ports 5000 and 6000 locally, forwarding data to/from ports 5000 and 6000 in a pod selected by the service
kubectl port-forward service/myservice 5000 6000
# Listen on port 8888 locally, forwarding to 5000 in the pod
kubectl port-forward pod/mypod 8888:5000
# Listen on port 8888 on all addresses, forwarding to 5000 in the pod
kubectl port-forward --address 0.0.0.0 pod/mypod 8888:5000
# Listen on port 8888 on localhost and selected IP, forwarding to 5000 in the pod
kubectl port-forward --address localhost,10.19.21.23 pod/mypod 8888:5000
# Listen on a random port locally, forwarding to 5000 in the pod
kubectl port-forward pod/mypod :5000
按需组织Pod
使用Label组织Pod
引入Label的意义
下面这么多pod,功能上有相同有不同的:
使用Label标记:
- 不同功能的横向维度
- 不同版本的纵向维度
关于Label的几种应用场景
kube-controller进程通过资源对象RC上定义的Label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量始终符合预期设定的全自动控制流程。
kupe-proxy进程通过Service的Label Selector来选择对应的Pod,自动建立器每个Service到对应Pod的请求转发路由表,从而实现Service的智能负载均衡机制。
---
apiVersion: v1
kind: Pod
metadata:
labels: # pod设置label
app: myapp
......
---
apiVersion: v1
kind: Service
metadata:
......
spec:
selector: # service中选择这个label
app: myapp
......
---
通过对某些Node定义特定的Label,并且在Pod定义文件中使用NodeSelector这种标签调度策略,Kube-scheduler进程可以实现Pod定向调度的特性。
# 给node打标签之后,再用nodeSelector指定
kubectl label nodes node1 myapp.node/whoesnode=mynode
与Label使用的相关命令
- 增 Label
kubectl label pods <pod-name> <label-key>=<label-value>
- 删 Label
kubectl label pods <label-key>- # 后面是一个 减号
- 查 Label
kubectl get pods --show-labels
kubectl get pods -l mylabel=label1 # 通过label1查pods
kubectl get pods -l mylabel='!label1' # 查排出label1的pods
kubectl get pods -A -L LABEL1,LABEL2
确保使用单引号来圈引电nv, 这样bashshell才不会解释感叹号(感叹号在bash中有特殊含义,表示事件指示器)
- 改 Label
kubectl label pods <pod-name> <label-key>=<new-value> --overwrite
使用Namespace组织Pod
使用Namespace组织Pods,往往这些Pod是处在同一个项目下的。
其他:
查Pod日志
kubectl logs podname -c containername
:查看当前pod的某一容器日志。
但在某些情况下:有个容器因为某些故障被重新调度了,你想知道为什么前一个pod终止了,所以你想看的是前一个容器的日志,而不是当前容器的。
kubectl logs mypod --previous
Pod:Kubernetes最小执行单元的更多相关文章
- 为什么Kubernetes使用Pod作为最小调度单元
一.Pod说明 Pod只是一个逻辑概念,一个原子调度单位,其优势在于 可以统一调度一组容器到指定的node上 共享资源,Pod的容器可以使用localhost进行通信,使用volume进行文件共享.使 ...
- CPU的最小执行单位是线程,协程不需要qt支持...直接用现成的协程库就行了
协程也就在I/O操作上才有优势,Qt事件循环,本事很多I/O已经是异步了,利用好异步(虽然都说异步有点反人类思维).因为CPU的执行最小单位是线程,协程也只是在其之上又调度而已. 我的意思是利用好异步 ...
- Kubernetes Controller执行框架解析
毫无疑问,声明式API以及Controller机制是Kubernetes设计理念的基础.Controller不断从API Server同步资源对象的期望状态并且在资源对象的期望状态和实际运行状态之间进 ...
- 第三章--Win32程序的执行单元(部分概念及代码讲解)(上 -- 多线程)
学习<Windows程序设计>记录 概念贴士: 1. 线程描述了进程内代码的执行路径. 2. _stdcall是新标准C/C++函数的调用方法.从底层来说,使用这种调用方法参数的进栈顺序和 ...
- 使用maven执行单元测试总结
maven本身没有单元测试框架,但是maven的default生命周期的test阶段绑定了maven-surefire-plugin插件,该插件可以调用Junit3.Junit4.TestNG等Jav ...
- 测者的测试技术手册:Junit执行单元测试用例成功,mvn test却失败的问题和解决方法
今天遇见了一个奇怪的问题,在IDE中run unit test,全部cases都成功了,但是后来通过mvn test运行case确保错了.在寻求原因的同时也找到了对应的解决方法. Run Unit T ...
- kubernetes实践之三:深入理解Pod对象
一.Pod定义 最小部署单元 一组容器集合 一个pod中的容器共享网络命名空间 Pod是短暂的 二.Pod容器分类 基础容器 维护整个Pod的网络命名空间 初始化容器 先于业务容器开始执行,在应用启动 ...
- Docker集群管理工具 - Kubernetes 部署记录 (运维小结)
一. Kubernetes 介绍 Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernete ...
- 01 . 容器编排简介及Kubernetes核心概念
Kubernetes简介 Kubernetes是谷歌严格保密十几年的秘密武器-Borg的一个开源版本,是Docker分布式系统解决方案.2014年由Google公司启动. Kubernetes提供了面 ...
随机推荐
- android 基于dex的插件化开发
安卓里边可以用DexClassLoader实现动态加载dex文件,通过访问dex文件访问dex中封装的方法,如果dex文件本身还调用了native方法,也就间接实现了runtime调用native方法 ...
- Java网络多线程编程:对象流错误导致Connection reset
Java网络多线程编程--对象流错误导致Connection reset 在老韩的网络多线程编程实战项目中,发生了如下报错: 服务器端和客户端均发生了报错,在确定相应对象流代码完全没有问题之后,回归定 ...
- CF1469D Ceil Divisions 题解
Content 你有一个长度为 \(n\) 的数组 \(a\),初始时,\(\forall i\in[1,n]\),\(a_i=i\). 每次操作选择两个数 \(x,y(1\leqslant x,y\ ...
- CF1427A Avoiding Zero 题解
Content 请将一个长度为 \(n\) 的数列 \(A\) 重新排序,使得这个数列所有的前缀和 \(\neq 0\),或者证明没有这样的方案. 数据范围:\(t\) 组数据,\(1\leqslan ...
- 10分钟快速上车短视频风口:基于uniapp框架创建自己的仿抖音短视APP
在今年也就是第48次发布的<中国互联网络发展状况统计报告>有这样一个数据,21年的上半年以来,我国我国网民规模达10.11亿,其中短视频用户达8.88亿.碎片化的生活场景下,短视频成为人们 ...
- Linux使用docker安装MinIO
官方地址:http://docs.minio.org.cn/docs/master/minio-docker-quickstart-guide 拉取镜像 docker pull minio/minio ...
- git 添加.gitignore文件不生效
git rm -r --cached . #新增的忽略文件没有生效,是因为git是有缓存的,而之前的文件在缓存中,并不会清除掉,还会继续提交,所以更新.gitignore文件,要清除缓存文件 git ...
- 关于编写c++动态库常用的定义
1. 关于 1.1 最近一段时间,写了不少动态库,慢慢的也积累了东西. 1.2 之前一直做Windows的动态库,没有做过Linux和OS X的动态库,太缺乏经验了: 代码缺乏 编译器支持的判断.缺乏 ...
- 【LeetCode】456. 132 Pattern 解题报告(Python)
[LeetCode]456. 132 Pattern 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fu ...
- C. The Meaningless Game
C. The Meaningless Game 题目链接 题意 给你两个数,开始都为1,然后每轮可以任选一个k,一边可以乘以\(k\),另一边乘以\(k^2\),然后问你最终是否可以得到所给的两个数a ...