前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >3.工作负载-认识和使用Pod

3.工作负载-认识和使用Pod

作者头像
AI码师
发布2024-04-10 11:18:02
1390
发布2024-04-10 11:18:02
举报

认识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的配置,包括容器规范、环境变量、资源限制等。「kubectl命令:」 使用kubectl命令行工具创建、删除、管理Pod。「ReplicaSets和Deployments:」 通过ReplicaSets和Deployments来管理Pod的复制和更新。

多容器Pod:

「定义:」 一个Pod可以包含多个容器,这些容器共享相同的网络和存储。「使用场景:」 多容器Pod适用于需要协同工作的应用,例如日志收集、辅助任务等。

Pod的基本使用

多种方式创建Pod

通过kubectl 命令创建Pod
代码语言:javascript
复制
## 直接运行一个nginx pod
kubectl run pod-kubectl --image=nginx:latest

-------
pod/pod-kubectl created
## 查看pod 列表
kubectl get pod

-------
NAME          READY   STATUS    RESTARTS   AGE
pod-kubectl   1/1     Running   0          66s

查看更多信息的列表

代码语言:javascript
复制
kubectl get pod -owide

-------
NAME          READY   STATUS    RESTARTS   AGE     IP             NODE        NOMINATED NODE   READINESS GATES
pod-kubectl   1/1     Running   0          4m12s   10.188.36.65   k8s-node1   <none>           <none>

# 查看pod具体信息
kubectl describe pod pod-kubectl

在master节点访问nginx

代码语言:javascript
复制
curl 10.188.36.65

-------
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
通过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

按照文件创建资源

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

-------
pod/pod-nignx-simple created

kubectl get pod -owide

-------
NAME               READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
pod-kubectl        1/1     Running   0          30m   10.188.36.65     k8s-node1   <none>           <none>
pod-nignx-simple   1/1     Running   0          67s   10.188.169.130   k8s-node2   <none>           <none>

配置Pod 镜像拉取策略

spec.containers[].imagePullPolicy: IfNotPresentAlways(重新下载镜像)| 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.cpuspec.containers[].resources.limits.memoryspec.containers[].resources.requests.cpuspec.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
  • 验证postStart 回调
代码语言:javascript
复制
#进入容器
kubectl exec -it pod-nignx-simple-lifecycle -- /bin/bash
cat /k8s.txt

-------
postStart
  • 验证preStop回调
代码语言:javascript
复制
# 删除容器
kubectl delete pod pod-nignx-simple-lifecycle
# 在另一个节点执行命令
kubectl exec -it pod-nignx-simple-lifecycle -- /bin/bash
cat /k8s.txt

-------
postStart
preStop

为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

运行执行,我们进入容器删除index.html

代码语言:javascript
复制
kubectl exec -it pod-nginx-simple-liveness-http -- /bin/bash
rm -rf /usr/share/nginx/html/index.html

等一会再执行

代码语言:javascript
复制
kubectl get pod

再执行describe,看pod情况

代码语言:javascript
复制
kubectl describe pod pod-nginx-simple-liveness-http
就绪探针

就绪探针同存活探针配置一样,唯一不同的就是readinessProbe

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx-simple-readiness
spec:
  containers:
  - name: pod-nginx-simple-readiness
    image: nginx:1.14.2
    imagePullPolicy: IfNotPresent
    readinessProbe:
      httpGet:
        path: /index.html
        port: 80
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

同样,在容器启动一会之后,我们进入到容器删除index.html,在等一会看pod情况 可以看到就绪探针检测失败

pod ready数量为0,但是不会自动重启,和存活探针不同

启动探针
代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: pod-nginx-simple-startup
spec:
  containers:
  - name: pod-nginx-simple-startup
    image: nginx:1.14.2
    imagePullPolicy: IfNotPresent
    startupProbe:
      httpGet:
        path: /index2.html
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 3

因为index2.html肯定不存在,所以肯定无法启动

修改成index.html 则探针检测成功,不再演示

‍‍

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-04-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 乐哥聊编程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 认识Pod
    • Pod的基本概念
      • Pod中的容器
        • Pod的网络模型
          • Pod的生命周期
            • Pod的创建和管理
              • 多容器Pod:
              • Pod的基本使用
                • 多种方式创建Pod
                  • 通过kubectl 命令创建Pod
                  • 通过yaml 文件定义pod
                • 配置Pod 镜像拉取策略
                  • 资源申请
                    • 生命周期事件回调
                      • 为Pod加上启动、就绪、存活探针
                        • 存活探针
                        • 就绪探针
                        • 启动探针
                    相关产品与服务
                    容器服务
                    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档