五、K8s pod相关操作(1)
作者:互联网
概述:
Pod是K8s里的最小调度单位,可以包含多个容器,其中一个作为主容器,其他容器做为sidecar。例如Nginx作为主容器(主观定义),ELK做Nginx的日志收集(服务于主容器),并不能在一个Pod中实现多个主要的功能。
Pod中的容器共用一个IP地址,使用端口号进行区分,因此Pod容器中的端口号不能重复。
实验环境:
一、创建及删除pod
创建pod的方式:
1.命令行
2.yaml文件(推荐)
步骤1:以命令行的方式创建pod1
在master上,创建Nginx容器:
[root@vms201 pod-practice]# kubectl run pod1 --image=nginx --image-pull-policy=IfNotPresent --env "aa=bb" --labels="type=web"
pod/pod1 created
其中–image-pull-policy=IfNotPresent,表示如果本地没有镜像,才去仓库下载,否则直接使用本的镜像。其他下载策略:
- Always,每次都下载最新镜像(默认);
- Never,只使用本地镜像,从不下载。
查看是否建立成功:
[root@vms201 pod-practice]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 2m7s
创建时其他常用参数:
- –env “aa=bb”,指定环境变量
- –labels=“type=web” 设置标签
进入pod1,查看设置的环境变量:
[root@vms201 pod-practice]# kubectl exec -it pod1 -- bash
root@pod1:/# echo $aa
bb
如果pod里有多个容器,则命令是在第一个容器里执行。
查看labels:
[root@vms201 pod-practice]# kubectl get pods --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod1 1/1 Running 0 3m50s type=web
步骤2:使用yaml文件创建pod2
通过dry-run参数模拟运行,并产生初始的yaml文件,导入到pod2.yaml中:
[root@vms201 pod-practice]# kubectl run pod2 --image=nginx --image-pull-policy=IfNotPresent --dry-run=client -o yaml > pod2.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod2
name: pod2
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod2
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
查看pods的yaml文件有哪些可以写的一级参数例如(apiversion、metadata)等,每一级需要用2个空格进行分隔):
kubectl explain pods
查看metadata下的的二级参数,其他依次内推:
kubectl explain pods.metadata
修改yaml文件:
vim pod2.yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod2
name: pod2
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
name: pod2
resources: {}
env:
- name: aa
value: xxx
- name: bb
value: '999'
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
注意,yaml文件中- 表示列表,在可以重复多次设置类似属性时使用,例如 - image可以多次重复,设置pod内的容器。
应用yaml文件产生pod:
[root@vms201 pod-practice]# kubectl apply -f pod2.yaml
pod/pod2 created
[root@vms201 pod-practice]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 1/1 Running 0 x
pod2 1/1 Running 0 x
步骤3:用pod2.yaml文件创建多个pod
[root@vms201 pod-practice]# sed 's/pod2/pod3/' pod2.yaml | kubectl apply -f -
pod/pod3 created
步骤4:删除pod
使用命令行或使用对应的yaml文件来删除pod:
[root@vms201 pod-practice]# kubectl delete pod pod1
pod "pod1" deleted
[root@vms201 pod-practice]# kubectl delete pod pod3
pod "pod3" deleted
[root@vms201 pod-practice]# kubectl delete -f pod2.yaml
pod "pod2" deleted
其他常用:
1.对于不同的资源类型,yaml文件中的apiversion是不一样的:
kubectl api-versions
可以使用上面的命令来查看。
2.查看pod描述:
kubectl describe pod pod名
3.查看pod的输出信息:
kubectl logs pod名 -c 容器名 #如果有多个容器的话
4.编辑pod文件:
kubectl edit pod pod名
5.向容器中输入相关命令,并返回信息:
kubectl exec -c 容器名(不指定则是默认的第一个容器) pod名 -- 命令
6.拷贝内容
宿主机向pod内拷贝
kubectl cp /etc/hosts pod名:/tmp
pod向宿主机拷贝内容
```bash
kubectl cp pod名:/etc/hosts hosts # 拷贝到宿主机上的文件名
二、pod的生命周期
Pod的状态:
- Pending pod 因为其他的原因导致pod准备开始创建 还没有创建(卡住了);
- Running pod已经被调度到节点上,且容器工作正常;
- Completed pod里所有容器正常退出;
- error、CrashLoopBackOff 创建的时候就出错,属于内部原因;
- imagePullBackoff 创建pod的时候,镜像下载失败。
Pod 的重启策略有 3 种,默认值为 Always。
- Always : 容器失效时,kubelet 自动重启该容器;
- OnFailure : 容器终止运行且退出码不为0(不是正常退出)时重启;
- Never : 不论状态为何, kubelet 都不重启该容器。
当我们在一个pod的yaml文件中设置的restartPolicy设置为了Always,当容器运行完成后会自动重启。
手动设置容器的生命周期:
方式1:直接设置yaml文件:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
spec:
containers:
- image: nginx
imagePullPolicy: IfNotPresent
# command: ["sh","-c","sleep 10"]
command:
- sh
- -c
- sleep 10
name: pod1
resources: {}
ports:
- name: http
containerPort: 80
protocol: TCP
env:
- name: aa
value: xxx
- name: bb
value: '999'
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
例如这里通过command的替换了Nginx容器中执行的进程,10s后将会退出。然后restartPolicy设置的内容可以看到为Always,当容器退出后将会重启:
[root@vms201 pod-practice]# kubectl apply -f pod1.yaml
pod/pod1 created
10s后查看:
[root@vms201 pod-practice]# kubectl get pods
NAME READY STATUS RESTARTS AGE
pod1 0/1 Completed 1 34s
可以看到restart的次数为1,说明已经重启了。
方式2:通过命令行进行设置
[root@vms201 pod-practice]# kubectl run pod1 --image=nginx -o yaml -- sh -c sleep 10
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2021-07-03T16:48:25Z"
labels:
run: pod1
name: pod1
namespace: 2-pod
resourceVersion: "42875"
uid: afcf4d5c-f6ad-417f-94bd-da412c12ff9a
spec:
containers:
- args:
- sh
- -c
- sleep
- "10"
image: nginx
imagePullPolicy: Always
name: pod1
resources: {}
可以看到输出的yaml文件中的守护进程已经被修改,使用args的方式和command的方式一样。
宽限期:优雅的关闭pod
当我们需要删除pod时,其容器可能正在执行任务,所以有一个宽限期,默认为30s,如果30s内容器执行完任务,就删除容器,如果没有执行完,则到达30s时强行删除。
宽限期可以在pod的yaml文件中通过terminationGracePeriodSeconds进行配置,如果值为0,表示没有宽限期。
vim pod1.yaml
添加terminationGracePeriodSeconds参数:
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
spec:
terminationGracePeriodSeconds: 0
containers:
- image: nginx
imagePullPolicy: IfNotPresent
# command: ["sh","-c","sleep 10"]
name: pod1
resources: {}
ports:
- name: http
containerPort: 80
protocol: TCP
env:
- name: aa
value: xxx
- name: bb
value: '999'
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
三、pod hook
在容器启动或者关闭时的时候,除了主进程,再启动其他进程。可以编辑yaml文件实现其功能。
postStart:
容器启动之后执行xxxx,和主进程是同时运行起来的,没有先后顺序。
例如,编写pod的yaml文件,同时将日期拷贝进入两个文件中
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: pod1
name: pod1
spec:
terminationGracePeriodSeconds: 0
containers:
- image: nginx
imagePullPolicy: IfNotPresent
command: ["sh","-c","date >> /tmp/aa.txt"]
name: pod1
resources: {}
lifecycle:
postStart:
exec:
command: ["/bin/bash", "-c", "date >> /tmp/bb.txt"]
ports:
- name: http
containerPort: 80
protocol: TCP
env:
- name: aa
value: xxx
- name: bb
value: '999'
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
进入容器,查看日期是否被同时写入了两个txt文件中:
kubectl exec -it pod1 -- bash
root@pod1:/tmp# cat aa.txt
Sun Jul 4 02:34:00 UTC 2021
root@pod1:/tmp# cat bb.txt
Sun Jul 4 02:34:00 UTC 2021
preStop:
在容器关闭前执行的进程,其用法和postStart同理。
参考资料:
《老段CKA课程》
标签:kubectl,name,容器,yaml,操作,pod,K8s,pod1 来源: https://blog.csdn.net/tushanpeipei/article/details/118444242