K8s-工作负载Pod

2024-07-31 10:12:32 浏览数 (2)

工作负载Pod

认识Pod

Pod的基本概念

定义: Pod是Kubernetes中最小的部署单元,是一个或多个紧密关联容器的组合。

调度: Pod作为一个整体被调度到Kubernetes集群中的节点上。

生命周期Pod的生命周期由包含的容器的生命周期决定。

Pod中的容器

容器定义: Pod中的容器通过Pod的容器列表定义,这些容器可以共享相同的网络和存储。

共享资源: 容器共享相同的网络命名空间,可以通过localhost进行通信。它们也可以访问共享的存储卷。

Pod的网络模型

共享网络: 所有Pod中的容器共享同一个IP地址和端口空间,它们可以使用localhost进行直接通信。

Service: Pod可以通过Service抽象进行访问,Service提供了负载均衡和服务发现的功能。

Pod的状态

Pending: Pod正在等待调度到某个节点上。

Running: Pod中的至少一个容器正在运行。

Succeeded: Pod中的所有容器已成功运行完成。

Failed: Pod中的至少一个容器已经以非正常状态退出。

Unknown: Pod的状态无法确定。

Pod的创建和管理

Pod定义文件: 使用YAML文件定义Pod的配置,包括容器规范、环境变量、资源限制等。

通过yaml 文件定义pod:

pod-nginx-simple.yaml

代码语言:javascript复制
apiVersion: v1
kind: Pod
metadata:
  name: pod-nignx-simple
spec:
  containers:
  - name: pod-nignx-simple
    image: nginx:1.14.2
    ports:
    - containerPort: 80

按照文件创建资源:

kubectl apply 命令用于根据 YAML 或 JSON 文件创建或更新资源配置。

代码语言:javascript复制
kubectl apply -f filename

kubectl命令: 使用kubectl命令行工具创建、删除、管理Pod。

代码语言:javascript复制
## 直接运行一个nginx pod
kubectl run pod-kubectl --image=nginx:latest
## 查看pod 列表
kubectl get pod
## 查看更多信息的列表
kubectl get pod -owide
# 查看pod具体信息
kubectl describe pod podname
#进入容器
kubectl exec -it podname -- /bin/bash
# 删除容器
kubectl delete pod podname

ReplicaSets和Deployments: 通过ReplicaSets和Deployments来管理Pod的复制和更新。

多容器Pod

定义: 一个Pod可以包含多个容器,这些容器共享相同的网络和存储。

使用场景: 多容器Pod适用于需要协同工作的应用,例如日志收集、辅助任务等。

Pod配置
配置Pod 镜像拉取策略

spec.containers[].imagePullPolicy: IfNotPresent: Always(重新下载镜像)| Never(仅使用本地) | IfNotPresent(优先使用本地)

资源申请

当你为 Pod 中的 Container 指定了资源 request(请求) 时, kube-scheduler 就利用该信息决定将 Pod 调度到哪个节点上。

当你为 Container 指定了资源 limit(限制) 时,kubelet 就可以确保运行的容器不会使用超出所设限制的资源。 kubelet 还会为容器预留所 request(请求) 数量的系统资源,供其使用。

单位:CPU(0.1/100m) Memory(100Ei、100Pi、100Ti、100Gi、100Mi、100Ki)

配置:

spec.containers[].resources.limits.cpu spec.containers[].resources.limits.memory spec.containers[].resources.requests.cpu spec.containers[].resources.requests.memory

生命周期事件回调
  • postStart: Kubernetes 在容器创建后立即发送 postStart 事件。 然而,postStart 处理函数的调用不保证早于容器的入口点(entrypoint) 的执行
  • preStop: Kubernetes 在容器结束前立即发送 preStop 事件(terminating),如果preStop被阻塞,那外界将会一直等待该事件结束,除非 Pod 宽限期限超时(terminationGracePeriodSeconds=30)

定义Pod:postStart回调后 输出“postStart”到k8s.txt,preStop回调后 输出“preStop”到k8s.txt

代码语言:javascript复制
apiVersion: v1
kind: Pod
metadata:
  name: pod-nignx-simple-lifecycle
spec:
  containers:
  - name: pod-nignx-simple-lifecycle
    image: nginx:1.14.2
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo postStart > /k8s.txt"]
      preStop:
        exec:
          command: ["/bin/sh","-c","echo preStop >> /k8s.txt;sleep 3600;"]
    ports:
    - containerPort: 80
为Pod加上启动、就绪、存活探针

定义

  • 存活探针:k8s通过存活探针来确定什么时候要重启容器。
  • 就绪探针:k8s通过就绪探针来判断是否要给流量
  • 启动探针:k8s通过启动探针来了解应用容器何时启动,如果配置了这类探针,那么在这个探针成功之前就不会触发存活和就绪探针,防止程序被频繁kill

存活探针:

  • exec模式

容器启动时创建healthy文件,休眠30秒,删除healthy文件,休眠3000秒 存活探针延时5秒调用,后面每隔5秒调用一次,验证存活

代码语言:javascript复制
apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx-simple-liveness-exec
spec:
  containers:
  - name: pod-nginx-simple-liveness-exec
    image: nginx:1.14.2
    imagePullPolicy: IfNotPresent
    args:
    - /bin/sh
    - -c
    - touch /healthy; sleep 30; rm -f /healthy; sleep 3000
    livenessProbe:
      exec:
        command:
        - cat
        - /healthy
      initialDelaySeconds: 5
      periodSeconds: 5

观察探针情况:

代码语言:javascript复制
kubectl describe pod pod-nginx-simple-liveness-exec
  • http模式
代码语言:javascript复制
apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx-simple-liveness-http
spec:
  containers:
  - name: pod-nginx-simple-liveness-http
    image: nginx:1.14.2
    imagePullPolicy: IfNotPresent
    livenessProbe:
      httpGet:
        path: /index.html
        port: 80
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

sProbe: httpGet: path: /index.html port: 80 httpHeaders: - name: Custom-Header value: Awesome initialDelaySeconds: 3 periodSeconds: 3

0 人点赞