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 等形式

 

posted @ 2022-11-14 23:43  Sky-wings  阅读(41)  评论(0编辑  收藏  举报