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

这篇具有很好参考价值的文章主要介绍了【面试题系列】关于K8s—Job的2个问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

 序言

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

写在前面 

前面学习了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 使用项目代码实现定时任务

大部分,简单的定时任务,一般是用语言自带的定时任务去实现。文章来源地址https://www.toymoban.com/news/detail-500400.html

到了这里,关于【面试题系列】关于K8s—Job的2个问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • k8s概念-Job和CronJob

    回到目录  对于非耐久性任务,比如压缩文件,任务完成后,pod需要结束运行,不需要pod继续保持在系统中,这个时候就要用到Job。 Job负责批量处理短暂的一次性任务 (short lived one-off tasks),即仅执行一次的任务,它保证批处理任务的一个或多个Pod成功结束 yaml文件 多次执行

    2024年02月14日
    浏览(7)
  • k8s控制器之job--第六弹Job的模式

    Kubernetes Job 对象可以用来支持 Pod 的并发执行,但是: Job 对象并非设计为支持需要紧密相互通信的Pod的并发执行,例如科学计算 Job 对象支持并发处理一系列相互独立但是又相互关联的工作任务,例如: 发送邮件 渲染页面 转码文件 扫描 NoSQL 数据库中的主键 其他 在一个复杂

    2024年02月10日
    浏览(9)
  • k8s控制器之job--第五弹Job的自动清理

    系统中已经完成的 Job 通常是不在需要里的,长期在系统中保留这些对象,将给 apiserver 带来很大的压力。如果通过更高级别的控制器(例如 CronJobs)来管理 Job,则 CronJob 可以根据其中定义的基于容量的清理策略(capacity-based cleanup policy)自动清理Job。 除了 CronJob 之外,TTL 机

    2024年02月11日
    浏览(11)
  • k8s中job与cronjob使用详解

    k8s中job与cronjob使用详解

    job,顾名思义就是任务,job的概念在很多框架中都有,而且实际业务场景中也使用非常广泛,比如大家熟悉的hadoop,客户端可以向集群提交一个job,然后集群根据一定的调度策略来处理这个job; k8s中的job,主要用于批量处理的业务场景,比如像那种短暂的一次性任务(每个任

    2024年01月17日
    浏览(13)
  • Kubernetes(k8s)一次性任务:Job

    目录 一.系统环境 二.前言 三.Kubernetes Job简介 四.创建一次性任务job 4.1 创建一个简单任务的job 4.2 创建需要执行多次的job任务 五.测试job失败重试次数 六.job任务使用示例:计算圆周率 七.总结 本文主要基于Kubernetes1.21.9和Linux操作系统CentOS7.4。 服务器版本 docker软件版本 Kubern

    2024年02月07日
    浏览(20)
  • 17-k8s控制器资源-job控制

    17-k8s控制器资源-job控制

    job控制器:就是一次性任务的pod控制器,pod完成作业后不会重启,其重启策略是:Never         启动一个pod,执行完成一个事件,然后pod关闭;         事件:计算π的值,取前5000位; [root@k8s231 pi]# vim job.yaml apiVersion: batch/v1 kind: Job metadata:   name: job-pi spec:   #定义pod模板  

    2024年02月20日
    浏览(13)
  • k8s控制器之job--第四弹Job的终止和清理

    当 Job 完成后: 将不会创建新的 Pod 已经创建的 Pod 也不会被清理掉。此时,您仍然可以继续查看已结束 Pod 的日志,以检查 errors/warnings 或者其他诊断用的日志输出 Job 对象也仍然保留着,以便您可以查看该 Job 的状态 由用户决定是否删除已完成的 Job 及其 Pod 可通过 kubectl 命

    2024年02月10日
    浏览(10)
  • k8s控制器之job--第二弹编写Job的定义

    与所有的 Kubernetes 对象一样,Job 对象的 YAML 文件中,都需要包括如下三个字段: .apiVersion .kind .metadata Job 对象的 YAML 文件,还需要一个 .spec 字段。 .spec.template 是必填字段: 用于定义 pod template 与 Pod 有相同的字段内容,但由于是内嵌元素,pod template 不包括阿 apiVersion 字段和

    2024年02月10日
    浏览(25)
  • k8s 常见面试题

    k8s 常见面试题

    前段时间在这个视频中分享了 https://github.com/bregman-arie/devops-exercises 这个知识仓库。 这次继续分享里面的内容,本次主要以 k8s 相关的问题为主。 k8s 是一个开源应用,给用户提供了管理、部署、扩展容器的能力,以下几个例子更容易理解: 你可以将容器运行在不同的机器或

    2024年02月12日
    浏览(4)
  • K8S之Job和CronJob控制器

    K8S之Job和CronJob控制器

    Job控制器用于管理Pod对象运行一次性任务,例如:对数据库备份,可以直接在k8s上启动一个mysqldump备份程序,也可以启动一个pod,这个pod专门用来做备份任务,备份结束pod就可以终止了,不需要重启,将Pod对象置于\\\"Completed\\\"(完成)状态。 若容器中的进程因错误而终止,则需要

    2024年04月11日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包