前戏

pod资源无法使用 apply 进行更新,必须是有 pod 控制器的 yaml 文件才能使用 apply 进行更新配置

Pod 资源镜像拉取配置

主要了解 pod.spec.containers 属性,主要是针对镜像的一些配置

Pod 资源镜像配置属性

[root@k8s-master ~]# kubectl explain pod.spec.containers
KIND:     Pod
VERSION:  v1
RESOURCE: containers <[]Object>				
FIELDS:
   name	<string> -required-								//定义容器的名
   image	<string>									//定义容器使用的镜像
   imagePullPolicy	<string>							//镜像拉取策略
   command	<[]string>									//配置容器启动命令列表,如不指定,使用打镜像时的启动命令
   args	<[]string>										//容器启动命令需要的参数列表
   env	<[]Object>										//配置容器的环境变量
   ports	<[]Object>									//配置容器需要暴露的端口列表,也就是要将什么端口暴露出去
   resources	<Object>								//资源限制和资源请求配置  
   
image、imagePullPolicy、command、args、env、ports、resources 这些命令都是放在一个容器下面,可以对不同的容器编写不同的配置参数,与某一个容器的 - name 对齐,就代表对这一个容器生效

编写 Yaml 创建基本 Pod

containers 配置只设置 name 和 images 两个参数

1.编写yaml
[root@k8s-master ~/k8s_1.19_yaml]# vim pod-base.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-base
  namespace: dev
  labels:
    app: base
spec:
  containers:	
  - name: nginx						#容器名称
    image: nginx:1.18				#容器的镜像
  - name: busybox					#容器名称
    image: busybox:1.30					#容器的的镜像
    
2.创建pod    
[root@k8s-master ~]# kubectl create -f  pod-base.yaml 
pod/pod-base created

3.查看pod
#可以看到只有一个pod运行成功了,目前 pod 的状态为 CrashLoopBackOff
[root@k8s-master ~]# kubectl get all -n dev
NAME           READY   STATUS             RESTARTS   AGE
pod/pod-base   1/2     CrashLoopBackOff   4          2m54s

4.查看详细的pod日志
[root@k8s-master ~]# kubectl describe pod/pod-base -n dev

可以在详细输出信息中看到 nginx 已经启动, busybox 成功拉取但未启动

Kubernetes 集群 Pod 资源镜像拉取策略、环境变量、端口设置等详细参数使用(五)_Pod

镜像拉取策略

imagePullPolicy 用于设置镜像拉取策略 k8s 支持的三种镜像拉取策略:

Always

  • 从远程仓/库拉取镜像

ifNotPresent: 本地有镜像则从本地拉取,本地没有则去远程仓库拉取镜像

Never:  只从本地拉取镜像,从不去远程仓库拉取景想,本地没有会报错 imagePullPolicy 默认值说明:如果镜像 tag 标签为具体的版本号,默认策略是i fNotPresent 如果镜像 tag 为 latest,默认策略是 always

imagePullPolicy 可以针对同一个 pod 下不同的容器不同的拉取策略下面的一段 yam 就是对 nginx 采用 ifNotPresent 策略,对 busybox 采用 Never

- name: nginx
    image: nginx:1.11
    imagePullPolicy: IfNotPresent
  - name: busybox
    image: busybox:1.30
    imagePullPolicy: Never

配置镜像拉取策略

配置镜像拉取策略为 Never 
1.配置镜像拉取策略为Never
[root@k8s-master ~]# vim pod-imagepullpolicy.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-imagepullpolicy
  namespace: dev
  labels:
    app: base
spec:
  containers:  
  - name: nginx
    image: nginx:1.11				#拉取一个本地不存在的镜像
    imagePullPolicy: Always
  - name: busybox
    image: busybox:1.30

2.创建资源
[root@k8s-master ~]# kubectl create -f pod-imagepullpolicy.yml 
pod/pod-imagepullpolicy created

3.查看创建过程
[root@k8s-master ~]# kubectl describe pod/pod-imagepullpolicy -n dev

因为本地没有 nginx:1.11 版本,当前策略是 Never

Kubernetes 集群 Pod 资源镜像拉取策略、环境变量、端口设置等详细参数使用(五)_Pod_02

配置拉取策略为 Always 

Always 永远从远程仓库拉取,比较耗时,最好的就是使用 ifNotPresent,要拉取新的镜像所有可以用 Always 策略

1.编写yaml
[root@k8s-master ~]# vim pod-imagepullpolicy.yml
apiVersion: v1
kind: Pod
metadata:
  name: pod-imagepullpolicy
  namespace: dev
  labels:
    app: base
