五、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,表示如果本地没有镜像,才去仓库下载,否则直接使用本的镜像。其他下载策略:

  1. Always,每次都下载最新镜像(默认);
  2. Never,只使用本地镜像,从不下载。

查看是否建立成功:

[root@vms201 pod-practice]# kubectl get pods
NAME   READY   STATUS    RESTARTS   AGE
pod1   1/1     Running   0          2m7s

创建时其他常用参数:

  1. –env “aa=bb”,指定环境变量
  2. –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向宿主机拷贝内容

kubectl cp pod名:/etc/hosts hosts # 拷贝到宿主机上的文件名

二、pod的生命周期

Pod的状态:

  1. Pending pod 因为其他的原因导致pod准备开始创建 还没有创建(卡住了);
  2. Running pod已经被调度到节点上,且容器工作正常;
  3. Completed pod里所有容器正常退出;
  4. error、CrashLoopBackOff 创建的时候就出错,属于内部原因;
  5. imagePullBackoff 创建pod的时候,镜像下载失败。

Pod 的重启策略有 3 种,默认值为 Always。

  1. Always : 容器失效时,kubelet 自动重启该容器;
  2. OnFailure : 容器终止运行且退出码不为0(不是正常退出)时重启;
  3. 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课程》

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

格洛米爱学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值