[toc]

继上一篇配置详解
https://liudongdong.top/archives/kubernetesshi-yi-pod-pei-zhi-xiang-jie

4. 启动命令

在前面的案例中,一直有一个问题没有解决,就是busybox容器一直没有成功运行,那么到底是什么原因导致这个容器的故障的呢?

原来busybox并不是一个程序,而是类似于一个工具类的集合,kubernetes集群启动管理后,它会自动关闭。解决方法就是让其一直在运行,这就用到了command的配置。

创建pod-command.yaml文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-command
  namespace: dev
  labels:
    user: test
spec:
  containers:
    - name: nginx # 容器名称
      image: nginx:1.17.1 # 容器需要的镜像地址
      imagePullPolicy: IfNotPresent # 设置镜像拉取策略
    - 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:用于在Pod中的容器初始化完毕之后执行一个命令。

这里稍微解释下command中的命令的意思:

  1. "/bin/sh","-c":使用sh执行命令。
  2. touch /tmp/hello.txt:创建一个/tmp/hello.txt的文件。
  3. while true;do /bin/echo $(date +%T) >> /tmp/hello.txt;sleep 3;done:每隔3秒,向文件写入当前时间

创建Pod:

kubectl apply -f pod-command.yaml

查看Pod状态:

kubectl get pod pod-command -n dev

image.png

进入Pod中的busybox容器,查看文件内容:

# 在容器中执行命令
# kubectl exec -it pod的名称 -n 命名空间 -c 容器名称 /bin/sh
kubectl exec -it pod-command -n dev -c busybox /bin/sh

image.png

特别说明:通过上面发现command已经可以完成启动命令和传递参数的功能,为什么还要提供一个args选项,用于传递参数?其实和Docker有点关系,kubernetes中的command和args两个参数其实是为了实现覆盖Dockerfile中的ENTRYPOINT的功能:

  1. 如果command和args均没有写,那么用Dockerfile的配置。
  2. 如果command写了,但是args没有写,那么Dockerfile默认的配置会被忽略,执行注入的command。
  3. 如果command没有写,但是args写了,那么Dockerfile中配置的ENTRYPOINT命令会被执行,使用当前args的参数。
  4. 如果command和args都写了,那么Dockerfile中的配置会被忽略,执行command并追加上args参数。

5. 环境变量(不推荐)

创建pod-evn.yaml文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-env
  namespace: dev
  labels:
    user: test
spec:
  containers:
    - name: nginx # 容器名称
      image: nginx:1.17.1 # 容器需要的镜像地址
      imagePullPolicy: IfNotPresent # 设置镜像拉取策略
    - 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;"]
      env:
        - name: "username"
          value: "admin"
        - name: "password"
          value: "123456"

env:环境变量,用于在Pod中的容器设置环境变量。

创建Pod:

kubectl create -f pod-env.yaml

image.png

进入容器,输出环境变量:

kubectl exec -it pod-env -n dev -c busybox -it /bin/sh

image.png

此种方式不推荐,推荐将这些配置单独存储在配置文件中,后面介绍。

6. 端口设置

  • 查看ports支持的子选项:
kubectl explain pod.spec.containers.ports

image.png

KIND:     Pod
VERSION:  v1
RESOURCE: ports <[]Object>
FIELDS:
  name <string> # 端口名称,如果指定,必须保证name在pod中是唯一的
  containerPort <integer> # 容器要监听的端口(0<x<65536)
  hostPort <integer> # 容器要在主机上公开的端口,如果设置,主机上只能运行容器的一个副本(一般省略)
  hostIP <string>  # 要将外部端口绑定到的主机IP(一般省略)
  protocol <string>  # 端口协议。必须是UDP、TCP或SCTP。默认为“TCP”

创建pod-ports.yaml文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-ports
  namespace: dev
  labels:
    user: xudaxian
spec:
  containers:
    - name: nginx # 容器名称
      image: nginx:1.17.1 # 容器需要的镜像地址
      imagePullPolicy: IfNotPresent # 设置镜像拉取策略
      ports:
        - name: nginx-port # 端口名称,如果执行,必须保证name在Pod中是唯一的
          containerPort: 80 # 容器要监听的端口 (0~65536)
          protocol: TCP # 端口协议

创建Pod:

kubectl create -f pod-ports.yaml

image.png

访问Pod中的容器中的程序使用的是PodIp:containerPort。

7. 资源配额

容器中的程序要运行,肯定会占用一定的资源,比如CPU和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量的资源,导致其他的容器无法运行。针对这种情况,kubernetes提供了对内存和CPU的资源进行配额的机制,这种机制主要通过resources选项实现,它有两个子选项:

  1. limits:用于限制运行的容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启。
  2. requests:用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动。

可以通过上面的两个选项设置资源的上下限。

创建pod-resoures.yaml文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: pod-resoures
  namespace: dev
  labels:
    user: xudaxian
spec:
  containers:
    - name: nginx # 容器名称
      image: nginx:1.17.1 # 容器需要的镜像地址
      imagePullPolicy: IfNotPresent # 设置镜像拉取策略
      ports: # 端口设置
        - name: nginx-port # 端口名称,如果执行,必须保证name在Pod中是唯一的
          containerPort: 80 # 容器要监听的端口 (0~65536)
          protocol: TCP # 端口协议
      resources: # 资源配额
        limits: # 限制资源的上限
          cpu: "2" # CPU限制,单位是core数
          memory: "10Gi" # 内存限制
        requests: # 限制资源的下限
          cpu: "1" # CPU限制,单位是core数 
          memory: "10Mi" # 内存限制

cpu:core数,可以为整数或小数。
memory:内存大小,可以使用Gi、Mi、G、M等形式。

创建Pod:

kubectl create -f pod-resource.yaml

image.png

查看发现Pod运行正常:

kubectl get pod pod-resoures -n dev

image.png

接下来,停止Pod:

kubectl delete -f pod-resource.yaml

编辑Pod,修改resources.requests.memory的值为10Gi:

apiVersion: v1
kind: Pod
metadata:
  name: pod-resoures
  namespace: dev
  labels:
    user: xudaxian
spec:
  containers:
    - name: nginx # 容器名称
      image: nginx:1.17.1 # 容器需要的镜像地址
      imagePullPolicy: IfNotPresent # 设置镜像拉取策略
      ports: # 端口设置
        - name: nginx-port # 端口名称,如果执行,必须保证name在Pod中是唯一的
          containerPort: 80 # 容器要监听的端口 (0~65536)
          protocol: TCP # 端口协议
      resources: # 资源配额
        limits: # 限制资源的上限
          cpu: "2" # CPU限制,单位是core数
          memory: "10Gi" # 内存限制
        requests: # 限制资源的下限
          cpu: "1" # CPU限制,单位是core数 
          memory: "10Gi" # 内存限制

再次启动Pod:

kubectl create -f pod-resource.yaml

查看Pod状态,发现Pod启动失败:

kubectl get pod pod-resoures -n dev -o wide

image.png

查看Pod详情会发现,如下提示:

kubectl describe pod pod-resoures -n dev

image.png

Q.E.D.


只有创造,才是真正的享受,只有拚搏,才是充实的生活。