Kubernetes 中, 容器老是以 Pod(容器组)的方式进行调度与运行。所以对 Pod 的理解与掌握是学习 Kubernetes 的基础。html
Pod(容器组)是 Kubernetes 中最小的调度单元,每个Pod都是某个应用程序的一个运行实例。之前咱们的 Web 应用都是以 Tomcat 等 Web 容器进程的形式运行在操做系统中,在 Kubernetes 中,咱们须要将 Web 应用打成镜像,以容器的方式运行在 Pod 中。node
Kubernetes 不会直接管理容器,而是经过 Pod 来管理。一个Pod包含以下内容:nginx
Pod 中的容器可包括两种类型:docker
在 Kubernetes 中,咱们通常不直接建立 Pod,而是经过控制器来调度管理(Deployment,StatefulSet,DaemonSet 等),这里为了便于了解,先经过 yaml 配置文件的方式定义 Pod 来直接建立 Pod。定义配置文件 pod-test.yaml 以下,shell
apiVersion: v1 kind: Pod metadata: name: pod-test # pod 名称 namespace: default # pod 建立的 namespace spec: containers: # pod 中容器定义 - name: nginx image: nginx imagePullPolicy: IfNotPresent ports: - containerPort: 80 hostPort: 8081 volumeMounts: - name: workdir mountPath: /usr/share/nginx/html restartPolicy: OnFailure # 重启策略 volumes: # 数据卷定义 - name: workdir hostPath: path: /tmp type: Directory
其中 spec 部分的 containers 定义了该 Pod 中运行的容器,从 containers 的复数形式也能够看出一个 Pod 中是能够运行多个容器的。api
执行 kubectl create
或 kubectl apply
命令建立 Pod,bash
[root@kmaster test]# kubectl create -f pod-test.yaml 或 [root@kmaster test]# kubectl apply -f pod-test.yaml
该 Pod 建立后将会拉取一个最新的 nginx 镜像,运行一个 nginx 容器,并将容器的 80 端口映射到宿主机的 8081 端口。app
可以使用 kubectl get pods
命令查看当前 namesapce 下的全部 Pod,加 Pod 名称查看具体某个 Pod。 若是须要查看 Pod 调度到了哪一个节点,可加 -o wide
选项,若是查看 yaml 文件信息则可加 -o yaml
选项, 以下所示负载均衡
[root@kmaster test]# kubectl get pods NAME READY STATUS RESTARTS AGE pod-test 1/1 Running 0 116s [root@kmaster test]# kubectl get pods pod-test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES pod-test 1/1 Running 0 2m19s 10.244.1.42 knode2 <none> <none> [root@kmaster test]# kubectl get pods pod-test -o yaml
若是要查看更多的信息,可以使用 kubectl describe
命令,tcp
[root@kmaster test]# kubectl describe pod pod-test
该命令输出内容以下图,
各部分说明:
当 Pod 在调度或运行中出现问题时,咱们均可以使用 kubectl describe
命令来进行排查,经过其中的状态及事件来判断问题产生的可能缘由。
经过 kubectl exec
命令可进入 Pod, 相似于 docker exec
, 如
# 若是 Pod 中只有一个容器 [root@kmaster test]# kubectl exec -it pod-test bash root@pod-test:/# # 若是 Pod 中有多个容器 kubectl exec -it pod-name -c container-name /bin/bash
若是一个 Pod 中有多个容器,则须要经过 -c
指定进入哪一个容器。
Kubernetes 对 Pod 的更新作了限制,除了更改 Pod 中容器(包括工做容器与初始化容器)的镜像,以及 activeDeadlineSeconds (对 Job 类型的 Pod 定义失败重试的最大时间), tolerations (Pod 对污点的容忍),修改其它部分将不会产生做用,如咱们能够尝试在前面 Pod 定义文档 pod-test.yaml 中将宿主机端口 8081 改成 8082,从新执行 kubectl apply
, 将提示以下错误,
[root@kmaster test]# kubectl apply -f pod-test.yaml The Pod "pod-test" is invalid: spec: Forbidden: pod updates may not change fields other than `spec.containers[*].image`, `spec.initContainers[*].image`, `spec.activeDeadlineSeconds` or `spec.tolerations` (only additions to existing tolerations)
经过 kubectl delete
命令可删除一个 Pod
[root@kmaster test]# kubectl delete pod pod-test
在 Kubernetes 中,通常不直接建立,更新或删除单个 Pod,而是经过 Kubernetes 的 Controller(控制器)来管理 Pod,包括 ReplicSet(通常也不直接用,推荐Deployment方式), Deployment,StatefulSet,DaemonSet 等。
控制器提供以下功能:
Pod状态并非容器的状态,容器的状态通常包括:
Waiting: 容器的初始状态,处于 Waiting 状态的容器,表示仍然有对应的操做在执行,例如:拉取镜像、应用 Secrets等
Running: 容器处于正常运行的状态
Terminated: 容器处于结束运行的状态
而Pod的状态通常包括:
状态之间的变迁关系如图
Pod 刚开始处于 Pending 的状态,接下来可能会转换到 Running,也可能转换到 Unknown,甚至可能转换到 Failed。而后,当 Running 执行了一段时间以后,它能够转换到相似像 Successded 或者是 Failed。 当出现 Unknown 这个状态时,可能因为一些状态的恢复,它会从新恢复到 Running 或者 Successded 或者是 Failed。
定义 Pod 或工做负载时,能够指定 restartPolicy,可选的值有:
restartPolicy 做用于 Pod 中的全部容器。kubelete 将在五分钟内,按照递延的时间间隔(10s, 20s, 40s ...)尝试重启已退出的容器,并在十分钟后再次启动这个循环,直到容器成功启动,或者 Pod 被删除。在控制器 Deployment/StatefulSet/DaemonSet 中,只支持 Always 这一个选项,不支持 OnFailure 和 Never 选项。
提升应用服务的可用性与稳定性,通常可从两个方面来进行:
Kubernetes 中对 Pod 的健康检查提供了两种方式:
Liveness probe 适用场景是支持那些能够从新拉起的应用,而 Readiness probe 主要应对的是启动以后没法当即对外提供服务的应用。
就绪探测、存活探测目前支持三种不一样的探测方式:
以 httpGet 为例,示例配置文件以下,
apiVersion: v1 kind: Pod metadata: name: pod-test spec: containers: - # ... 与前同 - name: workdir mountPath: /usr/share/nginx/html livenessProbe: httpGet: path: / port: 80 httpHeaders: # 此处header无心义,仅做示例 - name: purpose value: for-test initialDelaySeconds: 2 periodSeconds: 5 # ... 与前同
删除以前的 Pod, 从新建立,使用 kubectl describe
查看,可看到 Events 部分以下图,
Http 存活探测失败,状态码返回 403, 致使容器重启。出现这个错误的缘由是前面作目录挂载时将 nginx 的 html 目录挂载到了宿主机的 /tmp 目录, 而 /tmp 目录没有 index.html 文件,致使请求返回403, 在 Pod 调度到的宿主机 /tmp 目录下建立 index.html 文件便可。
echo '<h1>Hello, K8s!</h1>' > /tmp/index.html
其它 Exec,tcpSocket 探测的配置示例以下(配置在 containers 元素下),
# exec livenessProbe: exec: command: - cat - /tmp/healthy initialDelaySeconds: 5 periodSeconds: 5 # tcpSocket livenessProbe: tcpSocket: port: 8080 initialDelaySeconds: 10 periodSeconds: 10
支持的参数说明:
readinessProbe 配置与 livenessProbe 相似。阿里云上配置就绪检查如图所示:
健康检查的结果分为三种:
健康检查的一些实践建议:
本文对 Pod 的概念与基本的管理操做,Pod 的状态变迁机制与重启策略进行了介绍,对 Pod 的健康检查进行了详细的了解。但在 Kubernetes 中,咱们通常不直接建立 Pod,而是经过控制器,如Deployment,StatefulSet,DaemonSet, 由于控制器能为咱们提供水平伸缩,rollout(版本更新),self-healing(故障恢复)等能力。咱们将在接下来的文章了解控制器。
[转载请注明出处]
做者:雨歌
欢迎关注做者公众号:半路雨歌,查看更多技术干货文章