什么是pod:
以下内容摘抄自 Kubernetes官方文档:
Pod 是 Kubernetes 最基本的组成块,它是 Kubernetes 最小、最简单的可用来创建和部署的单元。 一个 Pod 代表了一个运行在集群里的进程。
Pod 里封装了一个(或者多个)应用容器,存储资源,以及惟一的网络 IP。
Docker 是 Kubernetes Pod 里最常见的运行环境, 当然 Pod 也支持其他的容器环境。
Kubernetes 运用 pod 的方式:
Pod 里只运行一个单独容器 “one-container-per-Pod” 模式是 Kubernetes 最常见的使用场景;在这种情况下,可以把 Pod 看做是一个单独容器的连接器, Kubernetes 通过 Pod 去管理容器。
Pod 中运行多个相互作用容器。 Pod 封装了一组紧耦合、共享资源、协同寻址的容器。 这些协同寻址的容器可能来自一组粘性很强的服务 – 比如说:在用容器的共享卷提供对外文件服务的同时用 “sidecar” 容器刷新、更新这些文件。Pod 将这些容器和存储资源打包成一个管理实体。
Pod 是标准的 Kubernetes 资源,它也遵循资源定义清单的基本格式:apiVersion、kind、metadata、spec、status(只读,它是由 Kubernetes 系统提供和更新)
本文主要整理里了 Pod.spec 字段可以内嵌的常用字段,重点在 Pod.spec.containers 字段中可定义的众多字段;
1. spec.containers 可内嵌的字段
containers 是 Pod.spec 内嵌字段中唯一一个带有 -required- 标记的字段,而 containers 是一个对象列表,下面说明一下 containers 可内嵌的各字段的作用:
1.1 name
name -required- 必须给出的字段,定义具有唯一性的容器的名称;
举例演示:
containers:
- name: myapp
1.2 image
image 指明容器要运行的镜像;
举例演示:
containers:
- name: myapp
image: nginx:1.14-alpine
1.3 imagePullPolicy
imagePullPolicy 定义镜像的拉取策略,可定义的值有三个:
- Always:无论本地有或者没有这个镜像,都去镜像仓库中获取;
- Never:从不,如果本地仓库有就用,没有也不会下载。需要手动去获取镜像;
- IfNotPresent:如果本地存在就使用,如果没有就去远程仓库获取;
注意:如果标签是 latest 那么默认策略就是 Always;
举例演示:
containers:
- name: myapp
image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
1.4 ports
ports <[]Object> 定义容器内要暴露的端口,可以暴露多个端口,而且每一个端口都可以有多个属性:
containerPort -required- :暴露的端口
name :自定义一个名字
protocol :协议,TCP或UDP,默认为TCP
举例演示:
containers:
- name: myapp
image: nginx:1.14-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
1.5 command 和 args
command 和 args 用来修改镜像中的默认应用;
args <[]string>:作用等同于,Dockerfile中的 CMD,向 ENTRYPOINT 传递参数的,如果这里没有给出 args 参数,而镜像内即有 CMD 又有 ENTRYPOINT 则镜像内 CMD 的参数将传递给 ENTRYPOINT 作为参数;如果这里给了 args 那么,镜像内的 CMD 的参数就不会传递给 ENTRYPOINT,而是用 args 传递的参数;
command <[]string>:作用等同于,Dockerfile中的 ENTRYPOINT 指令,用于运行程序的默认命令;如果没有给出 command 则默认运行镜像制作时的默认程序
举例演示:
apiVersion: v1
kind: Pod
metadata:
name: command-demo
labels:
purpose: demonstrate-command
spec:
containers:
- name: command-demo-container
image: debian
command: ["printenv"]
args: ["HOSTNAME", "KUBERNETES_PORT"]
1.6 livenessProbe 和 readinessProbe 探针
探针 是由 kubelet 对容器执行的定期诊断。要执行诊断,kubelet 调用由容器实现的 Handler。有三种类型的处理程序:
ExecAction:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。
TCPSocketAction:对指定端口上的容器的 IP 地址进行 TCP 检查。如果端口打开,则诊断被认为是成功的。
HTTPGetAction:对指定的端口和路径上的容器的 IP 地址执行 HTTP Get 请求。如果响应的状态码大于等于200 且小于 400,则诊断被认为是成功的。
每个容器都可以运行两个探针:
- livenessProbe 存活性探测,用来探测容器内主进程是否活着;
- readinessProbe 就绪性探测,用来探测容器内主进程是否能够正常提供服务,比如容器内 nginx
主进程是活的,但是网页文件已经不再了,服务是不可用的; - 下面我以 livenessProbe 为例演示三种类型的探测方式,readinessPorbe 使用方法相同。
示例:
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
images: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox
commond: ['sh' , '-c','until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox
commond: ['sh', '-c', 'until nslooup mydb; do echo waiting for mydb; sleep 2; done;']