spec:
  containers:
  - name: nginx
    image: nginx:1.11
    imagePullPolicy: Always
  - name: busybox
    image: busybox:1.30

2.创建资源
[root@k8s-master ~]# kubectl create -f pod-imagepullpolicy.yml
pod/pod-imagepullpolicy created

3.查看资源
[root@k8s-master ~]# kubectl describe pod pod-imagepullpolicy -n dev

Kubernetes 集群 Pod 资源镜像拉取策略、环境变量、端口设置等详细参数使用(五)_环境变量_03

配置容器环境变量

主要是在容器启动后设置一些环境变量 env 配置和 args 等命令都是对齐的,其实这些参数放在哪个容器下面,就是对哪个容器生效的,目前就只是对 busybox 容器生效,可以设置多个变量,每一个变量以-开始算一组环境变量建议定义在 configmap 中

[root@k8s-master ~]# kubectl explain pod.spec.containers.env
KIND:     Pod
VERSION:  v1
RESOURCE: env <[]Object>
FIELDS:
   name	<string> 				//定义变量的名称
   value	<string>			//定义变量的值
1.编写yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-env
  namespace: dev
  labels:
    app: base
spec:
  containers:
  - name: nginx
    image: nginx:1.11
    imagePullPolicy: IfNotPresent
  - name: busybox
    image: busybox:1.30
    imagePullPolicy: IfNotPresent
    #command: ["/bin/sh","-c","touch/hello.txt;while true;do /bin/echo $(date +%T)>>/tmp/hellow.txt;sleep 3;done;"]
    command: ["/bin/sh"]
    args: ["-c","touch/hello.txt;while true;do /bin/echo $(date +%T)>>/tmp/hellow.txt;sleep 3;done;"]
    env:						# env 配置和 args 都是对齐的,其实这些命令放在哪个容器下面,就是对哪个容器生效的,目前就只是对 busybox 容器生效,可以设置多个变量,每一个变量以-开始算一组
    - name: "username"			#定义变量名称
      value: "jiangxl"			#定义变量值
    - name: "job"
      value: "it"
      
2.创建pod      
[root@k8s-master ~]# kubectl create -f pod-env.yaml 
pod/pod-env created

3.进入容器查看环境变量是否生效
[root@k8s-master ~]# kubectl exec -it pod-env -n dev -c busybox /bin/sh
/ # echo $username
jiangxl
/ # echo $job
it

配置容器端口

containers.ports 用于设置容器对外提供访问的端口

ports 下面还有一些子配置项

[root@k8s-master ~]# kubectl explain pod.spec.containers.ports
KIND:     Pod
VERSION:  v1
RESOURCE: ports <[]Object>
FIELDS:
   name	<string>					//定义端口名称,如果指定,必须保证 name 在当前 pod 中是唯一的
   containerPort	<integer> 		//定义容器要监听的端口,指定来了哪个端口,就能通过 podip+ 端口进行访问让其中的业务
   hostPort	<integer>				//定义容器要在主机上公开的端口,如果设置,主机上只能运行容器的一个副本,这个端口主要是将容器的端口也映射到主机上的一个端口,基本不配置,因为一旦配置,此 pod 只能有一个副本,如果有2个以上副本,那么映射的端口都一致,就会出现端口冲突的现象
   hostIP	<string>				//定义要将 hostPort 绑定到哪个节点 IP 上,一般不设置
   protocol	<string>				//定义端口协议,必须是 UDP、TCP、SCTP,默认为 TCP

设置 nginx 容器对外暴露端口

1.编写yaml文件
[root@k8s-master ~]# vim pod-ports.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-ports
  namespace: dev
  labels:
    app: base
spec:
  containers:
  - name: nginx
    image: nginx:1.11
    ports:							   #定义端口,一个 - name 表示一个端口,可以写多个
    - name:	nginx-port					#定义端口名称			
      containerPort: 80					#定义开放的端口
      protocol: TCP						#指定端口属于什么协议

2.创建pod
[root@k8s-master ~]# kubectl create -f pod-ports.yaml 
pod/pod-ports created
[root@k8s-master ~]# kubectl get pod/pod-ports -n dev -o wide
NAME        READY   STATUS    RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
pod-ports   1/1     Running   3          5m37s   10.244.1.32   k8s-node1   <none>           <none>


3.查看是否生效指定端口
[root@k8s-master ~]# kubectl describe pod/pod-ports -n dev
·······
    Port:           80/TCP
·······

4.访问容器端口
[root@k8s-master ~]# curl 10.244.1.32:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
··········