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标记:

  1. 不同功能的横向维度
  2. 不同版本的纵向维度

关于Label的几种应用场景

  1. kube-controller进程通过资源对象RC上定义的Label Selector来筛选要监控的Pod副本的数量,从而实现Pod副本的数量始终符合预期设定的全自动控制流程。

  2. 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
    ......
    ---
  3. 通过对某些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最小执行单元的更多相关文章

  1. 为什么Kubernetes使用Pod作为最小调度单元

    一.Pod说明 Pod只是一个逻辑概念,一个原子调度单位,其优势在于 可以统一调度一组容器到指定的node上 共享资源,Pod的容器可以使用localhost进行通信,使用volume进行文件共享.使 ...

  2. CPU的最小执行单位是线程,协程不需要qt支持...直接用现成的协程库就行了

    协程也就在I/O操作上才有优势,Qt事件循环,本事很多I/O已经是异步了,利用好异步(虽然都说异步有点反人类思维).因为CPU的执行最小单位是线程,协程也只是在其之上又调度而已. 我的意思是利用好异步 ...

  3. Kubernetes Controller执行框架解析

    毫无疑问,声明式API以及Controller机制是Kubernetes设计理念的基础.Controller不断从API Server同步资源对象的期望状态并且在资源对象的期望状态和实际运行状态之间进 ...

  4. 第三章--Win32程序的执行单元(部分概念及代码讲解)(上 -- 多线程)

    学习<Windows程序设计>记录 概念贴士: 1. 线程描述了进程内代码的执行路径. 2. _stdcall是新标准C/C++函数的调用方法.从底层来说,使用这种调用方法参数的进栈顺序和 ...

  5. 使用maven执行单元测试总结

    maven本身没有单元测试框架,但是maven的default生命周期的test阶段绑定了maven-surefire-plugin插件,该插件可以调用Junit3.Junit4.TestNG等Jav ...

  6. 测者的测试技术手册:Junit执行单元测试用例成功,mvn test却失败的问题和解决方法

    今天遇见了一个奇怪的问题,在IDE中run unit test,全部cases都成功了,但是后来通过mvn test运行case确保错了.在寻求原因的同时也找到了对应的解决方法. Run Unit T ...

  7. kubernetes实践之三:深入理解Pod对象

    一.Pod定义 最小部署单元 一组容器集合 一个pod中的容器共享网络命名空间 Pod是短暂的 二.Pod容器分类 基础容器 维护整个Pod的网络命名空间 初始化容器 先于业务容器开始执行,在应用启动 ...

  8. Docker集群管理工具 - Kubernetes 部署记录 (运维小结)

    一.  Kubernetes 介绍 Kubernetes是一个全新的基于容器技术的分布式架构领先方案, 它是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernete ...

  9. 01 . 容器编排简介及Kubernetes核心概念

    Kubernetes简介 Kubernetes是谷歌严格保密十几年的秘密武器-Borg的一个开源版本,是Docker分布式系统解决方案.2014年由Google公司启动. Kubernetes提供了面 ...

随机推荐

  1. Python3 json &pickle 数据序列化

    json 所有语言通用的信息交换格式 json.dumps()将list列表.dict字典.元组.函数等对象转换为可以存储的字符格式存入文件 json.dump(数据对象名,已以写方式打开的对象) 直 ...

  2. Spring Boot新增一个YML配置文件,并进行加载

    我们在同级目录下增加 然后增加一个配置类 SpringBootConfiguration.java import org.springframework.beans.factory.config.Ya ...

  3. office2007(word2007)另存为pdf文档

    默认office2007(word2007)是没有另存为pdf文档的功能的,需要安装插件 插件地址:https://yvioo.lanzous.com/iO5myedoceh 下载之后直接安装,安装成 ...

  4. mac osx 准备 nanogui 记录

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist mac osx : 10.14.6 Mojave. 之前没有配置openGL相关开发环境,自 ...

  5. 【LeetCode】1408. 数组中的字符串匹配 String Matching in an Array

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 暴力遍历 日期 题目地址:https://leetco ...

  6. 【九度OJ】题目1056:最大公约数 解题报告

    [九度OJ]题目1056:最大公约数 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1056 题目描述: 输入两个正整数,求 ...

  7. 【LeetCode】638. Shopping Offers 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 DFS 回溯法 日期 题目地址:https://le ...

  8. 【LeetCode】558. Quad Tree Intersection 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  9. Balancing Act(poj1655)

    Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12703   Accepted: 5403 De ...

  10. FreeBSD 物理机下显卡的配置

    FreeBSD 已从 Linux 移植了显卡驱动,理论上,A 卡 N 卡均可在 amd64 架构上正常运行. 支持情况 对于 FreeBSD 11,支持情况同 Linux 内核 4.11: 对于 Fr ...