k8s - container

1、容器的生命周期:

(1) 简介:

Kubernetes 会跟踪 Pod 中每个容器的状态,就像它跟踪 Pod 总体上的阶段一样。 可以使用容器生命周期回调,在容器生命周期中的特定状态点触发事件。

● 容器生命周期回调:

在容器的生命周期中,可以利用容器生命周期回调来安排特定时间点执行某些任务或触发事件,例如在容器停止时进行清理操作。

(2) 容器状态:

① 种类:

容器的状态有三种: Waiting (等待)、Running (运行中) 和 Terminated (已终止)。

要检查 Pod 中容器的状态,可以使用 kubectl describe pod <pod 名称> 。

② 状态含义:

● Waiting:如果容器并不处在 Running 或 Terminated 状态之一,它就处在 Waiting 状态。 处于 Waiting 状态的容器仍在运行它完成启动所需要的操作。

当使用 kubectl 来查询包含 Waiting 状态的容器的 Pod 时,可以看到一个 Reason 字段,其中给出了容器处于等待状态的原因。

● Running:Running 状态表明容器正在执行状态并且没有问题发生。 如果配置了 postStart 回调,那么该回调已经执行且已完成。

如果 kubectl 来查询包含 Running状态的容器的 Pod 时,可以看到关于容器进入 Running 状态的信息。

● Terminated:处于 Terminated 状态的容器已经开始执行或者正常结束或者因为某些原因失败。

如果使用 kubectl 来查询包含 Terminated 状态的容器的 Pod 时, 可以看到容器进入此状态的原因、退出代码以及容器执行期间的起止时间。

如果容器配置了 preStop 回调,则该回调会在容器进入 Terminated 状态之前执行。

2、容器生命周期回调:

(1) 两个回调:

① postStart:postStart 是一个容器的生命周期事件,用于在容器完全启动之后运行的命令或操作。可以利用 postStart 执行容器启动后的初始化工作,例如准备环境、加载数据、连接外部服务等,确保容器已经启动并且可以处理请求。

② preStop:与 postStart 相对,preStop 是容器停止之前的生命周期事件。当收到停止信号时,在容器正式停止之前,Kubernetes 会调用 preStop ,允许容器在终止之前执行一些清理工作或保存状态。

(2) 示例:

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle
  labels:
    app: lifecycle
spec:
  containers:
    - name: nginx
      image: nginx:1.19
      lifecycle:
        postStart:
          exec:
            command: ["/bin/sh","-c","echo postStart >> /start.txt"]
            #-c:执行命令  在容器创建后输出 postStart 到 start.txt
        preStop:
          exec:
            command: ["/bin/sh","-c","echo preStop >> /stop.txt && sleep 30"]
            #在容器停止前输出 preStop 到 stop.txt,等待30秒后再停止容器
      imagePullPolicy: IfNotPresent
  restartPolicy: Always

3、容器重启策略:

(1) 简介:

Pod 的 spec 中包含一个 restartPolicy 字段,其作用在于控制在容器终止后 Kubernetes 如何处理容器的重启,取值包括 Always(总是重启)、OnFailure(容器异常退出重启) 和 Never ,默认值是 Always 。

restartPolicy 适用于 Pod 中的所有容器。

(2) 示例:

spec:
  containers:
    - name: nginx
      image: nginx:1.19
      imagePullPolicy: IfNotPresent
  restartPolicy: Always

4、自定义容器启动命令:

(1) 简介:

k8s中可以修改容器启动默认执行命令以及传递相关参数。推荐使用 command 修改启动命令,args 为启动命令传递参数。

(2) 示例:

apiVersion: v1
kind: Pod
metadata:
  name: redis
  labels:
    app: redis
spec:
  containers:
    - name: redis
      image: redis:5.0.10
      command: ["redis-server"]
      args: ["--appendonly yes"]
      imagePullPolicy: IfNotPresent
  restartPolicy: Always

5、容器探针:

(1) 概念:

