分享
  1. 首页
  2. 文章

k8s核心技术-Pod篇

王知晓 · · 1983 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Pod详解

Pod介绍

Pod 是k8s的重要概念,要掌握

每个Pod都有一个特殊的被称为"根容器"的Pause容器

Pause容器对应的镜像属于k8s平台的一部分,除了Pause容器还包含一个或多个紧密相关的业务容器

Pod图示:

  • Pod VS 应用

    每个Pod都是应用的一个实例,有专用的IP

  • Pod VS 容器

    一个Pod可以有多个容器,彼此间共享网络和存储资源

    每个Pod中有一个Pause容器保存所有的容器状态,通过管理Pause容器,达到管理Pod中所有容器的效果

  • Pod VS 节点

    同一个Pod中的容器总会被调用到相同的Node节点,不同节点Pod的通信基于虚拟二层网络技术实现

  • Pod VS Pod

    普通的Pod 和静态Pod

Pod 定义

通过yaml文件格式定义pod

yaml格式校验工具

Pod使用

在k8s中对运行的容器要求为:

容器的主程序需要一直在前台运行,而不是后台运行

所以应用需要改造成前台运行的方式

如果我们创建的docker 镜像的启动命令是后台执行程序,则kubelet创建包含这个容器的pod

之后运行该命令,即认为Pod已经结束,将立刻销毁该Pod.

如果该Pod定义了RC,则创建、销毁会陷入一个无限循环的过程中

Pod可以由1个或多个容器组合而成

  • 一个容器组成的pod

    demo1.yaml

    apiVersion: v1
    kind: Pod
    metadata:
     name: mytomcat
     labels: 
     name: mytomcat
    spec:
     containers:
     - name: mytomcat
     image: tomcat
     ports:

创建pod:

[root@laptop tmp]# kubectl create -f demo1.yaml
pod/mytomcat created


查看pod:

[root@laptop tmp]# kubectl get pods //或者kubectl get po
NAME READY STATUS RESTARTS AGE
mytomcat 0/1 ContainerCreating 0 2m30s

[root@laptop tmp]# kubectl describe po mytomcat //查看特定的name


删除pod:

[root@laptop tmp]# kubectl delete -f demo1.yaml

[root@laptop tmp]# kubectl delete pod --all/[pod_name]


* 多个容器组成的pod
demo2.yaml

apiVersion: v1
kind: Pod
metadata:

name: myweb
labels: 
 name: tomcat-redis

spec:

containers:
- name: tomcat
 image: tomcat
 ports:
 - containerPort: 8000
- name: redis
 image: redis
 ports:
 - containerPort: 6379

## Pod分类
### 普通Pod 
普通pod 一旦被创建,就会被放入到etcd中存储,随后会被k8s master调度到某个具体的Node上并进行绑定,随后该pod对应的Node上的kubelet进程实例化成一组相关的docker容器并启动起来
在默认情况下,当pod里某个容器停止时,k8s会自动检测到这个问题并且重新启动这个pod里所有容器。
如果该pod所在的Node当机,则会将这个Node上所有的pod重新调度到其他节点上
### 静态Pod
静态pod是由kubelet进行管理的仅存在于特定Node上的pod,它们不能通过API Server进行管理。
无法与RC(replicationController)、Deployment和DaemonSet进行关联,并且kubelet也无法对它们进行健康检测
## Pod生命周期和重启策略
### Pod状态
| 状态值 | 说明 |
| --------- | ------------------------------------------------------------------------------------ |
| Pending | API Server已经创建了该pod,但Pod中的一个或多个容器的镜像还没有创建,包括镜像下载过程 |
| Running | Pod 内所有容器已创建,且至少一个容器处于运行状态,正在启动状态或正在重启状态 |
| Completed | Pod内所有容器均成功执行退出,且不会再重启 |
| Failed | Pod内所有容器均已退出,但至少一个容器退出失败 |
| Unknown | 由于某种原因无法获取Pod状态,例如网络通信不通 |
### Pod重启策略
重启策略包括Always, OnFailure和Never , 默认是Always
| 重启策略 | 说明 |
| --------- | ------------------------------------------------------ |
| Always | 当容器失效时,由kubelet自动重启该容器 |
| OnFailure | 当容器终止运行且退出码不为0时,由kubelet自动重启该容器 |
| Never | 不论容器运行状态如何,kubelet都不会重启该容器 |
## Pod资源配置
每个Pod都可以对其能使用的服务器上的计算资源设置限额,
**`k8s中可以设置限额的计算资源有CPU和Memory两种`**
其中CPU的资源单位是CPU数量,是一个绝对值而非相对值
Memory配置也是一个绝对值,它的单位是字节数
k8s中,一个计算资源进行配置需要设定两个参数:
* requests 表示该资源最小申请数量,系统必须满足要求
* limits表示该资源最大允许使用的量,不能突破,该容器使用超过这个量的资源时,会被k8s kill并重启
看一个例子:

spec:
container:

  • name: db
    image: mysql
    resources:

    requests:
     memory: "64Mi"
     cpu: "250m"
    limits:
     memory: "128Mi"
     cpu: "500m"

上面的代码表示mysql容器申请至少0.25个cpu和64MiB内存

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:王知晓

查看原文:k8s核心技术-Pod篇

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
1983 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