涨薪技术|Kubernetes(k8s)之认识Pod
01了解Pod
Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。
一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。它可能由单个容器或多个容器共享组成的资源。
Kubernetes中的Pod使用可分两种主要方式:
-
Pod中运行一个容器。“one-container-per-Pod”模式是Kubernetes最常见的用法; 在这种情况下,你可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。
-
Pods中运行多个需要一起工作的容器。Pod可以封装紧密耦合的应用,它们需要由多个容器组成,它们之间能够共享资源,这些容器可以形成一个单一的内部service单位 - 一个容器共享文件,另一个“sidecar”容器来更新这些文件。Pod将这些容器的存储资源作为一个实体来管理。
每个Pod都是运行应用的单个实例,如果需要水平扩展应用(例如,运行多个实例),则应该使用多个Pods,每个实例一个Pod。在Kubernetes中,这样通常称为Replication。Replication的Pod通常由Controller创建和管理。
02Pod结构和定义
Kubernetes 添加了一个 Pod 来托管你的应用实例。Pod 是 Kubernetes 抽象出来的,表示一组一个或多个应用程序容器(如 Docker),以及这些容器的一些共享资源。
这些资源包括:
-
共享存储,当作卷
-
网络,作为唯一的集群 IP 地址
-
有关每个容器如何运行的信息,例如容器镜像版本或要使用的特定端口
Pod 为特定于应用程序的“逻辑主机”建模,并且可以包含相对紧耦合的不同应用容器。例如,Pod 可能既包含带有 Node.js 应用的容器,也包含另一个不同的容器,用于提供 Node.js 网络服务器要发布的数据。Pod 中的容器共享 IP 地址和端口,始终位于同一位置并且共同调度,并在同一工作节点上的共享上下文中运行。
Pod是Kubernetes 平台上的原子单元。当我们在 Kubernetes 上创建 Deployment 时,该Deployment 会在其中创建包含容器的 Pod (而不是直接创建容器)。每个 Pod 都与调度它的工作节点绑定,并保持在那里直到终止重启策略)或删除。如果工作节点发生故障,则会在集群中的其他可用工作节点上调度相同的 Pod。
Pod资源清单:
apiVersion: v1 #必选,版本号,例如v1
king: Pod #必选,资源类型,例如Pod
metadata:
name: string #必选,pod名称
namespace: string #pod所属的命名空间,默认为"default"
labels:
- name: string
spec: #必选,pod中容器的详细定义
containers: #必选,pod中容器列表
- name: string #必选,容器名称
image: string #必选,容器镜像名称
imagePullPolicy: [Always|Never|IfNotPresent] #获取镜像的策略
command: [string] #容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] #容器的启动命令参数列表
workingDir: string #容器的工作目录
volumeMounts: #挂载到容器内部的存储卷配置
- name: string #引用pod定义的共享数据卷的名称,需用volumes[]部分定义的卷名
mountPath: string #存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean #是否为只读模式
ports: #需要暴露的端口库号列表
- name: string #端口的名称
containerPort: int #容器需要监听的端口号
hostPort: int #容器所在主机需要监听的端口号,默认与Container相同
protocol: string #端口协议,支持TCP和UDP,默认TCP env: #容器运行前需要设置的
环境变量列表 - name: string #环境变量名称 value: string #环境变量的值
resources: #资源限制和请求的设置 limits: #资源限制的设置......
可以发现,pod的资源非常繁多,因此要一个一个记住是不现实,所以k8s提供了能够查看每种资源的配置项的命令
#kubectl explain 资源类型 #查看某种资源可以配置的一级属性
#kubectl explain 资源类型.属性 #查看属性的子属性
查看pod资源的一级属性
[root@master ~]# kubectl explain pod
03Pod之镜像拉取策略
Pod的核心是运行容器,必须指定容器引擎,比如Docker,启动容器时需要拉取镜像,k8s的镜像拉取策略可以由用户指定:
-
IfNotPresent:在镜像已经存在的情况下,kubelet将不再去拉取镜像,仅当本地缺失时才会从仓库中拉取,默认的镜像拉取策略
-
Alaways:每次创建Pod都会重新拉取一次镜像
-
Never:Pod不会主动拉取这个镜像,仅使用本地镜像
注意:对于标签为latest的镜像文件,其默认的镜像获取策略即为Always;而对于其他标签的镜像,其默认策略则为IfNotPresent。
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: Always
04Pod启动命令
创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数。如果要设置命令,就填写在配置文件的 command 字段下,如果要设置命令的参数,就填写在配置文件的 args 字段下。一旦 Pod 创建完成,该命令及其参数就无法再进行更改。
参数command相当于docker中的ENTRPOINT命令,args相当于docker中的CMD命令。本示例中,将创建一个只包含单个容器的 Pod。在 Pod 配置文件中设置了一个命令与两个参数:
# cat commands.yaml
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"]
restartPolicy: OnFailure
运行yaml文件并查看pod节点的日志信息
kubectl apply -f commands.yaml
# kubectl get pods
# kubectl logs command-demo
## 日志中显示了 HOSTNAME 与 KUBERNETES_PORT 这两个环境变量的值:
command-demo
tcp://10.3.240.1:443
如果要覆盖默认的 ENTRPOINT 与 CMD,需要遵循如下规则:
1. 如果在容器配置中没有设置 command 或者 args,那么将使用 Docker 镜像自带的命令及其参数。
2. 如果在容器配置中只设置了 command 但是没有设置 args,那么容器启动时只会执行该命令,Docker 镜像中自带的命令及其参数会被忽略。
3. 如果在容器配置中只设置了 args,那么 Docker 镜像中自带的命令会使用该新参数作为其执行时的参数。
4. 如果在容器配置中同时设置了 command 与 args,那么 Docker 镜像中自带的命令及其参数会被忽略。容器启动时只会执行配置中设置的命令,并使用配置中设置的参数作为命令的参数。