3-2、pod containers
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 等形式