probe 是由 kubelet 对容器执行的定期诊断。 要执行诊断,kubelet 既可以在容器内执行代码,也可以发出⼀个网络请求。(用于定期对容器进行健康检查)

(2) 探针类型:

① livenessProbe (存活探针):指示容器是否正在运行。如果存活态探测失败,则 kubelet 会杀死容器,容器将根据其重启策略决定是否重启。

② readinessProbe (就绪探针):指示容器是否准备好为请求提供服务。如果就绪态探测失败,端点控制器将从与 Pod 匹配的所有服务的端点列表中删除该 Pod 的 IP 地址。

③ startupProbe 1.7+ (启动探针):指示容器中的应用是否已经启动。如果提供了启动探针,其他探针都会被禁用,直到此探针成功为止。如果启动探测失败, kubelet 将杀死容器,容器依其重启策略进行重启。

(3) 探针机制:

① exec:在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。

② grpc:使用 grpc 执行远程过程调用。 如果响应的状态是 "SERVING",则认为诊断成功。

③ httpGet:对容器的 IP 地址上指定端口和路径执行 HTTP GET 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。

④ tcpSocket:对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功。

(4) 探针结果:

Success:成功,容器通过了诊断。

Failure:失败,容器未通过诊断。

Unknown:未知,诊断失败,不会采取任何行动。

(5) 探针参数:

① initialDelaySeconds:初始延迟时间,等待多久后开始第一次探针检测。

② periodSeconds:探测周期,指定探针检测的时间间隔,定义了连续进行健康状态检查的频率。

③ timeoutSeconds:超时时间,探针等待容器响应的最长时间,如果在此时间内没有得到响应,则该探测被视为失败。

④ failureThreshold:失败阈值,定义了连续失败的次数,达到该次数后探测器将认定探测失败。

⑤ successThreshold:成功阈值,定义了连续成功的次数,达到该次数后探测器将认定探测成功。

(6) 探针使用:

① exec:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.19
      imagePullPolicy: IfNotPresent
      livenessProbe:
        exec:  #使用 exec 机制执行命令,通过查看是否有 pid 文件来检测容器状态。
          command:
            - ls
            - /var/run/nginx.pid
        initialDelaySeconds: 5   #初始化时间 5s
        periodSeconds: 4         #检测间隔时间 4s
        timeoutSeconds: 1        #默认检测超时时间为 1s
        failureThreshold: 3      #默认失败次数为 3次,达到 3次后重启 pod
        successThreshold: 1      #默认成功次数为 1次,1次代表成功
  restartPolicy: Always

② tcpsocker:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.19
      imagePullPolicy: IfNotPresent
      livenessProbe:
        tcpSocket:
          port: 80
        initialDelaySeconds: 5   #初始化时间 5s
        periodSeconds: 4         #检测间隔时间 4s
        timeoutSeconds: 1        #默认检测超时时间为 1s
        failureThreshold: 3      #默认失败次数为 3次,达到 3次后重启 pod
        successThreshold: 1      #默认成功次数为 1次,1次代表成功
  restartPolicy: Always

6、容器资源限制:

(1) 种类:

① 内存资源限制: 内存请求 (request) 和内存限制 (limit) 分配给一个容器,保障容器拥有它请求数量的内存,但不允许使用超过限制数量的内存。

② CPU 资源限制: 为容器设置 CPU request 和 CPU limit。 给容器分配其所请求数量的 CPU 资源,容器使用的 CPU 不能超过所配置的限制。

● 请求:基础资源 ;限制:最大资源

(2) metrics-server:

① 简介:

Kubernetes Metrics Server (Kubernetes指标服务器),是一个可扩展的、高效的容器资源度量源。Metrics Server 用于监控每个 Node 和 Pod 的负载。Metrics Server 从 Kubelets 收集资源指标,并通过 Metrics API 在 Kubernetes apiserver中公开。

Metrics API 可以通过kubectl top 访问,使其更容易调试自动扩缩管道。

