4.2.k8s的pod-标签管理、镜像拉取策略、容器重启策略、资源限制、优雅终止

一、标签管理

1.标签在k8s中极其重要,大多数资源的相互关联就需要使用标签;也就是说,资源的相互关联大多数时候,是使用标签进行关联的;

2.其他作用,在k8s集群中,node节点的一些操作比如污点及污点容忍等,都需要使用到标签;

查看标签

[root@k8s1 pod]# kubectl get pod --show-labels

NAME READY STATUS RESTARTS AGE LABELS

my-pod-hpm 1/1 Running 0 40m <none>

pod-env 1/1 Running 0 22m <none>

pod-hnw 1/1 Running 0 64m <none>

volumes-nfs01 1/1 Running 0 3h2m <none>

volumes-nfs02 1/1 Running 0 3h2m <none>

创建标签-声明式

创建资源清单

[root@k8s1 pod]# vi pod-labels.yaml

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: m-nginx
  #给资源添加标签
  labels:
    name: "oslee"
    age: "18"
spec:
  containers:
    - name: c-nginx
      image: nginx:1.20.1-alpine

[root@k8s1 pod]# kubectl apply -f pod-labels.yaml

pod/m-nginx created

查看标签

[root@k8s1 pod]# kubectl get pod --show-labels

NAME READY STATUS RESTARTS AGE LABELS

m-nginx 1/1 Running 0 34m age=18,name=oslee

创建标签-响应式

[root@k8s1 pod]# kubectl label pod m-nginx addr=beijing

pod/m-nginx labeled

[root@k8s1 pod]# kubectl get pod --show-labels

NAME READY STATUS RESTARTS AGE LABELS

m-nginx 1/1 Running 0 36m addr=beijing,age=18,name=oslee

删除标签

[root@k8s1 pod]# kubectl label pod m-nginx addr-

pod/m-nginx unlabeled

[root@k8s1 pod]# kubectl get pod --show-labels

NAME READY STATUS RESTARTS AGE LABELS

m-nginx 1/1 Running 0 37m age=18,name=oslee

修改标签

[root@k8s1 pod]# kubectl label pod m-nginx age=19 --overwrite

pod/m-nginx labeled

[root@k8s1 pod]# kubectl get pod --show-labels

NAME READY STATUS RESTARTS AGE LABELS

m-nginx 1/1 Running 0 82s age=19,name=oslee

通过标签删除pod

通过标签删除pod

[root@k8s1 pod]# kubectl delete pod -l age=19

pod "m-nginx" deleted

删除全部标签

[root@k8s1 pod]# kubectl delete pods --all

二、pod的镜像拉取策略

IfNotPresent

只有当镜像在本地不存在时才会拉取。(先对本地进行排查,本地有该镜像直接使用,本地没有该镜像则选择在仓库中拉取)

Always

总是从仓库拉取镜像,无论本地是否存在镜像(即使本地中存在我们所指定的相关镜像,该策略也会先从仓库中拉取进行应用)

Never

Kubelet 不会尝试获取镜像。如果镜像已经以某种方式存在本地, kubelet 会尝试启动容器;否则,会启动失败。(如果本地不存在,并不会在仓库中拉取,直接报错)

[root@k8s1 pod]# vi pod-ipp.yaml

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: labels-pod
  labels:
    name: "oslee"
    age: "19"
spec:
  containers:
  - image: nginx:1.20.1-alpine
    name: nginx
    # 设置镜像拉取策略
    imagePullPolicy: IfNotPresent

[root@k8s1 pod]# kubectl apply -f pod-ipp.yaml

pod/labels-pod created

三、pod中容器的重启策略

当pod中容器退出时,是否需要重新创建容器?

1,Always(默认值):当容器退出时(不论什么原因),自动拉起新的容器;

2,Never:当容器退出时(不论什么原因),都不会重新创建拉起新的容器;

