Вопрос или проблема
Я создал 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
. Эта ошибка указывает на то, что ваш вебхуки не может быть достигнут, что в свою очередь означает, что система не может выполнить его вызов.
Шаги для диагностики и устранения неисправностей
-
Проверка состояния сервиса:
Убедитесь, что ваш сервисadd-labels-webhook-svc
запущен и правильно направлен. Используйте следующую команду, чтобы проверить статус сервиса:kubectl get svc -n mutatingwh
Убедитесь, что у вас есть правильный Endpoints, которые указывают на ваш pod.
-
Проверка логов:
Логи вашего приложения могут дать дополнительные сведения о том, происходит ли обработка запросов правильно в самом вебхуке. Используйте команду:kubectl logs -l app=add-labels-webhook -n mutatingwh
Проверьте, появляются ли какие-либо ошибки при попытке обработать запросы.
-
Проверка конфигурации MutatingWebhook:
Перепроверьте ваш манифестMutatingWebhookConfiguration
. Обратите внимание на следующие параметры:caBundle
: Убедитесь, что сертификат (CA) правильно закодирован. Если он некорректен, Kubernetes не сможет установить защищенное соединение с вашим webhook.failurePolicy
: Убедитесь, что политика "Fail" действительно имеет смысл в вашем случае. Возможно, стоит попробоватьIgnore
для временной проверки.
-
Проверка настройки TLS:
Убедитесь, что сертификатыtls.crt
иtls.key
корректны и соответствуют доменному имени, указанному в конфигурации (адрес вашего сервиса). В противном случае, запросы могут не проходить. -
Проверка Networking:
Используйте командуkubectl exec
для выполнения команд в вашем поде и проверьте возможность подключения к сервису через серверную среду:kubectl exec -it <pod-name> -n mutatingwh -- curl -k https://add-labels-webhook-svc.mutatingwh.svc:443/mutate
Эта команда поможет вам убедиться, что обращение к вашему сервису осуществляется правильно.
-
Проверка конфигурации Ingress (если используется):
Если вы используете ingress, убедитесь, что он не блокирует запросы к вашему вебхуку. -
Проверка прав доступа:
Проверьте, что сервисный аккаунт, от имени которого работает ваш под, имеет достаточные права для выполнения операций с Webhook, например, с помощьюkubectl auth can-i
.
Заключение
Для успешного решения вопроса не забывайте, что диагностика проблемы может занять некоторое время, и важно систематически проверять все возможные звенья цепи, начиная от сети и заканчивая конфигурацией приложения или среды выполнения. Все проверки должны быть выполнены с учетом специфики вашего окружения Kubernetes и его настроек.
Если после выполнения всех вышеперечисленных действий проблема все еще сохраняется, рассмотрите вариант применения временного монитора для вашего вебхука или прокси-сервера, чтобы более подробно анализировать, какие запросы приходят и как они обрабатываются.
Удачи вам в устранении проблемы!