Helm Hook运行kubectl命令

时间:2019-10-22 13:28:46

标签: kubernetes kubernetes-helm kubectl

我想从升级前的kubectl运行helm hook命令,但是对于如何实现此目的,似乎没有任何文档。

我是否必须创建一个包含kubectl的docker镜像才能实现?

还是有一些无需使用容器即可实现这一目标的方法?

我有一个基本的helm hook,看起来像这样


apiVersion: batch/v1
kind: Job
metadata:
  name: {{ .Chart.Name }}-change-pvc-hook
  labels:
    app: {{ .Chart.Name }}
  annotations:
    "helm.sh/hook": pre-upgrade
    "helm.sh/hook-delete-policy": hook-succeeded, before-hook-creation
spec:
  template:
    metadata:
      name: "{{.Release.Name}}"
      labels:
        app: {{ .Chart.Name }}
    spec:
      restartPolicy: Never
      containers:
        - name: pre-upgrade-change-pvc

如果有人可以解释如何在没有容器的情况下运行kubectl或我如何实现这一点,那就太好了

3 个答案:

答案 0 :(得分:0)

我正在用头盔挂钩做类似的事情。

在环顾四周时,我发现了以下问题: Running kubectl commands Helm post install

但是它所提供的功能不多,我目前正在研究头盔插件 https://helm.sh/docs/related/#helm-plugins

希望您找到答案

答案 1 :(得分:0)

  

我是否必须创建一个包含kubectl的docker镜像才能   实现这一目标?

是的,您必须创建它,因为容器通常是轻量级的,并且包含最基本的内容。 您可以使用Dockerfile使用kubernetes创建容器。

第二个选项是创建自己的mutating webhook,它将修改PVC(使用patch)。

  

更改接纳许可首先调用Webhooks,并且可以修改对象   发送到API服务器以实施自定义默认值。毕竟对象   修改完成,并且传入对象得到验证之后   由API服务器调用验证入网钩子,并且可以   拒绝执行自定义策略的请求。

这样,您可以在let locations = [{ name: 'location1', value: 11 }, { name: 'location2', value: 21 }, { name: 'location3', value: 31 }, { name: 'location4', value: 41 }, { name: 'location5', value: 51 }, { name: 'location6', value: 61 }, { name: 'location7', value: 71 }, { name: 'location8', value: 71 }, { name: 'location9', value: 71 }, ]; for (let i = 0; i < locations.length; i++) { if (i == 0 || i % 3 == 0) { $('#map-card').append(`<div class="columns"></div>`); } $('#map-card .columns:last').append(`<div class="column">${i}th Column created</div>`) }创建发行版之前修改PVC。

答案 2 :(得分:0)

您可以像Prometheus运算符一样在其掌舵图中执行清理(预删除钩子):prometheus operator kubectl usage

基本上,您可以使用图片= for (i = 0; i < 3; i++) 像这样的东西:

k8s.gcr.io/hyperkube:v1.12.1

其他选择是使用CURL到Kubernetes API,例如here 请注意,您需要apiVersion: batch/v1 kind: Job metadata: name:somename-operator-cleanup namespace: somenamespace annotations: "helm.sh/hook": pre-delete "helm.sh/hook-weight": "3" "helm.sh/hook-delete-policy": hook-succeeded labels: app: someapp-operator spec: template: metadata: name: somename-operator-cleanup labels: app: someapp spec: {{- if .Values.global.rbac.create }} serviceAccountName: {{ template "prometheus-operator.operator.serviceAccountName" . }} {{- end }} containers: - name: kubectl image: "k8s.gcr.io/hyperkube:v1.12.1" imagePullPolicy: "IfNotPresent" command: - /bin/sh - -c - > kubectl your command here. kubectl delete alertmanager --all; kubectl delete prometheus --all; kubectl delete prometheusrule --all; kubectl delete servicemonitor --all; sleep 10; kubectl delete crd alertmanagers.monitoring.coreos.com; kubectl delete crd prometheuses.monitoring.coreos.com; kubectl delete crd prometheusrules.monitoring.coreos.com; kubectl delete crd servicemonitors.monitoring.coreos.com; kubectl delete crd podmonitors.monitoring.coreos.com; restartPolicy: OnFailure 然后您可以使用automountServiceAccountToken: true

中的Barear令牌

您只需要为此而卷曲的图像。您可以为此使用zakkg3 / opennebula-alpine-bootstrap。

例如,在这里我使用curl而不是kubectl基于文件创建一个秘密:

/var/run/secrets/kubernetes.io/serviceaccount/token

请注意将其输出为> / dev / null,这是一种好的做法,否则您将在日志记录管理(ELK / LOKI)中得到此输出。