3,OnFailure:当容器"意外退出"时,才会拉起新的容器;
[root@k8s1 pod]# vi pod-rp.yaml

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: labels-pod
  labels:
    name: oslee
spec:
  #设置容器重启策略
  restartPolicy: Always
  containers:
  - image: nginx:1.20.1-alpine
    name: nginx

[root@k8s1 pod]# kubectl apply -f pod-rp.yaml

pod/labels-pod configured

四、pod的优雅终止

在pod的删除时,系统会自动延迟30s,为了给pod处理未处理完的请求;

vi pod-nginx.yaml

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: m-nginx
  labels:
    name: oslee
spec:
  #pod优雅终止字段,定义延时kill信号的时间,给pod处理未完成的请求时间;
  #缓期多少秒时间执行;若不设置,默认是30s;
  terminationGracePeriodSeconds: 3
  containers:
    - name: c-nginx
      image: nginx:1.20.1-alpine
      #定义容器的生命周期(容器启动做什么动作,容器停止前做什么动作)
      lifecycle:
        #容器启动前做什么
        postStart:
          exec:
            command:
            - "sh"
            - "-c"
            - "echo \"postStart at $(date +%F_%T)\" >> /poststart.log "
        #容器停止前做什么
        preStop:
          exec:
            command:
            - "sh"
            - "-c"
            - "echo \"prestop at $(date +%F_%T)\" >> /prestop.log"

[root@k8s1 pod]# kubectl apply -f pod-nginx.yaml

pod/m-nginx created

[root@k8s1 pod]# kubectl exec m-nginx -it -- sh

/ # cat poststart.log

postStart at 2024-04-06_09:34:43

五、pod中容器的资源限制

[root@k8s1 pod]# vi pod-resources.yaml

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-res
spec:
  nodeName: k8s2
  containers:
  - name: c1
    image: nginx:1.20.1-alpine
    #设置资源限制
    resources:
      #最大资源的使用限制;最多就能用这么多的资源;
      limits:
        #2核心;
        cpu: 2000m
        #限制内存
        memory: 40M
      #期望资源限制;需要宿主机预留的资源,我可以不用,但是你必须要有;
      requests:
        #1核心
        cpu: 1000m
        #限制内存
        memory: 20M

[root@k8s1 pod]# kubectl apply -f pod-resources.yaml

pod/pod-res created

查看资源限制,资源清单指定部署在节点k8s2上

[root@k8s2 ~]# docker stats | grep c1

六、pod的容器类型

01-基础架构容器【pause】:运行pod中的容器时,提供容器的网络名称空间

02-初始化容器【initContainers】:

  • 完成一些业务容器运行前的操作,如执行命令,如果初始化容器没有创建成功,将一直重启,业务容器也就无法创建出来;
  • 它可以延后业务容器的启动时间;

基础架构容器pause

查看基础架构容器

[root@k8s2 data]# docker container ps | grep pause

初始化容器initContainers

[root@k8s1 pod]# vi pod-init-c.yaml

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: pod-init-c
spec:
  #声明初始化容器
  initContainers:
  - name: init-c1
    image: alpine
    #在初始化容器中执行命令
    command: 
    - "sleep"
    - "10"
  - name: init-c2
    image: alpine
    command:
    - "sleep"
    - "5"
  #业务容器
  containers:
  - name: c1
    image: alpine
    #给容器一个标准输入,也就是守护进程
    stdin: true

创建资源

[root@k8s1 pod]# kubectl apply -f pod-init-c.yaml

pod/pod-init-c created

查看描述

[root@k8s1 pod]# kubectl describe pod/pod-init-c

七、pod中容器的守护进程

创建资源清单,拉取alpine最小linux系统

[root@k8s1 pod]# vi pod-alpine.yaml

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: m-alpine
spec:
  containers:
    - name: c1
      image: alpine:3.19.1

[root@k8s1 pod]# kubectl apply -f pod-alpine.yaml

pod/m-alpine created
[root@k8s1 pod]# kubectl get pod

查看pod资源,发现,启动后会结束,因为没有守护进程

