【面试题系列】关于K8s—Job的2个问题

news2024/10/7 20:30:12

 序言

人生是一场消耗,要把美好的时光放在喜欢的人与事上。

写在前面 

前面学习了job,现在思考一下两个问题

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

第1个问题

job执行完之后不会立刻从k8s面板里删除,你可以看到有很多留存状态的记录,如果cronjob频次很高,留下的这些job记录就会增长,有没有隐患?

解答:

频繁留存未删除的Job记录可能会导致以下隐患:

  1. 浪费资源:每个Job都需要占用一定的资源,包括CPU、内存等,如果留存的Job记录过多,就会浪费宝贵的资源。

  2. 影响性能:Kubernetes控制面板需要定期查询Job状态,如果留存的Job记录过多,会增加查询负担,从而影响Kubernetes控制面板的性能。

  3. 安全问题:留存的Job记录可能包含敏感信息,如镜像仓库的凭证、配置文件等,如果泄露给攻击者,可能会导致安全问题。

为了避免以上隐患,建议定期清理过期的Job记录,可以通过配置Job的TTL来实现自动清理。另外,也可以通过手动删除已完成的Job记录来进行清理。

那如何实现清理呢?

好的,我可以再详细一点地解释一下如何清理过期的Job记录。

在Kubernetes中,可以通过设置Job的TTL(time to live)来自动删除过期的Job记录。TTL是指Job完成后保留在系统中的最长时间,超过这个时间后,Job记录将自动被删除。设置TTL需要在Job的spec中指定activeDeadlineSeconds字段,例如:

apiVersion: batch/v1
kind: Job #资源类型
metadata:
  name: my-job
spec:
  activeDeadlineSeconds: 3600 # 设置TTL为1小时
  template:
    # ...

上面的配置将设置TTL为1小时,即Job完成后最多保留1小时。

除了设置TTL外,还可以通过手动删除已完成的Job记录来进行清理。可以使用kubectl命令来删除Job记录,例如:

kubectl delete job my-job

上面的命令将删除名为my-job的Job记录。如果要删除所有已完成的Job记录,可以使用以下命令:

kubectl delete jobs --field-selector=status.successful>0

这个命令将删除所有已完成的Job记录,其中--field-selector=status.successful>0表示只删除成功完成的Job记录。

需要注意的是,手动删除Job记录可能会删除一些有用的信息,因此建议先备份相关数据再进行清理。另外,如果Job频繁执行,建议使用自动清理的方式来避免留存过多的Job记录。

怎么实现自动清理?

实现自动清理可以使用 Kubernetes 的 TTL Controller。

TTL Controller 是 Kubernetes 的一个控制器,它可以根据资源的 TTL 设置自动删除过期的资源。TTL Controller 可以应用于许多 Kubernetes 资源,包括 Job、Pod、Secret 等。

要使用 TTL Controller,需要先创建一个 TTL Controller 的定义文件,内容如下:

apiVersion: batch/v1
kind: CronJob #资源类型
metadata:
  name: ttl-controller
spec:
  schedule: "*/5 * * * *" # 定时清理任务
  jobTemplate:
    spec:
      ttlSecondsAfterFinished: 3600 # 设置TTL为1小时
      template:
        # 定义清理任务的容器
        spec:
          containers:
          - name: clean-jobs
            image: alpine:latest
            command: ["sh", "-c", "kubectl delete jobs --field-selector=status.successful>0"]

上面的定义文件将创建一个 CronJob,用于定时清理已完成的 Job 记录。其中,schedule 字段用于指定定时清理任务的执行时间,这里设置为每 5 分钟执行一次;ttlSecondsAfterFinished 字段用于设置 Job 记录的 TTL,这里设置为 1 小时;template 字段中的容器定义了清理任务的执行逻辑,这里使用了 Alpine Linux 镜像,并通过 kubectl 命令删除已完成的 Job 记录。

将上述定义文件保存为 ttl-controller.yaml,并使用 kubectl apply 命令来创建 TTL Controller:

kubectl apply -f ttl-controller.yaml

这样,TTL Controller 就会自动执行定时清理任务,删除过期的 Job 记录。需要注意的是,TTL Controller 只能删除已完成的 Job 记录,因此需要确保 Job 完成后才会留下记录。另外,建议根据实际情况调整 TTL 的值和定时清理任务的频率。

