pod containers
# kubectl explain pod.spec.containers
KIND: Pod
VERSION: v1
RESOURCE: containers <[]Object> # 数组,代表可以有多个容器
FIELDS:
name <string> # 容器名称
image <string> # 容器需要的镜像地址
imagePullPolicy <string> # 镜像拉取策略
command <[]string> # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
args <[]string> # 容器的启动命令需要的参数列表
env <[]Object> # 容器环境变量的配置
ports <[]Object> # 容器需要暴露的端口号列表
resources <Object> # 资源限制和资源请求的设置
2 基本配置name、image
创建 pod-base.yaml 文件
apiVersion: v1
kind: Pod
metadata:
name: pod-base
namespace: default # 命名空间
labels:
user: nginx-test
spec:
containers:
- name: nginx
image: nginx:1.14
imagePullPolicy: Never # 用于设置镜像拉取策略
- name: busybox
image: busybox:1.30
# kubectl apply -f pod-base.yaml
pod/pod-base created
# 查看 pod
# READY 1/2 : 表示当前 Pod 中有2个容器,其中 1 个准备就绪,1 个未就绪
# RESTARTS : 重启次数,因为有 1 个容器故障了,Pod 一直在重启试图恢复它
imagePullPolicy:用于设置镜像拉取策略,k8s 支持配置三种拉取策略
Always:总是从远程仓库拉取镜像
ifNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像
Never:只使用本地镜像,从不去远程仓库拉取,本地没有就报错
默认值说明:
如果镜像 tag 为具体版本号,默认策略是:ifNotPresent
如果镜像 tag 为:latest,默认策略是 Always,因为不知道本地的是不是最新的镜像
3 启动命令command
apiVersion: v1
kind: Pod
metadata:
name: pod-base
namespace: default # 命名空间
labels:
user: nginx-test
spec:
containers:
- name: nginx
image: nginx:1.14
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","touch /tmp/hello.txt;while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done;"] # command 命令
command,用于在 pod 中的容器初始化完毕之后运行一个命令
"/bin/sh","-c", 使用sh执行命令
touch /tmp/hello.txt; 创建一个/tmp/hello.txt 文件
while true;do /bin/echo $(date +%T) >> /tmp/hello.txt; sleep 3; done; 每隔3秒向文件中写入当前时间,在容器里面
除了 command 参数外,还有一个 args 参数
通过上面发现 command 已经可以完成启动命令和传递参数的功能,为什么这里还要提供一个 args 选项,用于传递参数呢?这其实跟 docker 有点关系,kubernetes 中的 command、args 两项其实是实现覆盖 Dockerfile 中 ENTRYPOINT 的功能。
如果 command 和 args 均没有写,那么用 Dockerfile 的配置。
如果 command 写了,但 args 没有写,那么 Dockerfile 默认的配置会被忽略,执行输入的 command
如果 command 没写,但 args 写了,那么 Dockerfile 中配置的 ENTRYPOINT 的命令会被执行,使用当前 args 的参数
如果 command 和 args 都写了,那么 Dockerfile 的配置被忽略,执行 command 并追加上 args 参数
4 环境变量env
env,环境变量,用于给 pod 中的容器设置环境变量
apiVersion: v1
kind: Pod
metadata:
name: pod-env
namespace: default
spec:
containers:
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","while true;do /bin/echo $(date +%T);sleep 60; done;"]
env: # 设置环境变量列表,设置了两个 username=admin 和 password=123456
- name: "username"
value: "admin"
- name: "password"
value: "123456"
登录容器后,可查看:
echo $username
或env |grep username
5 端口设置ports
# kubectl explain pod.spec.containers.ports
KIND: Pod
VERSION: v1
RESOURCE: ports <[]Object>
FIELDS:
name <string> # 端口名称,如果指定,必须保证name在pod中是唯一的
containerPort<integer> # 容器要监听的端口(0<x<65536),一个 pod 里有多个容器
hostPort <integer> # 容器要在主机上公开的端口,也就是 worker 的机器,如果设置,主机上只能运行容器的一个副本(一般省略)
hostIP <string> # 要将外部端口绑定到的主机 IP,也就是 worker 的机器(一般省略)
protocol <string> # 端口协议。必须是UDP、TCP或SCTP。默认为“TCP”。
port测试案例,创建 pod-ports.yaml:
apiVersion: v1
kind: Pod
metadata:
name: pod-base
namespace: default
labels:
user: nginx-test
spec:
containers:
- name: nginx
image: nginx:1.14
ports: # 设置容器暴露的端口列表
- name: nginx-port
containerPort: 80
protocol: TCP
但这样外网还是访问不了的,如果外网要访问,就要用service 了
7 资源配额 resources
也就是Pod在进行调度的时候,可以对调度的资源进行限制,例如限制Pod调度时使用的资源是2C4G,那么在调度对应的node节点时,只会占用对应的资源,对于不满足资源的节点,将不会进行调度。
容器中的程序要运行,肯定是要占用一定资源的,比如 cpu 和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量资源,导致其它容器无法运行。针对这种情况,kubernetes 提供了对内存和 cpu 的资源进行配额的机制,这种机制主要通过 resources 选项实现,他有两个子选项:
limits:用于限制运行时容器的最大占用资源,当容器占用资源超过 limits 时会被终止,并进行重启
requests :用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动
可以通过上面两个选项设置资源的上下限。
resources测试案例,创建 pod-resources.yaml:
apiVersion: v1
kind: Pod
metadata:
name: pod-resources
namespace: zouzou
spec:
containers:
- name: nginx
image: nginx:1.14
resources: # 资源配额
limits: # 限制资源(上限)
cpu: "2" # CPU限制,单位是core数
memory: "10Gi" # 内存限制
requests: # 请求资源(下限)
cpu: "1" # CPU限制,单位是core数
memory: "10Mi" # 内存限制
在这对 cpu 和 memory 的单位做一个说明:
cpu:core 数,可以为整数或小数,如0.1,100m
memory: 内存大小,可以使用 Gi、Mi、G、M 等形式