k8s学习 - 概念 - Pod
k8s学习 - 概念 - Pod
这篇继续看概念,主要是 Pod 这个概念,这个概念非常重要,是 k8s 集群的最小单位。
怎么才算是理解好 pod 了呢,基本上把 pod 的所有 describe 和配置文件的配置项都能看懂就算是对 pod 比较了解了。
Pod
我们通过调用一个kubectl describe pod xxx 可以查看某个 pod 的具体信息。
describe 的信息我们用注释的形式来解读。
Name: task-pv-pod
Namespace: default // 没有指定namespace的就是default
Node: docker-for-desktop/192.168.65.3 // Pod所在的节点
Start Time: Mon, 08 Jul 2019 14:05:52 +0800 // pod启动的时间
Labels: <none> // 说明没有设置标签
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"task-pv-pod","namespace":"default"},"spec":{"containers":[{"image":"nginx","name":... // 注释信息
Status: Running // pod的状态
IP: 10.1.0.103 // pod的集群ip
Containers: // 其中包含的容器
task-pv-container:
Container ID: docker://3e9a2ee6b0a13ccee534ec3ffe781adcbff42a7f1851d57e3b374a047a654590
Image: nginx // 容器镜像名称
Image ID: docker-pullable://nginx@sha256:96fb261b66270b900ea5a2c17a26abbfabe95506e73c3a3c65869a6dbe83223a
Port: 80/TCP
Host Port: 0/TCP
State: Running
Started: Mon, 08 Jul 2019 14:05:58 +0800
Ready: True
Restart Count: 0
Environment: <none>
Mounts: // 这个容器挂载的两个volume
/usr/share/nginx/html from task-pv-storage (rw)
/var/run/secrets/kubernetes.io/serviceaccount from default-token-tw8wk (ro)
Conditions:
Type Status
Initialized True
Ready True
PodScheduled True
Volumes:
task-pv-storage: // 挂载的数据卷
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) // 这个数据卷是共享持久卷
ClaimName: task-pv-claim // 使用的声明
ReadOnly: false // 数据卷是否只读
default-token-tw8wk:
Type: Secret (a volume populated by a Secret) // 这个数据卷是保存密钥
SecretName: default-token-tw8wk
Optional: false
QoS Class: BestEffort // Qos的三个级别,Guaranteed/Burstable/BestEffort,分别对pod的资源限制从严到弱
Node-Selectors: <none> // pod是可以选择部署在哪个node上的,比如部署在有ssd的node上。
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s // 节点亲和性,它使得pod能有倾向性地分配到不同节点上。
node.kubernetes.io/unreachable:NoExecute for 300s
Events: // 这个pod发生的一些事件
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 21s default-scheduler Successfully assigned task-pv-pod to docker-for-desktop
Normal SuccessfulMountVolume 20s kubelet, docker-for-desktop MountVolume.SetUp succeeded for volume "task-pv-volume"
Normal SuccessfulMountVolume 20s kubelet, docker-for-desktop MountVolume.SetUp succeeded for volume "default-token-tw8wk"
Normal Pulling 19s kubelet, docker-for-desktop pulling image "nginx"
Normal Pulled 15s kubelet, docker-for-desktop Successfully pulled image "nginx"
Normal Created 15s kubelet, docker-for-desktop Created container
Normal Started 14s kubelet, docker-for-desktop Started container
下面我们就看 pod 的配置文件。有的时候我们可能会忘记了我们启动的pod的yaml配置文件地址,我们可以通过kubectl get pod task-pv-pod -o=yaml命令来获取某个已经启动的 pod 的配置文件,这里的配置文件会比我们配置的配置项全很多,因为我们写配置文件的时候,很多配置项没有设置实际上就是使用默认的配置值来实现。
kubectl get pod task-pv-pod -o=yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{},"name":"task-pv-pod","namespace":"default"},"spec":{"containers":[{"image":"nginx","name":"task-pv-container","ports":[{"containerPort":80,"name":"http-server"}],"volumeMounts":[{"mountPath":"/usr/share/nginx/html","name":"task-pv-storage"}]}],"volumes":[{"name":"task-pv-storage","persistentVolumeClaim":{"claimName":"task-pv-claim"}}]}}
creationTimestamp: 2019-07-08T06:05:51Z
name: task-pv-pod
namespace: default
resourceVersion: "1439249"
selfLink: /api/v1/namespaces/default/pods/task-pv-pod
uid: 7090642e-a146-11e9-89ff-025000000001
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: task-pv-container
ports:
- containerPort: 80
name: http-server
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /usr/share/nginx/html
name: task-pv-storage
- mountPath: /var/run/secrets/kubernetes.io/serviceaccount
name: default-token-tw8wk
readOnly: true
dnsPolicy: ClusterFirst
nodeName: docker-for-desktop
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
serviceAccount: default
serviceAccountName: default
terminationGracePeriodSeconds: 30
tolerations:
- effect: NoExecute
key: node.kubernetes.io/not-ready
operator: Exists
tolerationSeconds: 300
- effect: NoExecute
key: node.kubernetes.io/unreachable
operator: Exists
tolerationSeconds: 300
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pv-claim
- name: default-token-tw8wk
secret:
defaultMode: 420
secretName: default-token-tw8wk
status:
conditions:
- lastProbeTime: null
lastTransitionTime: 2019-07-08T06:05:52Z
status: "True"
type: Initialized
- lastProbeTime: null
lastTransitionTime: 2019-07-08T06:05:58Z
status: "True"
type: Ready
- lastProbeTime: null
lastTransitionTime: 2019-07-08T06:05:51Z
status: "True"
type: PodScheduled
containerStatuses:
- containerID: docker://3e9a2ee6b0a13ccee534ec3ffe781adcbff42a7f1851d57e3b374a047a654590
image: nginx:latest
imageID: docker-pullable://nginx@sha256:96fb261b66270b900ea5a2c17a26abbfabe95506e73c3a3c65869a6dbe83223a
lastState: {}
name: task-pv-container
ready: true
restartCount: 0
state:
running:
startedAt: 2019-07-08T06:05:58Z
hostIP: 192.168.65.3
phase: Running
podIP: 10.1.0.103
qosClass: BestEffort
startTime: 2019-07-08T06:05:52Z
几个比较复杂的配置项我们单独伶出来理解。
spec.container.imagePullPolicy
spec.container.imagePullPolicy: 这个是容器的镜像获取策略,有几种策略:
- IfNotPresent: 如果本地没有,就去远程 pull 镜像
- Always: 每次pod启动都去远程pull镜像
- Never: 只去本地获取镜像
在局域网本地化搭建镜像的时候,应该设置为 Never 。如果 imagePullPolicy 没有设置,如果设置了镜像的 tag,且 tag 不为 :lastest ,就是相当于使用 IfNotPresent。如果 imagePullPolicy 没有设置,且tag为 :lastest,就相当于是 Always.
spec.container.terminationMessagePath
spec.container.terminationMessagePath: 容器的终止日志文件。
spec.container.volumeMounts
spec.container.volumeMounts 其中一个 /usr/share/nginx/html根据 task-pv-storage 挂载到 task-pv-claim 这个共享存储中。这个pvc 是对应哪个共享存储呢?
我们可以查看 kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
task-pv-claim Bound task-pv-volume 1Gi RWO manual 5h
再通过 kubectl get pv 对应到 pv:
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
task-pv-volume 1Gi RWO Retain Bound default/task-pv-claim manual 5h
再查看这个 pv 的详细情况:kubectl describe pv task-pv-volume
Name: task-pv-volume
Labels: type=local
Annotations: kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"labels":{"type":"local"},"name":"task-pv-volume","namespace":""},"spec":{"ac...
pv.kubernetes.io/bound-by-controller=yes
Finalizers: [kubernetes.io/pv-protection]
StorageClass: manual
Status: Bound
Claim: default/task-pv-claim
Reclaim Policy: Retain
Access Modes: RWO
Capacity: 1Gi
Node Affinity: <none>
Message:
Source:
Type: HostPath (bare host directory volume)
Path: /Users/yejianfeng/Documents/workspace/kubernets_example/data
HostPathType:
Events: <none>
看到这个pv对应的是宿主机 HostPath 中的 /Users/yejianfeng/Documents/workspace/kubernets_example/data 这个目录。
所以共享存储的映射关系是 pod -- volume -- pvc -- pv。
其实这里我们之所以说是共享存储,就是说这个存储应该是一个共享网盘,比如 cephFS,而不应该仅仅只是宿主机上的一个目录。宿主机上的目录只是为了调试方便而已。
说说另外一个 volumeMounts: /var/run/secrets/kubernetes.io/serviceaccount
这个serviceaccount里面存储的是什么呢?我们可以直接kubectl exec -it task-pv-pod -- /bin/sh 到 pod 里面查看
~ kubectl exec -it task-pv-pod -- /bin/sh
# cd /var/run/secrets/kubernetes.io/serviceaccount
# ls
ca.crt namespace token
里面存放的就是 token 。这个 token 是每个 namespace 一个,它表示的是在这个命名空间的用户权限。这个是给 Pod 里面的进程使用的,如果 pod 里面的进程需要调用这个命名空间里面的 K8s 的 api 或者其他服务,它就可以通过获取这个 token 来发起 http/https 的调用。这个 service account 里面存储的 token/ca.crt 就代表这个命名空间的管理员用户。
dnsPolicy
这个是 pod 的 dns 策略,可以设置有如下值:
- Default : 和宿主机的DNS完全一致
- ClusterFirst: 把集群的DNS写入到Pod的DNS配置,但是如果设置了HostNetwork=true,就会强制设置为Default
- ClusterFirstWithHostNet: 把集群的DNS写入到Pod的DNS配置,不管是否设置HostNetwork
- None: 忽略所有的DNS配置,一般来说,设置了None之后会自己手动再设置dnsConfig
这里需要了解,k8s 中的服务发现机制,有几种方式,一种是通过 service ip,一个服务在集群中统一存在一个 clusterIP, 所有其他服务需要使用这个服务的时候,就通过调用这个 clusterIP 来进行访问。另外一种是通过 dns,通过给service 设置 subdomain 来给一个服务设置一个域名,而这个域名解析就需要全集群一致。而这里的 dnsPolicy 就是做这个用处的。
restartPolicy
pod 的状态一共有五种,挂起/运行中/成功/失败/未知。

前一节说node上有个进程 kubelet 会检测当前 node 上的 pod 是否存活,如果检测到容器的状态为失败,那么就会启动重启策略,这个重启策略就是这里 restartPolicy 设置的。
- always: 容器失效时,自动重启容器
- OnFailure: 容器终止运行,且退出码不为0时候重启
- Never: 不重启
这里提到一个退出码,如果这个pod是处于失败状态,那么通过 kubectl describe pod 也是能看到 pod 的退出状态的。这个退出码0为正常,非0是不正常。

schedulerName
上节说过,调度器是在 master 节点,控制 pod 应该在哪个 node 上启动等。这里就是指定调度器的名字。默认是 default。
securityContext
定义容器 pod 或者 container 的权限和访问控制。比如可以控制 pod 使用某个用户来访问其内部的文件,是否开 selinux 等。
serviceAccount
这个概念在 volumeMounts 说过了,存储的是 pod 要访问集群内其他服务的时候的 token。
terminationGracePeriodSeconds
优雅重启,如果 k8s 要升级,或者由于某个原因要重启 pod,那么会先启动新的P od,然后发送 SIGTERM 信号,并且等待 terminationGracePeriodSeconds 个时长,再结束老的 pod。
tolerations
前面也说过,这个是设置 pod 的亲缘性,让调度器把 pod 更好的分配到 node 上去。
status.conditions
这里再提一下 pod 的生命周期,pod 在初始化,到 pending,到分配到 node 的所有过程,都有个记录,这里的 status.conditions 就是这个记录,记录各种状态变更的时间节点:
type字段是一个包含以下可能值的字符串:
- PodScheduled:Pod 已被安排到一个节点;
- Ready:Pod 能够提供请求,应该添加到所有匹配服务的负载均衡池中;
- Initialized:所有 init 容器 都已成功启动;
- Unschedulable:调度程序现在无法调度 Pod,例如由于缺少资源或其他限制;
- ContainersReady:Pod 中的所有容器都已准备就绪。
lastTransitionTime 字段提供 Pod 最后从一个状态转换到另一个状态的时间戳。
qosClass
Qos的三个级别,Guaranteed/Burstable/BestEffort,分别对pod的资源限制从严到弱。
k8s学习 - 概念 - Pod的更多相关文章
- k8s学习 - 概念 - master/node
k8s学习 - 概念 - master/node 在k8s中,有各种各样的概念和术语.这些概念是必须要学习和掌握的.我们先罗列下所有概念,然后再一个个看具体实例. 大概说一下这些概念: Master: ...
- k8s学习 - 概念 - ReplicationController
k8s学习 - 概念 - ReplicationController 我们有了 pod,那么就需要对 pod 进行控制,就是同一个服务的 podv我需要启动几个?如果需要扩容了,怎么办?这里就有个控制 ...
- k8s学习 - 概念 - ReplicaSet
k8s学习 - 概念 - ReplicaSet 首先,ReplicaSet 和 ReplicationController 基本上一样,除了上篇说到的selector有不同之外,没有啥区别.(官网也是 ...
- k8s学习 - 概念 - Deployment
k8s学习 - 概念 - Deployment 有了 ReplicaSet 还需要有 Deployment 的原因是希望有一个控制器能管理部署更新时候的版本控制问题.一个 Deployment 可以管 ...
- ASP.NET Core on K8S学习初探(2)K8S基本概念快速一览
在上一篇<单节点环境搭建>中,通过Docker for Windows在Windows开发机中搭建了一个单节点的K8S环境,接下来就是动人心弦的部署ASP.NET Core API到K8S ...
- Kubernetes 学习2 k8s基础概念
一.架构描述 1.基本架构 2.pod ,有两类 a.自主式pod 自我管理的,创建之后,任然是需要提交给API Server,API Server接受之后然后由调度器调度到指定的 node节点,由n ...
- ASP.NET Core on K8S学习初探(3)部署API到K8S
在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...
- ASP.NET Core on K8S学习之旅(12)Ingress
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.关于Ingress Kubernetes对外暴露Service主要有三种方 ...
- 【K8s学习笔记】K8s是如何部署应用的?
本文内容 本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操 基础架构概念回顾 温故而知新,上一节[K8S学习笔记]初识K8S 及架构组件 我们学习了K8s的发展历史. ...
随机推荐
- 【WPF】wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例
原文:[WPF]wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例 用Binding并通过Converter转换的时候,可能偶尔会遇到传参的问题, ...
- centos搭建免费的ssl证书,大部分浏览器均支持!(let’s encrypt 的使用记录)
安装certbot wget https://dl.eff.org/certbot-auto chmod a+x certbot-auto 然后就是通过这个脚本获取证书,安装前先将NGINX 停一下. ...
- QDialog在hide()之后,就被销毁的原因
一路跟踪源码,关键就是这两句: int QDialog::exec() { Q_D(QDialog); if (d->eventLoop) { qWarning("QDialog::e ...
- Win8 Metro(C#)数字图像处理--2.49Zhang二值图像细化算法
原文:Win8 Metro(C#)数字图像处理--2.49Zhang二值图像细化算法 [函数名称] 二值图像细化算法 WriteableBitmap ThinningProcess ...
- win10 uwp ApplicationView
原文:win10 uwp ApplicationView 本文和大家介绍一个重要的类,他可以用来设置窗口,如设置启动大小,设置是否允许截图,是否进入全屏,所有和窗口有关的,都可以在他这里设置. 可以使 ...
- 批处理(bat)实现SQLServer数据库备份与还原
原文:批处理(bat)实现SQLServer数据库备份与还原 备份数据库.bat @echo off set path=%path%;C:\Program Files (x86)\Microsoft ...
- 解决com.android.dex.DexException: Multiple dex files define Lcom/google/gson/JsonSerializer;
我在开发Windows Azure的Mobile Service(隔天补上创建过程)的安卓客户端时,报出了com.android.dex.DexException: Multiple dex file ...
- Arch Linux 是个 针对 i686 优化的 Linux 发行版(通过可以轻松使用的二进制包系统 - pacman)
Arch Linux 是个 针对 i686 优化的 Linux 发行版(通过可以轻松使用的二进制包系统 - pacman)Arch 同时也拥有一个类似 ports 的包构建系统(Arch Build ...
- 只言片语 - cell 图片复用问题
一. 今日做项目遇到图片复用问题,返回cell高度相同,由于网络不好出现图片复用,发现问题 Cell 图片加载方法如下: - (void)sd_setImageWithURL:(NSURL *)u ...
- SPOJ130_Rent your airplane and make money_单调队列DP实现
题意比较简单,状态转移方程也比较容易得出: f[i]=max{ f [ j ] }+p[i],(j的结束时间在i开始时间之前) 若i开始之前没有结束的j,则f[i]=p[i]; 因数据量太大(n< ...