fix: исправлена проблема с пробросом портов Ingress

- Исправлена логика добавления extraPortMappings в конфигурацию Kind
- Порты 80 и 443 теперь правильно пробрасываются на host (8081, 8443)
- Создана документация k8s-ingress-fix.md с инструкциями
This commit is contained in:
Сергей Антропов
2025-10-26 10:58:37 +03:00
parent eca556cca7
commit df7473fbd9
2 changed files with 128 additions and 14 deletions

110
docs/k8s-ingress-fix.md Normal file
View File

@@ -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
```

View File

@@ -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