Python Kubernetes MutatingWebhook не добавляет метки

Вопрос или проблема

Я создал MutatingWebhook для Kubernetes, используя образ Docker, который я собрал на Python. Цель вебхука — добавлять метки к любому Pod, который запускается. Все ресурсы Kubernetes работают нормально, однако, когда запускаются новые Pods, они не получают ожидаемые метки от MutatingWebhook. Я получаю эту ошибку, когда запускаю новый Pod:

Ошибка от сервера (InternalError): Произошла внутренняя ошибка: не удалось вызвать вебхук "add-labels.k8s.io": не удалось вызвать вебхук: Post "https://add-labels-webhook-svc.mutatingwh.svc:443/mutate?timeout=10s": dial tcp 10.3.33.250:443: connect: connection refused

Вот код вебхука на Python:

import json
from flask import Flask, request, jsonify
import base64

app = Flask(__name__)

@app.route('/mutate', methods=['POST'])
def mutate():
    # Читаем запрос на проверку приема
    admission_review = request.get_json()
    print("Запрос AdmissionReview:", json.dumps(admission_review))

    # Определяем патч для добавления меток
    patch = [
        {
            "op": "add",
            "path": "/metadata/labels/live",
            "value": "true"
        },
        {
            "op": "add",
            "path": "/metadata/labels/environment",
            "value": "production"
        },
        {
            "op": "add",
            "path": "/metadata/labels/service",
            "value": "my-service"
        },
        {
            "op": "add",
            "path": "/metadata/labels/version",
            "value": "7.55.2"
        }
    ]

    # Кодируем патч в base64
    patch_base64 = base64.b64encode(json.dumps(patch).encode()).decode()

    # Подготавливаем ответ на проверку приема
    admission_response = {
        "uid": admission_review['request']['uid'],
        "allowed": True,
        "patchType": "JSONPatch",
        "patch": patch_base64
    }

    # Возвращаем ответ на проверку приема
    response = {
        "apiVersion": "admission.k8s.io/v1",
        "kind": "AdmissionReview",
        "response": admission_response
    }

    return jsonify(response)

if __name__ == '__main__':
    app.run(host="0.0.0.0", port=443, ssl_context=('tls.crt', 'tls.key'), debug=True)

Вот различные манифесты K8s, которые я использовал для развертывания, служб и т.д.

deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: add-labels-webhook
  namespace: mutatingwh
spec:
  replicas: 1
  selector:
    matchLabels:
      app: add-labels-webhook
  template:
    metadata:
      labels:
        app: add-labels-webhook
    spec:
      containers:
        - name: webhook
          image: 805960120419.dkr.ecr.us-east-1.amazonaws.com/noc/add-labels-webhook:latest
          ports:
            - containerPort: 443
      imagePullSecrets:
        - name: ecr-secret

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: add-labels-webhook-svc
  namespace: mutatingwh
spec:
  ports:
    - port: 443
      targetPort: 443
  selector:
    app: add-labels-webhook

mutatingwebhookconfiguration.yaml

apiVersion: admissionregistration.k8s.io/v1
kind: MutatingWebhookConfiguration
metadata:
  name: add-labels-webhook
webhooks:
  - name: add-labels.k8s.io
    clientConfig:
      service:
        name: add-labels-webhook-svc
        namespace: mutatingwh
        path: "/mutate"
      caBundle: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNekNDQWh1Z0F3SUJBZ0lVTEpJVlFkcXBiR05yb3N3Rk9SRDA0SzREbnpjd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0tURW5NQ1VHQTFVRUF3d2VZV1JrTFd4aFltVnNjeTEzWldKb2IyOXJMbVJsWm1GMWJIUXVjM1pqTUI0WApEVEkwTVRBeU5UQTRORGd3T0ZvWERUSTFNVEF5TlRBNE5EZ3dPRm93S1RFbk1DVUdBMVVFQXd3ZVlXUmtMV3hoClltVnNjeTEzWldKb2IyOXJMbVJsWm1GMWJIUXVjM1pqTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEEKTUlJQkNnS0NBUUVBc05CWG0yWE1TZVNTUUxsZ2ZvR01wRk0xeHRtdmxxN1JrK2RoTUw0b211VVN1NDJaMk9VcAp1S3RJdkdtRnorYUpBU3FONmFTY0xJbFFTTElSdmNqNnJ3aXVwcGZVQldSNkdDeEhGYW52R0VxT0YxSkR6OEptCko4Zkp3b09aMFJqQmtYdWFLSFdtNC9NSHV6T240SUdnV3dRRnN2Tk1ZUitFMkRsRjZnOWE4c0cwbjVQTVVydHkKNGdiVDduY2pFZnc2NFc2SmZqRzFNTDNLTXI3aUZ1NXBxM0hJMXh2cSt5T2lDNGQ4WEVJL3FibU9vbDdOYUZDRwpyNVZRd0hLMWx4aHBZY2VWVTNlQWIxS0tHL3FDSVdURVptbTlFbGZuMWJRbzZtOEVxenVES2QyTHE1VmRqUWVnCmFJRkNMYmd2YWx0S1FWaGIwUEhNRjlqUE5yN0xLenRsclFJREFRQUJvMU13VVRBZEJnTlZIUTRFRmdRVUpYcDEKdnVmcXVFbW9VTDhmL3BUZXEzQ25vME13SHdZRFZSMGpCQmd3Rm9BVUpYcDF2dWZxdUVtb1VMOGYvcFRlcTNDbgpvME13RHdZRFZSMFRBUUgvQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBSTNUczh0UE1zR29kCjZvU2ZxanQ0Rzk0SWR4SjVRZkZMaG5hTnBmS0tBRldDZVI2cVEzYWtWWFNnVzVFSlBud0dtdjBYRkh2YWtXa1EKc3A5QjhvaVI1OWlWRHpFME5QdytHQmkzMWkrTW9aaDAzYXYyWFg0K1FKOTFkRENldkFZeEQ4RkxackZ3UTJEMwpjUVdmQk1kSS9JSys5V1dWNXRtZmdtN2d3bi9XNy9nTC9ScVNkaVQwWllmRjZSVjhNeHFaano4bGFWUXhCU2FYCi9kNVROZi9XcldIUjlIek1xRU91UXBIL3NqRVlUM2xkbTA2aTdKMFVsOFJDQTkyL3c2L3dLRk82SHFYVWR1RVoKS25KTHdZV1A4YnJkMHhTcFhYUFRrbHl0T3ZLYkt3N2ljeDRaYzkxbXJOMjRGZ2k5OWN3L2tIZng4cnQ2RVJqawp0S3BLSCt2OVpRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    admissionReviewVersions: ["v1"]
    sideEffects: None
    rules:
      - operations: ["CREATE"]
        apiGroups: [""]
        apiVersions: ["v1"]
        resources: ["pods"]
    failurePolicy: Fail