② 安装 metrics-server:

vim components.yaml

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
    rbac.authorization.k8s.io/aggregate-to-admin: "true"
    rbac.authorization.k8s.io/aggregate-to-edit: "true"
    rbac.authorization.k8s.io/aggregate-to-view: "true"
  name: system:aggregated-metrics-reader
rules:
  - apiGroups:
      - metrics.k8s.io
    resources:
      - pods
      - nodes
    verbs:
      - get
      - list
      - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
rules:
  - apiGroups:
      - ""
    resources:
      - nodes/metrics
    verbs:
      - get
  - apiGroups:
      - ""
    resources:
      - pods
      - nodes
    verbs:
      - get
      - list
      - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
  - kind: ServiceAccount
    name: metrics-server
    namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
  - kind: ServiceAccount
    name: metrics-server
    namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  labels:
    k8s-app: metrics-server
  name: system:metrics-server
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:metrics-server
subjects:
  - kind: ServiceAccount
    name: metrics-server
    namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  ports:
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
  selector:
    k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    k8s-app: metrics-server
  name: metrics-server
  namespace: kube-system
spec:
  selector:
    matchLabels:
      k8s-app: metrics-server
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        k8s-app: metrics-server
    spec:
      containers:
        - args:
            - --cert-dir=/tmp
            - --secure-port=4443
            - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
            - --kubelet-use-node-status-port
            - --metric-resolution=15s
            - --kubelet-insecure-tls #修改去掉证书验证
          image: dyrnq/metrics-server:v0.6.2 #修改官方无法下载
          imagePullPolicy: IfNotPresent
          livenessProbe:
            failureThreshold: 3
            httpGet:
              path: /livez
              port: https
              scheme: HTTPS
            periodSeconds: 10
          name: metrics-server
          ports:
            - containerPort: 4443
              name: https
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /readyz
              port: https
              scheme: HTTPS
            initialDelaySeconds: 20
            periodSeconds: 10
          resources:
            requests:
              cpu: 100m
              memory: 200Mi
          securityContext:
            allowPrivilegeEscalation: false
            readOnlyRootFilesystem: true
            runAsNonRoot: true
            runAsUser: 1000
          volumeMounts:
            - mountPath: /tmp
              name: tmp-dir
      hostNetwork: true  #必须指定这个才行
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-cluster-critical
      serviceAccountName: metrics-server
      volumes:
        - emptyDir: {}
          name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  labels:
    k8s-app: metrics-server
  name: v1beta1.metrics.k8s.io
spec:
  group: metrics.k8s.io
  groupPriorityMinimum: 100
  insecureSkipTLSVerify: true
  service:
    name: metrics-server
    namespace: kube-system
  version: v1beta1
  versionPriority: 100

kubectl top pod pod名:

(3) 指定内存请求和限制:

① 简介:

为容器指定内存请求,可以在容器资源清单中包含 resources:requests 字段 ;要指定内存限制,可以包含 resources:limits。

内存资源的基本单位是字节(byte)。可以使用这些后缀之⼀,将内存表示为 纯整数或定点整数:E、P、T、G、M、K、Ei、Pi、Ti、Gi、Mi、Ki。

② 示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.19
      imagePullPolicy: IfNotPresent
      resources:
        requests:      #请求
          memory: "100Mi"
        limits:        #限制
          memory: "200Mi"
  restartPolicy: Always

③ 内存请求和限制的目的:

通过为集群中运行的容器配置内存请求和限制,可以有效利用集群节点上可用的内存资源;将 Pod 的内存请求保持在较低水平,可以更好安排 Pod 调度。

● 内存限制大于内存请求的作用:

Pod 可以进行一些突发活动,从而更好的利用可用内存。

Pod 在突发活动期间,可使用的内存被限制为合理的数量。

(4) 指定CPU请求和限制:

① 简介:

