【问题标题】:Kubernetes delete pod jobKubernetes 删除 pod 作业
【发布时间】:2019-03-16 17:58:55
【问题描述】:

我想知道是否有可能在 Kubernetes 中有一个每小时运行一次的作业,并且会删除某些 pod。我需要这个作为临时的 解决问题的止损。

【问题讨论】:

  • 为什么不在 k8s 之外运行一个 cron 到 delete certain pods 每小时。容易多了?

标签: kubernetes kubernetes-helm


【解决方案1】:

使用 CronJob(12)每小时运行一次作业。

可以从具有适当权限的 Pod (3) 访问 K8S API。创建 Pod 时,默认情况下会为其分配一个 default ServiceAccount (4)。 default ServiceAccount 没有 RoleBinding,因此 default ServiceAccount 和 Pod 也没有调用 API 的权限。

如果一个角色(有权限)被创建并映射到default ServiceAccount,那么默认情况下所有的 Pod 都会获得这些权限。所以,最好新建一个ServiceAccount,而不是修改default ServiceAccount

所以,这里是 RBAC (5) 的步骤

  • 创建服务帐户
  • 创建具有适当权限的角色(删除 pod)
  • 使用 RoleBinding 将 ServiceAccount 映射到角色
  • 在 Pod 定义中使用上述 ServiceAccount
  • 使用删除 pod 的代码/命令创建一个 pod/容器

我知道这有点令人困惑,但这就是 K8S 的工作方式。

【讨论】:

    【解决方案2】:

    是的,这是可能的。

    我认为最简单的方法是直接从作业中调用 Kubernernes API。考虑到已配置 RBAC,如下所示:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: cleanup
    spec:
      serviceAccountName: service-account-that-has-access-to-api
      template:
        spec:
          containers:
          - name: cleanup
            image: image-that-has-curl
            command:
            - curl
            - -ik 
            - -X
            - DELETE
            - -H
            - "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
            - https://kubernetes.default.svc.cluster.local/api/v1/namespaces/{namespace}/pods/{name}
          restartPolicy: Never
      backoffLimit: 4
    

    您还可以运行 kubectl 代理 sidecar 以使用 localhost 连接到集群。更多信息here

    或者甚至在 pod 中运行普通的 kubectl 也是一种选择:Kubernetes - How to run kubectl commands inside a container?

    【讨论】:

      【解决方案3】:

      可能还有另一种解决方法。

      您可以创建一个 liveness probe(如果您还没有的话,超级简单),直到一小时后才运行并且总是失败。

      livenessProbe:
        tcpSocket:
          port: 1234
        initialDelaySeconds: 3600
      

      这将等待 3600 秒(1 小时),然后尝试连接到端口 1234,如果失败,它将杀死容器(而不是 pod!)。

      【讨论】:

      • 如果命令返回一个非零值,kubelet 会杀死 Container 并重新启动它。 - kubernetes.io/docs/tasks/configure-pod-container/… - 所以,我们回到第一方。
      • 是的,这是删除 pod 时应该发生的情况。或者它不是副本集/部署的一部分?
      • 但是 pod 可以使用,或者 pod 内的应用程序同时可以使用?网络应用服务流量
      • OP 是关于 Pod 删除的。但它不会在此解决方案中被删除。
      • @user1555190,没有。一旦它被删除,它就会从任何包装它的服务中取出。一旦容器重新启动,它将在服务中可用。如果目的是让 pod 不可用,这将不起作用。如果目的是让应用重新启动,这将非常有效。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-27
      • 2018-05-19
      • 1970-01-01
      • 2019-11-21
      • 2022-07-15
      • 2021-09-21
      相关资源
      最近更新 更多