- 1. 概述
- 2. Pod的基本配置
- 3. 镜像拉取策略
- 4. 启动命令
- 5. 环境变量
- 6. 端口设置
- 7. 资源配额
通过命令kubectl explain pod.spec.containers
查询,将重要结果整理如下:
containers: # 数组,代表可以有多个容器:
- name: # 容器名称
image: # 容器需要的镜像地址
imagePullPolicy: # 镜像拉取策略
command: # 容器的启动命令列表,默认使用打包时使用的启动命令
args: # 容器的启动命令需要的参数列表
env: # 容器环境变量的配置
ports: # 容器需要暴露的端口号列表
resources: # 资源限制和资源请求的设置
2. Pod的基本配置
新建pod-containers.yaml,内容如下:
[root@k8s-master ~]# cat pod-containers.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-containers
namespace: dev
labels:
user: bulut
spec:
containers:
- name: nginx-container
image: nginx:latest
[root@k8s-master ~]#
3. 镜像拉取策略
imagePullPolicy:用于设置镜像拉取的策略,有三种拉取策略:
- Always:总是从远程仓库拉取镜像到本地
- IfNotPresent:本地有则使用本地镜像,本地没有则从远程仓库拉取镜像到本地
- Never:只使用本地镜像,本地没有就报错
默认值说明:
- 如果镜像tag为latest,默认策略是Always
- 如果镜像tag为具体的版本号,默认策略是IfNotPresent
新建pod-containers.yaml,内容如下:
[root@k8s-master ~]# cat pod-containers.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-containers
namespace: dev
labels:
user: bulut
spec:
containers:
- name: nginx-container
image: nginx:latest
imagePullPolicy: Always
[root@k8s-master ~]#
4. 启动命令
busybox不是一个程序,是一个工具类的集合。其容器启动后,由于没有前台的程序一直运行,会自动关闭。所以需要我们通过command参数传递命令让它一直运行
新建pod-containers.yaml,内容如下。然后进行pod创建
[root@k8s-master ~]# cat pod-containers.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-containers
namespace: dev
labels:
user: bulut
spec:
containers:
- name: busybox-container
image: busybox
command: ["/bin/sh", "-c", "while true;do echo $(date +%T) >> /tmp/time.txt;sleep 10;done;"]
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl apply -f pod-containers.yaml
pod/pod-containers created
[root@k8s-master ~]#
进入pod中的容器,查看结果
[root@k8s-master ~]# kubectl exec pod-containers -c busybox-container -it -n dev -- /bin/sh
/ # cat /tmp/time.txt
15:19:16
15:19:26
15:19:36
/ #
Kubernetes中的command和args两个参数覆盖Dockerfile中的ENTRYPOINT说明:
- 如果command和args均没写,那么用Dockerfile的配置
- 如果command写了,但是args没写,那么Dockerfile默认的配置会被忽略,执行command
- 如果command没写,但是args写了,那么Dockerfile中配置的ENTRYPOINT命令会被执行,使用当前args作为参数
- 如果command和args都写了,那么Dockerfile中的配置会被忽略,执行command并追加上args参数
新建pod-containers.yaml,内容如下。然后进行pod创建
[root@k8s-master ~]# cat pod-containers.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-containers
namespace: dev
labels:
user: bulut
spec:
containers:
- name: nginx-container
image: nginx:latest
env:
- name: myKey
value: myValue
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl apply -f pod-containers.yaml
pod/pod-containers created
[root@k8s-master ~]#
进入pod中的容器,查看结果
[root@k8s-master ~]# kubectl exec pod-containers -c nginx-container -it -n dev -- /bin/sh
# echo $myKey
myValue
#
6. 端口设置
通过kubectl explain pod.spec.containers.ports
命令查看ports的子属性,整理如下:
ports:
- name: # 端口名称,如果指定,必须保证name在pod中是唯一的
containerPort: # 容器要监听的端口(0 < 端口范围 < 65536)
hostPort: # 容器要在主机上绑定的端口,如果设置,主机上只能运行容器的一个副本(一般省略)
hostIP: # 要将外部端口绑定到的主机IP(一般省略)
protocol: # 端口协议。必须是UDP、TCP或SCTP。默认为“TCP”
新建pod-containers.yaml,内容如下。然后进行pod创建
[root@k8s-master ~]# cat pod-containers.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-containers
namespace: dev
labels:
user: bulut
spec:
containers:
- name: nginx-container
image: nginx:latest
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
[root@k8s-master ~]#
[root@k8s-master ~]# kubectl apply -f pod-containers.yaml
pod/pod-containers created
[root@k8s-master ~]#
访问nginx服务
[root@k8s-master ~]# kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-containers 1/1 Running 0 70s 10.244.169.147 k8s-node2
[root@k8s-master ~]#
[root@k8s-master ~]# curl 10.244.169.147:80
Welcome to nginx!
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
Welcome to nginx!
If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.
For online documentation and support please refer to
nginx.org.
Commercial support is available at
nginx.com.
Thank you for using nginx.
[root@k8s-master ~]#
7. 资源配额
容器中的程序运行会占用一定的资源,比如CPU和内存等,如果不对某个容器的资源做限制,那么它就可能吃掉大量的资源,导致其他的容器无法运行
kubernetes提供了对内存和CPU的资源进行配额的机制,这种机制主要通过resources属性实现,它有两个子属性:
- limits:用于限制容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启
- requests:用于设置容器需要的最小资源,如果环境资源不够,容器将无法启动
其中cpu指定的是core数,可以为整数或小数。memory指定的是内存大小,可以使用Gi、Mi、G、M等格式
新建pod-containers.yaml,内容如下:
[root@k8s-master ~]# cat pod-containers.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-containers
namespace: dev
labels:
user: bulut
spec:
containers:
- name: nginx-container
image: nginx:latest
resources:
limits:
cpu: "2"
memory: "10Gi"
requests:
cpu: "1"
memory: "10Mi"
[root@k8s-master ~]#