Посты по тегу: k8s

Ошибка HPA в k8s

После развертывания CronJob в кластере kubernetes столкнулся с проблемой. Перестал работать Horisontal Pod Autoscaler.

Ошибка при этом была следующей:

horizontal-pod-autoscaler missing request for cpu

Есть даже issue на GitHub, которое до сих пор открыто. Но решается эта проблема добавлением лимитов в контейнер CronJob:

              resources:
                requests:
                  memory: "32Mi"
                  cpu: "100m"
                limits:
                  memory: "32Mi"
                  cpu: "100m"

В результате манифест CronJob из предыдущей заметки будет выглядеть так:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: test-restart
  namespace: test-ns
spec:
  concurrencyPolicy: Forbid
  schedule: '0 8 * * *' # cron spec of time, here, 8 o'clock
  jobTemplate:
    spec:
      backoffLimit: 2
      activeDeadlineSeconds: 600
      template:
        spec:
          serviceAccountName: test-restart
          restartPolicy: Never
          containers:
            - name: kubectl
              image: bitnami/kubectl
              command:
                - 'kubectl'
                - 'rollout'
                - 'restart'
                - 'deployment/your-deployment-name'
              resources:
                requests:
                  memory: "32Mi"
                  cpu: "100m"
                limits:
                  memory: "32Mi"
                  cpu: "100m"

После этого HPA начинает работать нормально.

Периодический перезапуск pod'ов в k8s

Иногда бывают такие ситуации, когда приложение течет по памяти, надо его периодически перезапускать. Ну или причина может быть совсем другой, но все же. Итак

Диспозиция

  1. Приложение надо периодически перезапускать
  2. Приложение задеплоено в kubernetes

Реализация

RBAC

Создаем сервисный аккаунт, роль и привязку:

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

CronJob

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: test-restart
  namespace: test-ns
spec:
  concurrencyPolicy: Forbid
  schedule: '0 8 * * *' # cron spec of time, here, 8 o'clock
  jobTemplate:
    spec:
      backoffLimit: 2
      activeDeadlineSeconds: 600
      template:
        spec:
          serviceAccountName: test-restart
          restartPolicy: Never
          containers:
            - name: kubectl
              image: bitnami/kubectl
              command:
                - 'kubectl'
                - 'rollout'
                - 'restart'
                - 'deployment/your-deployment-name'

Не забудьте проверить и поменять все имена в этом шаблоне.

Далее применяем это и у вас будет кронджоба, которая будет по расписанию плавно перезапускать весь деплоймент. Такой метод оставляет доступным ваш сервис даже в момент рестарта.