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 \ pod-env 1/1 Running 0 22m \ pod-hnw 1/1 Running 0 64m \ volumes-nfs01 1/1 Running 0 3h2m \ volumes-nfs02 1/1 Running 0 3h2m \

创建标签-声明式

创建资源清单

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 \ \

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

相关推荐
SunTecTec14 分钟前
Dockerfile 编写根据需求阶段而出现
docker
欧先生^_^1 小时前
删除k8s某命名空间,一直卡住了怎么办?
云原生·容器·kubernetes
motosheep1 小时前
关于安卓自动化打包docker+jenkins实现
android·docker·自动化
梁萌2 小时前
dify升级最新版本(保留已创建内容)
docker·升级·dify
阿湯哥4 小时前
外部访问 Kubernetes 集群中 MQ 服务的方案
云原生·容器·kubernetes
PolarisHuster6 小时前
如何查看k8s获取系统是否清理过docker镜像
docker·容器·kubernetes
matrixlzp6 小时前
K8S Secret 快速开始
云原生·容器·kubernetes
一只特立独行的猫7 小时前
Docker与Vmware网络模式的对别
网络·docker·容器
GoodStudyAndDayDayUp7 小时前
docker拉取国内镜像
运维·docker·容器
中草药z7 小时前
【Docker】Docker拉取部分常用中间件
运维·redis·mysql·docker·容器·nacos·脚本