Настройка Kubernetes Cronjob: не удается получить горизонтальные автоскалеры ресурсов в автоматическом масштабировании группы API в промежуточном пространстве имен.

Я пытался настроить задание cron для исправления горизонтального автомасштабирования модулей, но задание возвращает horizontalpodautoscalers.autoscaling "my-web-service" is forbidden: User "system:serviceaccount:staging:sa-cron-runner" cannot get resource "horizontalpodautoscalers" in API group "autoscaling" in the namespace "staging"

Я пробовал настроить все разрешения для ролей, как показано ниже:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: staging
  name: cron-runner
rules:
- apiGroups: ["autoscaling"]
  resources: ["horizontalpodautoscalers"]
  verbs: ["patch"]

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: cron-runner
  namespace: staging
subjects:
- kind: ServiceAccount
  name: sa-cron-runner
  namespace: staging
roleRef:
  kind: Role
  name: cron-runner
  apiGroup: rbac.authorization.k8s.io

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: sa-cron-runner
  namespace: staging
---

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: scale-up-job
  namespace: staging
spec:
  schedule: "16 20 * * 1-6"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          serviceAccountName: sa-cron-runner
          containers:
          - name: scale-up-job
            image: bitnami/kubectl:latest
            command:
            - /bin/sh
            - -c
            - kubectl patch hpa my-web-service --patch '{\"spec\":{\"minReplicas\":6}}'
          restartPolicy: OnFailure

kubectl auth can-i patch horizontalpodautoscalers -n staging --as sa-cron-runner также возвращает no, поэтому разрешения не могут быть установлены правильно.

Как я могу это отладить? Я не вижу, как это неправильно настроено


person MDalt    schedule 09.02.2021    source источник
comment
Отвечает ли это на ваш вопрос? Kubernetes проверяет разрешения учетной записи службы   -  person Manuel    schedule 09.02.2021
comment
Хм, как это применимо к вышесказанному? ... Я сделал все это, насколько я могу судить   -  person MDalt    schedule 10.02.2021
comment
Это то, о чем вы просите. --as = system: serviceaccount: staging: sa-cron-runner. Я думаю, это то, что вы ищете. Альтернативой запросу on глагола является получение всего списка, например kubectl auth can-i --list --as = system: serviceaccount: staging: sa-cron-runner. Но теперь в ваших выводах я вижу, что он уже использует правильный serviceaccount.   -  person Manuel    schedule 10.02.2021


Ответы (1)


Я думаю, что проблема в том, что cronjob должен сначала получить ресурс, а затем Patch то же самое. Итак, вам нужно явно указать разрешение для get в спецификации Role.

В ошибке также упоминается проблема аутентификации при получении ресурса:

horizontalpodautoscalers.autoscaling "my-web-service" is forbidden: User "system:serviceaccount:staging:sa-cron-runner" cannot get resource "horizontalpodautoscalers" in API group "autoscaling" in the namespace "staging"

Попробуйте изменить verbs часть Role как:

verbs: ["patch", "get"]

Вы также можете включить list и watch в зависимости от требований скриптов, запускаемых внутри cronjob.

person Krishna Chaurasia    schedule 10.02.2021
comment
Может быть проблемой, но не думайте, что это проблема авторизации. kubectl auth can-i patch horizontalpodautoscalers -n staging --as sa-cron-runner по-прежнему возвращает нет. - person MDalt; 10.02.2021
comment
попробуйте использовать как: kubectl auth can-i patch horizontalpodautoscalers -n staging --as system:serviceaccount:staging:sa-cron-runner - person Krishna Chaurasia; 10.02.2021
comment
После добавления этого и использования команды, предложенной Кришаном, это сработало! - person MDalt; 10.02.2021