Openshift - 运行 pod 仅适用于特定时间段

Openshift - Run pod only for specific time period

我是 Openshfit 的新手。我们正在使用 openshift 部署来部署我们的多个微服务(SpringBoot 应用程序)。部署是从 docker 图像完成的。

我们有一种情况需要从午夜到早上 5 点单独停止一个微服务(由于外部依赖)。

有人可以建议一种自动执行此操作的方法吗?

我能够 运行 oc scale deployment/sampleservice--replicas=0 手动使 pods 的数量为零,稍后手动增加到 1。

我不确定如何在特定时间自动 运行 此命令。 Openshift 中的 CronJob 应该可以做到这一点。但不知道如何配置cronjob来执行OC命令。

任何指导都会有很大帮助

API

您可以使用 OC rest api 客户端并编写简单的 python 代码来缩减副本。将此 python 打包到 docker 图像中,并将其 运行 打包为 OC 集群中的 cronjob

简单卷曲

运行 cronjob 中的一个简单卷曲,用于在特定时间扩大和缩小部署。

这是一个简单的 Curl 来扩展部署:https://docs.openshift.com/container-platform/3.7/rest_api/apis-apps/v1beta1.Deployment.html#Get-apis-apps-v1beta1-namespaces-namespace-deployments-name-scale

API 文档:https://docs.openshift.com/container-platform/3.7/rest_api/apis-apps/v1beta1.Deployment.html

CLI

如果你不想运行 code as docker镜像在K8s的cronjob中,你也可以运行command,在这种情况下,使用docker cronjob 中的图像,并触发命令

OC-cli : https://hub.docker.com/r/widerin/openshift-cli

不要忘记 身份验证 在两种情况下都需要 API 或 运行 在 cronjob 中执行命令。

使用 cronjob 是一个不错的选择。

首先,您需要一个具有 oc 命令行客户端的图像。我确定那里有一个预建的,但由于这将是您的 OpenShift 集群中的 运行 特权,您需要您信任的东西,这可能意味着您自己构建它。我用过:

FROM quay.io/centos/centos:8

RUN curl -o /tmp/openshift-client.tar.gz \
                https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest/openshift-client-linux.tar.gz; \
    tar -C /bin -xf /tmp/openshift-client.tar.gz oc kubectl; \
    rm -f /tmp/openshift-client.tar.gz

ENTRYPOINT ["/bin/oc"]

为了正确处理身份验证,您需要创建一个 ServiceAccount,然后通过 RoleRoleBinding 为其分配适当的权限。我创建了一个名为 oc-client-sa:

ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: oc-client-sa
  namespace: oc-client-example

名为 oc-client-roleRole 授予 PodDeployment 对象特权:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: oc-client-role
  namespace: oc-client-example
rules:
  - verbs:
      - get
      - list
      - create
      - watch
      - patch
    apiGroups:
      - ''
    resources:
      - pods
  - verbs:
      - get
      - list
      - create
      - watch
      - patch
    apiGroups:
      - 'apps'
    resources:
      - deployments
      - deployments/scale

和连接 oc-client-sa ServiceAccountRoleBindingoc-client-role Role:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: oc-client-rolebinding
  namespace: oc-client-example
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: oc-client-role
subjects:
  - kind: ServiceAccount
    name: oc-client-sa

有了这一切,我们可以写一个这样的 CronJob 在特定时间缩减部署。请注意,我们 运行 使用我们之前创建的 oc-client-sa ServiceAccount 的作业:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: scale-web-down
  namespace: oc-client-example
spec:
  schedule: "00 00 * * *"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: oc-client-sa
          restartPolicy: Never
          containers:
          - image: docker.io/larsks/openshift-client
            args:
              - scale
              - deployment/sampleservice
              - --replicas=0
            name: oc-scale-down

您可以写一个类似的代码来在凌晨 5 点将事情恢复原状。

由于 serviceAccountName 设置,oc 客户端将自动使用 Kubernetes 提供给您的 pod 的凭据。