Мой вопрос заключается в том, почему все работает нормально, но когда создаются новые Pods, они не получают метки от вебхука на Python?

Ответ или решение

Ошибка добавления меток с использованием MutatingWebhook в Kubernetes с помощью Python

Ситуация, когда ваши новые Pods не получают ожидаемые метки от MutatingWebhook, является распространенной проблемой, с которой сталкиваются разработчики и администраторы Kubernetes. Исходя из вашего описания проблемы и приведенного кода, мы можем выделить несколько ключевых аспектов, требующих внимания для решения ошибки connection refused. Эта ошибка указывает на то, что ваш вебхуки не может быть достигнут, что в свою очередь означает, что система не может выполнить его вызов.

Шаги для диагностики и устранения неисправностей

  1. Проверка состояния сервиса:
    Убедитесь, что ваш сервис add-labels-webhook-svc запущен и правильно направлен. Используйте следующую команду, чтобы проверить статус сервиса:

    kubectl get svc -n mutatingwh

    Убедитесь, что у вас есть правильный Endpoints, которые указывают на ваш pod.

  2. Проверка логов:
    Логи вашего приложения могут дать дополнительные сведения о том, происходит ли обработка запросов правильно в самом вебхуке. Используйте команду:

    kubectl logs -l app=add-labels-webhook -n mutatingwh

    Проверьте, появляются ли какие-либо ошибки при попытке обработать запросы.

  3. Проверка конфигурации MutatingWebhook:
    Перепроверьте ваш манифест MutatingWebhookConfiguration. Обратите внимание на следующие параметры:

    • caBundle: Убедитесь, что сертификат (CA) правильно закодирован. Если он некорректен, Kubernetes не сможет установить защищенное соединение с вашим webhook.
    • failurePolicy: Убедитесь, что политика "Fail" действительно имеет смысл в вашем случае. Возможно, стоит попробовать Ignore для временной проверки.
  4. Проверка настройки TLS:
    Убедитесь, что сертификаты tls.crt и tls.key корректны и соответствуют доменному имени, указанному в конфигурации (адрес вашего сервиса). В противном случае, запросы могут не проходить.

  5. Проверка Networking:
    Используйте команду kubectl exec для выполнения команд в вашем поде и проверьте возможность подключения к сервису через серверную среду:

    kubectl exec -it <pod-name> -n mutatingwh -- curl -k https://add-labels-webhook-svc.mutatingwh.svc:443/mutate

    Эта команда поможет вам убедиться, что обращение к вашему сервису осуществляется правильно.

  6. Проверка конфигурации Ingress (если используется):
    Если вы используете ingress, убедитесь, что он не блокирует запросы к вашему вебхуку.

  7. Проверка прав доступа:
    Проверьте, что сервисный аккаунт, от имени которого работает ваш под, имеет достаточные права для выполнения операций с Webhook, например, с помощью kubectl auth can-i.

Заключение

Для успешного решения вопроса не забывайте, что диагностика проблемы может занять некоторое время, и важно систематически проверять все возможные звенья цепи, начиная от сети и заканчивая конфигурацией приложения или среды выполнения. Все проверки должны быть выполнены с учетом специфики вашего окружения Kubernetes и его настроек.

Если после выполнения всех вышеперечисленных действий проблема все еще сохраняется, рассмотрите вариант применения временного монитора для вашего вебхука или прокси-сервера, чтобы более подробно анализировать, какие запросы приходят и как они обрабатываются.

Удачи вам в устранении проблемы!

Оцените материал
Добавить комментарий

Капча загружается...