前戏
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 成功拉取但未启动
镜像拉取策略
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
配置拉取策略为 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
配置容器环境变量
主要是在容器启动后设置一些环境变量 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>
··········