守护进程,加入标准输入stdin

[root@k8s1 pod]# vi pod-alpine.yaml

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: m-alpine
spec:
  containers:
    - name: c1
      image: alpine:3.19.1
      stdin: true

[root@k8s1 pod]# kubectl delete -f pod-alpine.yaml

pod "m-alpine" deleted

[root@k8s1 pod]# kubectl apply -f pod-alpine.yaml

pod/m-alpine created

[root@k8s1 pod]# kubectl get pod

NAME READY STATUS RESTARTS AGE

m-alpine 1/1 Running 0 48s

守护进程,命令方式

· command

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: m-alpine
spec:
  containers:
    - name: c1
      image: alpine:3.19.1
      #在容器当中执行命令
      command:
      - "tail"
      - "-f"
      - "/etc/hosts"

· args

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: m-alpine
spec:
  containers:
    - name: c1
      image: alpine:3.19.1
      args:
      - "tail"
      - "-f"
      - "/etc/hosts"

· command与args结合

args可以当做command的参数进行命令执行;

跟docker中的守护进程命令一样;command就类似于ENTRYPOINT;args就类似于CMD;

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: m-alpine
spec:
  containers:
    - name: c1
      image: alpine
      command:
      - "tail"
      - "-f"
      args:
      - "/etc/hosts"

八、pod排障之日志查询

pod资源清单

[root@k8s1 pod]# vi pod-log-nginx.yaml

bash 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: m-log-nginx
spec:
  terminationGracePeriodSeconds: 1
  containers:
    - name: c1
      image: nginx:1.20.1-alpine

[root@k8s1 pod]# kubectl apply -f pod-log-nginx.yaml

模拟循环访问pod

[root@k8s1 pod]# kubectl get pod -owide

NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES

m-log-nginx 1/1 Running 0 1s 10.100.1.21 k8s2 <none> <none>

bash 复制代码
while true ; 
do 
  curl 10.100.1.21 ; 
  sleep 0.5 
done

查看pod日志

[root@k8s1 pod]# kubectl logs pod/m-log-nginx -f

如果pod中容器发生重启,如何查看重启前的容器的log日志信息?

[root@k8s1 pod]# kubectl logs -p pod/m-log-nginx -f

模拟容器重启

[root@k8s2 ~]# docker kill a0706cc1dd9a

九、进入pod容器exec与cp命令

#进入pod中容器

kubectl exec pod名称 -it -- sh
#拷贝容器中数据到宿主机(默认pod中第一个容器)

kubectl cp pod名称:/root/123.txt ./

#拷贝宿主机数据到容器

kubectl cp ./222.log pod名称:/mnt/

#指定容器拷贝

kubectl cp -c 容器名 pod名称:/root/123.txt ./
#pod外部执行命令

[root@k8s1 pod]# kubectl exec m-log-nginx -it -- ifconfig

相关推荐
longgggggggggggggggg3 小时前
curl -fsSL https://get.docker.com|sh 解释命令
docker
LuiChun3 小时前
docker django uwsgi 报错记录
docker·容器·django
tingting01193 小时前
docker 释放磁盘空间--常用清理命令
运维·docker·容器
杨浦老苏3 小时前
轻量级安全云存储方案Hoodik
docker·群晖·网盘
dessler4 小时前
Docker-Dockerfile案例(一)
linux·运维·docker
香吧香4 小时前
已有docker镜像构建过程分析
docker
橙子家czzj4 小时前
关于 K8s 的一些基础概念整理-补充【k8s系列之二】
java·开发语言·kubernetes
小安运维日记7 小时前
CKA认证 | Day7 K8s存储
运维·云原生·容器·kubernetes·云计算
AR_xsy8 小时前
K8S--“ Failed to create pod sandbox: nameserver list is empty“
云原生·容器·kubernetes
码农炎可8 小时前
K8S 黑魔法之如何从 Pod 拿到节点的命令行
安全·云原生·容器·kubernetes