CPU 资源以 CPU 单位度量。小数值是可以使用的。一个请求 0.5 CPU 的容器会获得请求 1 个 CPU 的容器的 CPU 的一半。 可以使用后缀 m 表示毫。例如 100mCPU、100 milliCPU 和 0.1 CPU 都相同。

② 示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
    - name: nginx
      image: nginx:1.19
      imagePullPolicy: IfNotPresent
      resources:
        requests:
          cpu: 100m
        limits:
          cpu: 200m
  restartPolicy: Always

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/253259.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【员工工资册】————大一期末答辩近满分作业分享

前言 大家好吖&#xff0c;欢迎来到 YY 滴项目系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C语言的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; PS&#xff1a;以下内容是部分展示&am…

MetaAI语音翻译大模型Seamless登场,主打AI无缝同声传译

论文题目&#xff1a; Seamless: Multilingual Expressive and Streaming Speech Translation 论文链接&#xff1a; https://ai.meta.com/research/publications/seamless-multilingual-expressive-and-streaming-speech-translation/ 代码链接&#xff1a; GitHub - facebook…

STL容器之string(上)

目录 什么是STL string类 string类常见接口 string类的常见构造函数 string类对象的容器操作 string类对象的访问及遍历操作 string类对象的修改操作 拓展 从本期开始&#xff0c;我们将正式学习C中的STL&#xff0c;美国的麦克阿瑟将军说过&#xff1a;“C不能没有STL就…

游戏运行中突然掉线是什么原因导致的

游戏平稳运行的原因只有一个&#xff0c;掉线的原因各有个的不同。这些不同的原因有常见&#xff0c;也有不常见的。但不管出于什么原因的掉线&#xff0c;带来的损失又是相同的。 首先最常见的原因就是攻击造成的 像CC&#xff0c;DDOS。CC会造成服务器资源的浪费&…

深入理解 Goroutines 和 Go Scheduler

本文将重点帮助您了解 Golang 中的 goroutines。Go 调度程序如何工作以在 Go 中实现最佳并发性能。我会尽力用简单的语言解释,这样你就可以理解了。 我们将介绍什么是操作系统中的线程和进程,什么是并发,为什么实现并发很难,以及 goroutines 如何帮助我们实现并发。然后,…

专业面试刷题网站程序源码

介绍&#xff1a; 一个干净的面试刷题网站&#xff01;专业面试刷题网站&#xff0c;助你成为面试达人&#xff01;支持自由组卷、在线刷题、校招社招斩获大厂offer&#xff0c;求职必备! 用这个刷题代码&#xff0c;助你早日打进狼厂、鹅厂等各大厂&#xff0c;薪水直接等级…

Python装饰器新境界:详解装饰器重载内置操作

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python装饰器新境界&#xff1a;详解装饰器重载内置操作&#xff0c;全文3900字&#xff0c;阅读大约15分钟。 Python装饰器重载内置操作&#xff0c;我们通常指的是使用装饰…

P5729 【深基5.例7】工艺品制作

题目描述 现有一个长宽高分别为 w,x,h 组成的实心玻璃立方体&#xff0c;可以认为是由 111 的数个小方块组成的&#xff0c;每个小方块都有一个坐标 (i,j,k)。现在需要进行 &#xfffd;q 次切割。每次切割给出(x1​,y1​,z1​),(x2​,y2​,z2​) 这 6 个参数&#xff0c;保证…

作为一个的软件测试工程师,想拿到自己想要的薪资,需要具备哪些能力?

如果只是想成为一名低薪的测试工程师&#xff0c;只要掌握功能测试就可以。 但是如果想成为一名高薪的测试工程师&#xff0c;那就要打造你的不可替代性。 可是&#xff0c;你可能会说&#xff1a;“我现在就是个普通职员啊&#xff0c;我就是个普通人&#xff0c;我目前还没有…

go原生http开发简易blog(一)项目简介与搭建

