openshift 集群上的 Rhel 图像到 运行 shell 脚本

Rhel Image on openshift cluster to run shell script

我是 devops 和 openshift 的新手。我有一个简单的 .sh 脚本,它连接到下载网站并检查是否存在新版本,如果它收到 200 响应,它会下载文件。我需要知道是否可以 运行 这个脚本在每个 pod(在我的例子中是 1 个)上使用 cronjob 集中。如果有的话,有没有 cron 作业 运行 是 .sh 文件的例子(我遇到的那些只有 cronjob 的简单回显命令 运行)。

I need to know if it is possible to run this script using cronjob on each pod(1 in my case) centrally.

不,如果没有黑客攻击,这样的事情是不可能的,因为 Kubernetes pods 被设计为相对短暂的一次性实体
如果您想更新 运行ning pods 中的一些二进制文件,我建议采用以下方法(由于您没有提供任何细节,我将展示如何使用 Nginx 部署示例实现您的目标):

1。创建一个 Kubernetes deployment for your app and add Init containers 部分(此处为 nginx 示例):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: workdir
          mountPath: /usr/share/nginx/html
      initContainers:
      - name: install
        image: busybox
        command:
        - wget
        - "-O"
        - "/work-dir/index.html"
        - http://time.is
        volumeMounts:
        - name: workdir
          mountPath: "/work-dir"
      dnsPolicy: Default
      volumes:
      - name: workdir
        emptyDir: {}

init container 下载一些 html 文件,主 nginx 容器将此文件作为 index.html。

2。创建一个 k8s CronJob 以 运行 滚动更新部署:

apiVersion: batch/v1
kind: CronJob
metadata:
  name: restart-deployment
spec:
  concurrencyPolicy: Forbid
  schedule: '0/5 * * * *'
  jobTemplate:
    spec:
      backoffLimit: 2
      activeDeadlineSeconds: 10
      template:
        spec:
          serviceAccountName: restart-deployment
          restartPolicy: Never
          containers:
            - name: kubectl
              image: bitnami/kubectl
              command:
                - /bin/bash
                - -c
                - |
                  #place your new version check here, if true run:
                  kubectl rollout restart deployment/nginx-deployment

放置您的脚本来检查此 CronJob 中是否有新版本的二进制文件可用。

3。创建一个ServiceAccount、Role、RoleBinding 来让CronJob 操作k8s 集群:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: restart-deployment
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: restart-deployment
rules:
  - apiGroups: ["apps", "extensions"]
    resources: ["deployments"]
    resourceNames: ["nginx-deployment"]
    verbs: ["get", "patch", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: restart-deployment
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: restart-deployment
subjects:
  - kind: ServiceAccount
    name: restart-deployment

因此,您将拥有一个每 5 分钟检查一次的 k8s CronJob,如果是这样,运行s

kubectl rollout restart deployment/nginx-deployment

这将执行 Rolling Update ("RollingUpdate" is the default update strategy ).

新 pods 将使用最新下载的 init-containers 个文件。