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

相关推荐
ReadThroughLife1 分钟前
【已解决】MACOS M4 芯片使用 Docker Desktop 工具安装 MICROSOFT SQL SERVER
microsoft·macos·docker·容器
KrityCat13 分钟前
阿里云Alibaba Cloud安装Docker与Docker compose【图文教程】
阿里云·docker·容器
{⌐■_■}29 分钟前
【ubuntu】虚拟机安装配置,sh脚本自动化,包含 apt+时间同步+docker+mysql+redis+pgsql
ubuntu·docker·自动化
Orlando cron3 小时前
Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?
网络·tcp/ip·kubernetes
藥瓿亭8 小时前
K8S认证|CKS题库+答案| 9. 网络策略 NetworkPolicy
linux·运维·docker·云原生·容器·kubernetes·cks
955.8 小时前
k8s从入门到放弃之Pod的容器探针检测
云原生·容器·kubernetes
LFloyue9 小时前
Linux离线(zip方式)安装docker
linux·docker
yunken2810 小时前
docker容器保存为不依赖基础镜像的独立镜像方法
java·docker·容器
langmeng11010 小时前
使用docker在3台服务器上搭建基于版本redis 6.x的一主两从模式
运维·redis·docker·容器·集群
leblancAndSherry11 小时前
Gitlab + Jenkins 实现 CICD
linux·运维·docker·kubernetes·gitlab·jenkins