文章目录 一、项目简介二、项目搭建前置知识三、首页- - -前端文件与后端结构体定义四、配置文件加载五、构造假数据- - -显示首页内容 代码地址&#xff1a;https://gitee.com/lymgoforIT/goblog 一、项目简介 使用Go原生http开发一个简易的博客系统&#xff0c;包含一下功能…

【动态规划精选题目】2、路径问题模型

此动态规划系列主要讲解大约10个系列【后续持续更新】 本篇讲解路径问题模型中的6道经典题&#xff0c;会在讲解题目同时给出AC代码 目录 1、不同路径 2、不同路径2 3、珠宝的最大价值 4、下降路径最小和 5、最小路径和 6、地下城游戏 1、不同路径 class Solution { publi…

C语言使用posix正则表达式库

在C语言中&#xff0c;你可以使用 POSIX 正则表达式库&#xff08;regex.h&#xff09;来进行正则表达式的模式匹配。POSIX 正则表达式库提供了一组函数来编译、执行和释放正则表达式。 下面是使用 POSIX 正则表达式库的基本步骤&#xff1a; 包含头文件 <regex.h>&…

Ribbon使用

Ribbon &#xff1a;处理客户端负载均衡和容错的解决方案 配置Ribbon的负载均衡 Rule接口&#xff1a; 定义客户端负载均衡的规则 RandomRule :随机选择RoundRobinRuleZoneAvoidanceRule 配置ribbon的负载均衡策略 在配置文件中配置 user-center:ribbon:NFLoadBalancerRul…

Cheat Enginee(CE)详细使用指南

一&#xff0c;下载与安装 首先在CE的官网下载Cheat Engine的软件包&#xff0c;下载完成之后找到文件所在的位置&#xff0c;进入文件运行exe文件&#xff0c;这样就可以进入Cheat Engine的安装界面。进入安装界面后设置好安装路径点击Next即可安装。 或者通过下载压缩包&…

Android Studio好用的插件推荐

目录 一、插件推荐 二、如何下载 1.点击File—>Settings ​2.点击Plugins然后进行搜索下载 三、Android Studio 模板 一、插件推荐 这个插件可以为您自动生成Parcelable代码。Parcelable是一种用于在Android组件之间传递自定义对象的机制&#xff0c;但手动编写Parcela…

Course3-Week3-强化学习

Course3-Week3-强化学习 文章目录 Course3-Week3-强化学习1. 强化学习的问题引入1.1 什么是强化学习1.2 强化学习示例1.3 数学符号 2. 贝尔曼方程2.1 回报2.2 策略2.3 状态-动作价值函数2.4 贝尔曼方程2.5 随机环境(可选) 3. 连续状态空间3.1 连续状态空间的问题示例——登月器…

FastAdmin后台安装出现2054错误的解决办法

用Navicat修改密码验证方式。MySQL Workbench的Server菜单中的Users and Privileges菜单中似乎不支持此项修改。 修改完毕以后也许会报错&#xff1a; Access denied for user ‘root‘‘localhost‘ (using password: YES) 用以下命令无密进入mysql。 C:\Program Files\MySQ…

Mybatis Plus

一、MyBatis-Plus 1.简介 MyBatis-Plus (opens new window)&#xff08;简称 MP&#xff09;是一个 MyBatis (opens new window)的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 我们的愿景是成为 MyBatis 最好的搭档&…

单片机期末复习

前言 发现很多人都写了单片机原理及接口技术课后习题的答案&#xff0c;但是也就只写了答案而已&#xff0c;可能是他们觉得太简单的缘故吧&#xff0c;我这里对此进行一下我近段时间复习的总结&#xff0c;本篇博客只展示选择题、填空题和判断题的答案&#xff0c;仅供参考&a…

Spring之容器:IOC(2)

学习的最大理由是想摆脱平庸&#xff0c;早一天就多一份人生的精彩&#xff1b;迟一天就多一天平庸的困扰。各位小伙伴&#xff0c;如果您&#xff1a; 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持&#xff0c;想组团高效学习… 想写博客但无从下手&#xff0c;急需…