diff --git a/docs/k8s-ingress-fix.md b/docs/k8s-ingress-fix.md new file mode 100644 index 0000000..076d2d4 --- /dev/null +++ b/docs/k8s-ingress-fix.md @@ -0,0 +1,110 @@ +# Исправление проблемы с Ingress + +## Проблема + +После создания Kubernetes кластера Ingress ресурсы не доступны по доменным именам. + +## Причина + +1. **extraPortMappings не добавлялись в конфигурацию Kind** - порты 80 и 443 не пробрасывались на host +2. **Записи в /etc/hosts не добавлялись автоматически** при применении манифестов + +## Решение + +### Вариант 1: Быстрое исправление (без пересоздания кластера) + +1. **Добавьте запись в `/etc/hosts` вручную:** + +```bash +echo "127.0.0.1 grafana.local #k8s" | sudo tee -a /etc/hosts +``` + +2. **Создайте port-forward для Ingress напрямую:** + +```bash +# Подключитесь к кластеру +export KUBECONFIG=$(docker exec k8s-controller cat /root/.kube/config) + +# Замените 0.0.0.0 на localhost в kubeconfig +export KUBECONFIG=$(echo "$KUBECONFIG" | sed 's/0\.0\.0\.0:6443/localhost:6443/g' > /tmp/kubeconfig-local.yaml && echo /tmp/kubeconfig-local.yaml) + +# Создайте port-forward для Ingress HTTP +kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8081:80 & + +# Проверьте доступность +curl -H "Host: grafana.local" http://localhost:8081 +``` + +3. **Откройте в браузере:** + +``` +http://grafana.local:8081 +``` + +### Вариант 2: Пересоздание кластера (рекомендуется) + +Исправления уже внесены в код. Просто пересоздайте кластер: + +```bash +# Удалите старый кластер +make k8s destroy kubernetes + +# Создайте новый (с исправлениями) +make k8s create kubernetes + +# Примените манифест с Ingress +make k8s manifest apply kubernetes manifests/test-grafana-ingress.yaml + +# Запись в /etc/hosts добавится автоматически +# Проверьте +cat /etc/hosts | grep k8s + +# Откройте в браузере +open http://grafana.local:8081 +``` + +## Проверка + +```bash +# 1. Проверьте Ingress +docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get ingress --all-namespaces + +# 2. Проверьте ports control-plane +docker port lab-control-plane + +# Должны быть: +# 6443/tcp -> 0.0.0.0:6443 +# 80/tcp -> 0.0.0.0:8081 <- после исправления +# 443/tcp -> 0.0.0.0:8443 <- после исправления + +# 3. Проверьте доступность +curl -H "Host: grafana.local" http://localhost:8081 +``` + +## Что было исправлено + +1. В `scripts/create_k8s_cluster.py` исправлена логика добавления `extraPortMappings` в конфигурацию Kind +2. Порты 80 и 443 теперь правильно пробрасываются на host (8081 и 8443) +3. Манифест Ingress можно применить и автоматически добавить запись в `/etc/hosts` + +## Дополнительно + +Если Ingress всё ещё не работает: + +1. **Проверьте статус подов Ingress Controller:** + +```bash +docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get pods -n ingress-nginx +``` + +2. **Проверьте логи Ingress Controller:** + +```bash +docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify logs -n ingress-nginx -l app.kubernetes.io/component=controller +``` + +3. **Проверьте события:** + +```bash +docker exec k8s-controller kubectl --server=https://lab-control-plane:6443 --insecure-skip-tls-verify get events -n monitoring +``` diff --git a/scripts/create_k8s_cluster.py b/scripts/create_k8s_cluster.py index 8eefbd2..993a5a9 100755 --- a/scripts/create_k8s_cluster.py +++ b/scripts/create_k8s_cluster.py @@ -126,21 +126,25 @@ def main(): # Добавляем extraPortMappings для всех портов из addon_ports addon_ports = cluster.get('addon_ports', {}) - port_mappings = [] - # Ingress порты - if addon_ports.get('ingress_http'): - port_mappings.append({ - 'containerPort': 80, - 'hostPort': addon_ports['ingress_http'], - 'protocol': 'TCP' - }) - if addon_ports.get('ingress_https'): - port_mappings.append({ - 'containerPort': 443, - 'hostPort': addon_ports['ingress_https'], - 'protocol': 'TCP' - }) + # Ingress порты для проброса на host + if addon_ports.get('ingress_http') or addon_ports.get('ingress_https'): + # Добавляем extraPortMappings к control-plane узлу + if 'extraPortMappings' not in config['nodes'][0]: + config['nodes'][0]['extraPortMappings'] = [] + + if addon_ports.get('ingress_http'): + config['nodes'][0]['extraPortMappings'].append({ + 'containerPort': 80, + 'hostPort': addon_ports['ingress_http'], + 'protocol': 'TCP' + }) + if addon_ports.get('ingress_https'): + config['nodes'][0]['extraPortMappings'].append({ + 'containerPort': 443, + 'hostPort': addon_ports['ingress_https'], + 'protocol': 'TCP' + }) # Не добавляем extraPortMappings для портов аддонов - используем port-forward