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提供了面 ...
随机推荐
- CF1443A Kids Seating 题解
Content 有 \(t\) 组询问,每组询问给定一个数 \(n\),试构造出一个长度为 \(n\) 的数列 \(\{a_i\}_{i=1}^n\),使得: \(\forall i\in[1,n], ...
- Tornado 异步浅解
7.1 认识异步 1. 同步 我们用两个函数来模拟两个客户端请求,并依次进行处理: #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Time: 202 ...
- JAVA工具类获取HttpServletRequest、HttpServletResponse 对象
添加依赖 <!-- Spring Web --> <dependency> <groupId>org.springframework</groupId> ...
- DevOps实战(Docker+Jenkins+Git)
基于Docker+Jenkins+Git的CI/CD实战 与上一篇随笔:基于 Jenkins+Docker+Git 的CI流程初探 有所不同,该内容更偏向于实际业务的基础需求. 有几点需要注意: 该实 ...
- 【LeetCode】144. Binary Tree Preorder Traversal 解题报告(Python&C++&Java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 题目地址:https://leetc ...
- Multiple(poj1465)
Multiple Time Limit: 1000MS Memory Limit: 32768K Total Submissions: 7183 Accepted: 1540 Descript ...
- 云南农业职业技术学院 / 互联网技术学院官网 HTML5+CSS3
HTML学完后写了,有小组成员参与开发,我只写了主页,那就只贴主页的代码出来了. 作为初学者,代码写得不太好,写博客纯属记录!有问题望指导! 码云开源仓库地址:https://gitee.com/yn ...
- CF149D游戏
题目描述 Petya遇到了一个关于括号序列的问题: 给定一个字符串S,它代表着正确的括号序列,即("(")与 (")")是匹配的.例如:"(())() ...
- Springboot项目引入druid安装部署使用
一.maven引入依赖,数据库驱动根据项目需求自行引入 <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot ...
- 初识python: 斐波拉契数(生成器获取)
使用 生成器(yield) 获取斐波拉契数. 代码如下: def fun(n): a,b,c = 0,0,1 while a < n: yield b # b, c = c, b + c 以下 ...