第2个问题

 在业务开发过程中,开发人员有可能不能直接操作k8s,而定时任务在业务中更新又很快,按你这种方式是每次变动都需要k8s管理人员操作的,怎么样把定时任务的更新交给开发人员管理?

解答:

1 使用 Workload Identity实现

为了让业务开发人员能够方便地管理定时任务,可以使用 Kubernetes 的 Workload Identity 功能。

Workload Identity 是 Kubernetes 的一项安全功能,可以将 Kubernetes 中的服务账号与 Google Cloud 平台上的服务账号关联起来。

使用 Workload Identity 可以让 Kubernetes 中的服务账号获得访问 Google Cloud 平台资源的权限,从而实现业务开发人员管理 Kubernetes 资源的目的。

具体来说,可以按照以下步骤使用 Workload Identity 来让业务开发人员管理定时任务:

  1. 在 Google Cloud 平台上创建一个服务账号,并授予它适当的权限,例如访问 Kubernetes API 的权限。

  2. 在 Kubernetes 中创建一个 ServiceAccount,并将它与上述服务账号关联起来。可以使用以下命令创建 ServiceAccount,并将它与服务账号关联:

    kubectl create serviceaccount my-sa
    gcloud iam service-accounts add-iam-policy-binding --role roles/iam.workloadIdentityUser --member "serviceAccount:my-project.svc.id.goog[my-namespace/my-sa]" my-sa@my-project.iam.gserviceaccount.com
    kubectl annotate serviceaccount --namespace my-namespace my-sa iam.gke.io/gcp-service-account=my-sa@my-project.iam.gserviceaccount.com
    ```
    
    上述命令中,my-sa 是创建的 ServiceAccount 的名称,my-project 和 my-namespace 分别是 [Google Cloud](poe://www.poe.com/_api/key_phrase?phrase=Google%20Cloud&prompt=Tell%20me%20more%20about%20Google%20Cloud.) 平台和 Kubernetes 集群的项目和命名空间名称。
    
    
  3. 在 Kubernetes 中创建一个 Role 或 ClusterRole,并授予它适当的权限,例如创建、删除 Job 的权限。

  4. 将上述 Role 或 ClusterRole 与 ServiceAccount 关联起来。可以使用以下命令创建 RoleBinding 或 ClusterRoleBinding,例如:

    kubectl create rolebinding my-role-binding --role=my-role --serviceaccount=my-namespace:my-sa --namespace=my-namespace
    ```
    
    上述命令中,my-role 是上述创建的 Role 或 ClusterRole 的名称,my-namespace 是 Kubernetes 集群的命名空间名称。
    
    
  5. 将上述 ServiceAccount 的密钥添加到业务应用程序中,以便在调用 Kubernetes API 时使用。可以使用以下命令来获取 ServiceAccount 的密钥:

    kubectl get secret --namespace my-namespace $(kubectl get serviceaccount my-sa --namespace my-namespace -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode
    ```
    
    这个命令将获取 ServiceAccount 的密钥,并将其解码为原始的 token 字符串。
    

通过上述步骤,业务开发人员就可以使用 ServiceAccount 的密钥来调用 Kubernetes API,从而创建、更新、删除定时任务等资源。需要注意的是,业务开发人员只能访问被授权的资源和操作,不能访问其他资源和操作。另外,需要确保在使用 Workload Identity 时,密钥不被泄露,以保障安全性。

2 使用 RBAC(Role-Based Access Control)功能 

除了使用 Workload Identity,还可以使用 Kubernetes 的 RBAC(Role-Based Access Control)功能来实现业务开发人员管理定时任务。

RBAC 是 Kubernetes 的一项安全功能,可以通过定义角色、角色绑定等方式来控制用户对 Kubernetes 资源的访问权限。使用 RBAC 可以将 Kubernetes 资源的管理权限授权给特定的用户或组,从而实现业务开发人员管理 Kubernetes 资源的目的。

具体来说,可以按照以下步骤使用 RBAC 来让业务开发人员管理定时任务:

  1. 在 Kubernetes 中创建一个 ServiceAccount,并为它授予适当的权限,例如创建、删除 Job 的权限。可以使用以下命令创建 ServiceAccount:

    kubectl create serviceaccount my-sa
    ```
    
    
  2. 在 Kubernetes 中创建一个 Role 或 ClusterRole,并授予它适当的权限,例如创建、删除 Job 的权限。可以使用以下命令创建 Role 或 ClusterRole:

    kubectl create role my-role --verb=create,get,update,delete --resource=jobs
    ```
    
    上述命令中,my-role 是创建的 Role 或 ClusterRole 的名称,--verb 和 --resource 参数分别用于指定授权的操作和资源类型,这里授权了创建、获取、更新和删除 Job 的权限。
    
    
  3. 将上述 Role 或 ClusterRole 与 ServiceAccount 关联起来。可以使用以下命令创建 RoleBinding 或 ClusterRoleBinding,例如:

    kubectl create rolebinding my-role-binding --role=my-role --serviceaccount=my-namespace:my-sa --namespace=my-namespace
    ```
    
    上述命令中,my-role 是上述创建的 Role 或 ClusterRole 的名称,my-namespace 是 Kubernetes 集群的命名空间名称。
    
    
  4. 将 ServiceAccount 的密钥提供给业务开发人员,以便在调用 Kubernetes API 时使用。可以使用以下命令来获取 ServiceAccount 的密钥:

    kubectl get secret --namespace my-namespace $(kubectl get serviceaccount my-sa --namespace my-namespace -o jsonpath='{.secrets[0].name}') -o jsonpath='{.data.token}' | base64 --decode
    ```
    
    这个命令将获取 ServiceAccount 的密钥,并将其解码为原始的 token 字符串。
    

通过上述步骤,业务开发人员就可以使用 ServiceAccount 的密钥来调用 Kubernetes API,从而创建、更新、删除定时任务等资源。需要注意的是,业务开发人员只能访问被授权的资源和操作,不能访问其他资源和操作。另外,需要确保在授权时,只授权必要的权限,以保障安全性。

3 使用项目代码实现定时任务

大部分,简单的定时任务,一般是用语言自带的定时任务去实现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

only up 游戏分析

文章目录 介绍游戏玩法游戏面向的群体游戏所须配置游戏美术风格游戏优点游戏缺点和改进方案游戏爆火原因分析同类型游戏对比和游戏继承性地铁跑酷掘地求升跳跳乐 总结 介绍 游戏玩法 这是一个玩法很简单的跑酷游戏,你必须找到一条可行的道路,一直往上走…

【C++】哈希的应用

文章目录 一、位图1. 位图的引入2. 位图的实现3. 位图的应用4. 哈希切割 二、布隆过滤器1. 布隆过滤器的引入2. 布隆过滤器的实现3. 布隆过滤器的应用4. 布隆过滤器的总结 一、位图 1. 位图的引入 我们先来看一道面试题: 给40亿个不重复的无符号整数,没…

vue项目用iframe嵌入另外一个vue项目(cesium)

vue项目用iframe 项目嵌入另外一个vue项目,主要分2种情况,一种情况是嵌入本地项目,另外一种是嵌入用web服务器启动的vue项目。 1)嵌入本地项目 vue create hello-world 创建项目后, 用npm run build打包,把…

IPO观察丨健身器材行业加“数”前行,康力源如何重构竞争壁垒?

近年来,健身器材市场的火热,引来了资本的广泛关注。数据显示,2021年中国健身器材市场规模为546.5亿元,同比增长15%,预计2024年或可达到799.6亿元。在这股浪潮之下,多家健身器材企业递出了IPO申请。比如&…

安装mmdetection(windows下)

windows环境安装mmdetection 创建pytorch环境最终安装的版本信息安装过程step1:安装mmcv-fullstep2:安装mmdetection 创建pytorch环境 mmdetection是基于PyTorch、CUDA环境来安装的,所以首先得安装深度学习pytorch环境、参考我的这篇pytorch…

基于企业微电网平台的食用菌工厂的能源管理

摘要:从食用菌生产经营者角度指出食用菌工厂化生产的产品生鲜属性、微生物培养的技术特点和竞争战略难以突破决定了成本控制是经营的核心。分析食用菌生产的成本构成,指出加强能源管理是节本增效的重要途径,从电费的分类和改善方式、灭菌的燃…

JDK的安装配置

MySQL的安装下载已经有很多码友阅读和提出意见,谢谢大家的肯定和批评,如下给出JDK的安装配置,如有帮助,点赞收藏加关注,如有不足或者错误,敬请批评指正!! 一、下载JDK 1、Oracle官网…

别百度了,低代码开发平台我推荐它

“低代码开发平台”指的是一种用于快速设计和开发软件系统,且手写代码量最少的方法,它可以帮助您更快、更可靠地提供价值。 随着疫情的发生,低代码平台在最近两年都成为互联网界的新宠,那为何会如此受欢迎呢?主要有以下…

MySQL主备延迟的原因

MySQL主备延迟的原因 在上篇文章中记录了一次由主备延迟导致的relay log打满磁盘的问题,结合林奇大佬的《MySQL是怎么保证高可用的?》,分析一下主备延迟的原因。 主备同步 主库和备库之间的同步流程如图所示: 在备库B 上通过c…

人脸考勤签到基础篇

目录 创建小程序底部Tab导航 开通腾讯云对象存储服务 一、静态资源要放在网上 二、为什么不选择阿里云或者华为云的对象存储服务? 二、开通腾讯云对象存储服务 三、存储静态资源 设计首页的英雄区和栏目导航 设计人脸签到页面 实现签到自拍功能 缓存系统常…

HTTP调用:你考虑到超时、重试、并发了吗?

今天,我们一起聊聊进行 HTTP 调用需要注意的超时、重试、并发等问题。 与执行本地方法不同,进行 HTTP 调用本质上是通过 HTTP 协议进行一次网络请求。网络请求必然有超时的可能性,因此我们必须考虑到这三点: 首先,框架…

单例模式(Singleton)

定义 单例是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。 前言 1. 问题 单例模式同时解决了两个问题,所以违反了单一职责原则: 保证一个类只有一个实例。为该实例提供一个全局访问节…

react签字功能 react-signature-canvas

react签字功能 react-signature-canvas . 前几天一个月薪35k的兄弟,给我推了一个人工智能学习网站,看了一段时间挺有意思的。包括语音识别、机器翻译等从基础到实战都有,很详细,分享给大家。大家及时保存,说不定啥时…

【MOOC 作业】第4章 网络层

不是标答也不是参考答案 仅从个人理解出发去做题 1、(20分) 考虑如图示的网络。 a. 假定网络是一个数据报网络。显示路由器 A 中的转发表,其中所有指向主机 H3 的流量通过接口 3 转发。 目的网络链路接口H33 b. 假定网络是一个数据报网络。你能写出路由器 A 中的…

K8S系列文章之 部署MySQL数据库

1 编写 mysql.yaml文件 apiVersion: v1 kind: Namespace metadata:name: devops # Namespace 的名称 --- apiVersion: apps/v1 kind: Deployment metadata:name: devops-mysql # deployment控制器名称namespace: devops spec:replicas: 1revisionHistoryLimit: 5strategy:…

Maven及IDEA配置

1.Maven的安装及环境变量配置 1. 下载压缩包,解压到指定位置; 2. 在系统环境变量中配置 maven 的 bin 路径; 3. 配置一下 maven 的本地仓库位置和阿里云镜像(推荐大家下载 notepad 进行修改配置); 在 …

Mysql高阶语句与MySQL存储过程

Mysql高阶语句 准备环境(1) 一、MySQL高阶进阶SQL语句1、select2、distinct3、where4、and or5、in6、between7、通配符8、order by9、函数数学函数字符串函数 10、group by11、having12、别名13、子查询13、EXISTS 二、MySQL高阶进阶SQL语句2环境准备&a…

DINDIEN

DIEN模型 DIN存在的问题: DIN引入了attention机制来通过用户历史行为数据对用户兴趣进行建模,而缺乏对具体行为背后的序列信息或者说依赖关系进行专门的建模,也就是没法捕捉到用户的兴趣变化过程。 DIEN的改动: 这个模型既然是…

为什么黑客不黑/攻击赌博网站?

攻击了,只是你不知道而已! 同样,对方也不会通知你,告诉你他黑了赌博网站。 攻击赌博网站的不一定是正义的黑客,也可能是因赌博输钱而误入歧途的法外狂徒。之前看过一个警方破获的真实案件:28岁小伙因赌博…

Vue3 组合式 API

前言 传统的组件随着业务复杂度越来越高,代码量会不断的加大,整个代码逻辑都不易阅读和理解。Vue3 使用组合式 API 的地方为 setup。在 setup 中,我们可以按逻辑关注点对部分代码进行分组,然后提取逻辑片段并与其他组件共享代码。…