aula-06 e aula-08: Hetzner CSI Driver e segurança de rede
aula-06: - Adicionar instalação do Hetzner CSI Driver no setup.sh - Input interativo seguro para token da Hetzner Cloud - Atualizar custom-values.yaml para n8n.kube.quest aula-08: - Adicionar regras de firewall para VXLAN e rede privada - Configurar Flannel para usar interface privada (--iface-can-reach) - Configurar kubelet.nodeIP.validSubnets para rede privada - Corrigir segurança: VXLAN restrito a 10.0.0.0/8
This commit is contained in:
@@ -12,7 +12,7 @@
|
|||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
image:
|
image:
|
||||||
repository: n8nio/n8n
|
repository: n8nio/n8n
|
||||||
tag: "2.1.4"
|
tag: "2.0.3"
|
||||||
pullPolicy: IfNotPresent
|
pullPolicy: IfNotPresent
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------
|
||||||
@@ -58,7 +58,7 @@ ingress:
|
|||||||
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
|
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
|
||||||
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
|
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
|
||||||
hosts:
|
hosts:
|
||||||
- host: n8n.localhost
|
- host: n8n.kube.quest
|
||||||
paths:
|
paths:
|
||||||
- path: /
|
- path: /
|
||||||
pathType: Prefix
|
pathType: Prefix
|
||||||
@@ -121,7 +121,7 @@ worker:
|
|||||||
webhook:
|
webhook:
|
||||||
mode: queue
|
mode: queue
|
||||||
count: 1
|
count: 1
|
||||||
url: "http://n8n.localhost"
|
url: "https://n8n.kube.quest"
|
||||||
extraEnvVars:
|
extraEnvVars:
|
||||||
N8N_SECURE_COOKIE: "false"
|
N8N_SECURE_COOKIE: "false"
|
||||||
resources:
|
resources:
|
||||||
|
|||||||
@@ -67,7 +67,68 @@ log_success "Helm $(helm version --short) encontrado"
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# 1. INSTALAR NGINX INGRESS (se não existir)
|
# 1. INSTALAR HETZNER CSI DRIVER (para provisionar volumes)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
log_info "=== Configurando Hetzner CSI Driver ==="
|
||||||
|
|
||||||
|
# Verificar se secret já existe (evita pedir token novamente)
|
||||||
|
if kubectl get secret hcloud -n kube-system &> /dev/null; then
|
||||||
|
log_success "Secret hcloud já existe em kube-system"
|
||||||
|
else
|
||||||
|
# Pedir token via input interativo
|
||||||
|
echo ""
|
||||||
|
log_info "Token da Hetzner Cloud necessário para provisionar volumes."
|
||||||
|
log_info "Crie um token em: https://console.hetzner.cloud/projects/*/security/tokens"
|
||||||
|
echo ""
|
||||||
|
log_info "Cole o token e pressione ENTER:"
|
||||||
|
|
||||||
|
# Desabilita echo, lê linha completa, reabilita echo
|
||||||
|
stty -echo
|
||||||
|
IFS= read -r HCLOUD_TOKEN
|
||||||
|
stty echo
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ -z "$HCLOUD_TOKEN" ]; then
|
||||||
|
log_error "Token não pode ser vazio."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
log_info "Criando secret hcloud em kube-system..."
|
||||||
|
kubectl create secret generic hcloud \
|
||||||
|
--namespace=kube-system \
|
||||||
|
--from-literal=token="$HCLOUD_TOKEN"
|
||||||
|
log_success "Secret hcloud criado"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Instalar Hetzner CSI Driver via Helm (se não instalado)
|
||||||
|
if helm status hcloud-csi -n kube-system &> /dev/null; then
|
||||||
|
log_success "Hetzner CSI Driver já está instalado"
|
||||||
|
else
|
||||||
|
log_info "Instalando Hetzner CSI Driver..."
|
||||||
|
helm repo add hcloud https://charts.hetzner.cloud 2>/dev/null || true
|
||||||
|
helm repo update hcloud
|
||||||
|
|
||||||
|
helm install hcloud-csi hcloud/hcloud-csi \
|
||||||
|
--namespace kube-system \
|
||||||
|
--wait \
|
||||||
|
--timeout 5m
|
||||||
|
log_success "Hetzner CSI Driver instalado"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verificar StorageClass
|
||||||
|
log_info "Verificando StorageClass..."
|
||||||
|
if kubectl get storageclass hcloud-volumes &> /dev/null; then
|
||||||
|
log_success "StorageClass hcloud-volumes disponível"
|
||||||
|
else
|
||||||
|
log_error "StorageClass hcloud-volumes não encontrado"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# =============================================================================
|
||||||
|
# 2. INSTALAR NGINX INGRESS (se não existir)
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
log_info "=== Verificando NGINX Ingress ==="
|
log_info "=== Verificando NGINX Ingress ==="
|
||||||
@@ -82,6 +143,8 @@ else
|
|||||||
helm install nginx-ingress ingress-nginx/ingress-nginx \
|
helm install nginx-ingress ingress-nginx/ingress-nginx \
|
||||||
--namespace ingress-nginx \
|
--namespace ingress-nginx \
|
||||||
--create-namespace \
|
--create-namespace \
|
||||||
|
--set controller.allowSnippetAnnotations=true \
|
||||||
|
--set controller.config.annotations-risk-level=Critical \
|
||||||
--wait
|
--wait
|
||||||
|
|
||||||
log_success "NGINX Ingress instalado"
|
log_success "NGINX Ingress instalado"
|
||||||
@@ -89,7 +152,7 @@ fi
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# 2. CRIAR NAMESPACE E APLICAR SECRETS
|
# 3. CRIAR NAMESPACE E APLICAR SECRETS
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
log_info "=== Configurando namespace n8n ==="
|
log_info "=== Configurando namespace n8n ==="
|
||||||
@@ -106,7 +169,7 @@ fi
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# 3. INSTALAR n8n VIA HELM
|
# 4. INSTALAR n8n VIA HELM
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
log_info "=== Instalando n8n ==="
|
log_info "=== Instalando n8n ==="
|
||||||
@@ -138,7 +201,7 @@ fi
|
|||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# 4. AGUARDAR PODS FICAREM PRONTOS
|
# 5. AGUARDAR PODS FICAREM PRONTOS
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
|
|
||||||
log_info "=== Aguardando pods ficarem prontos ==="
|
log_info "=== Aguardando pods ficarem prontos ==="
|
||||||
@@ -185,6 +248,7 @@ echo -e "${GREEN} Setup Completo!${NC}"
|
|||||||
echo "=============================================="
|
echo "=============================================="
|
||||||
echo ""
|
echo ""
|
||||||
echo "Componentes instalados:"
|
echo "Componentes instalados:"
|
||||||
|
echo " - Hetzner CSI Driver (StorageClass: hcloud-volumes)"
|
||||||
echo " - NGINX Ingress Controller"
|
echo " - NGINX Ingress Controller"
|
||||||
echo " - n8n (namespace: n8n)"
|
echo " - n8n (namespace: n8n)"
|
||||||
echo " - Main node"
|
echo " - Main node"
|
||||||
@@ -216,7 +280,7 @@ echo " # Desinstalar"
|
|||||||
echo " helm uninstall n8n -n n8n"
|
echo " helm uninstall n8n -n n8n"
|
||||||
echo ""
|
echo ""
|
||||||
echo " # Fazer upgrade do helm chart"
|
echo " # Fazer upgrade do helm chart"
|
||||||
echo " helm upgrade --reuse-values --values --custom-values.yaml n8n community-charts/n8n --namespace n8n"
|
echo " helm upgrade --reuse-values --values custom-values.yaml n8n community-charts/n8n --namespace n8n"
|
||||||
echo ""
|
echo ""
|
||||||
echo " # Verificar historico de releases"
|
echo " # Verificar historico de releases"
|
||||||
echo " helm history n8n -n n8n"
|
echo " helm history n8n -n n8n"
|
||||||
|
|||||||
@@ -130,6 +130,30 @@ resource "hcloud_firewall" "cluster" {
|
|||||||
source_ips = ["0.0.0.0/0", "::/0"]
|
source_ips = ["0.0.0.0/0", "::/0"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Allow VXLAN for Flannel CNI (private network only - secure)
|
||||||
|
rule {
|
||||||
|
direction = "in"
|
||||||
|
protocol = "udp"
|
||||||
|
port = "4789"
|
||||||
|
source_ips = ["10.0.0.0/8"]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Allow all TCP traffic between cluster nodes (private network)
|
||||||
|
rule {
|
||||||
|
direction = "in"
|
||||||
|
protocol = "tcp"
|
||||||
|
port = "any"
|
||||||
|
source_ips = ["10.0.0.0/8"]
|
||||||
|
}
|
||||||
|
|
||||||
|
# Allow all UDP traffic between cluster nodes (private network)
|
||||||
|
rule {
|
||||||
|
direction = "in"
|
||||||
|
protocol = "udp"
|
||||||
|
port = "any"
|
||||||
|
source_ips = ["10.0.0.0/8"]
|
||||||
|
}
|
||||||
|
|
||||||
# Allow all outbound traffic
|
# Allow all outbound traffic
|
||||||
rule {
|
rule {
|
||||||
direction = "out"
|
direction = "out"
|
||||||
|
|||||||
@@ -29,6 +29,10 @@ machine:
|
|||||||
max-pods: "110"
|
max-pods: "110"
|
||||||
kube-reserved: "cpu=200m,memory=300Mi"
|
kube-reserved: "cpu=200m,memory=300Mi"
|
||||||
system-reserved: "cpu=200m,memory=200Mi"
|
system-reserved: "cpu=200m,memory=200Mi"
|
||||||
|
# Force kubelet to use private network IP
|
||||||
|
nodeIP:
|
||||||
|
validSubnets:
|
||||||
|
- 10.0.0.0/8
|
||||||
|
|
||||||
# Time sync
|
# Time sync
|
||||||
time:
|
time:
|
||||||
@@ -51,6 +55,9 @@ cluster:
|
|||||||
network:
|
network:
|
||||||
cni:
|
cni:
|
||||||
name: flannel
|
name: flannel
|
||||||
|
flannel:
|
||||||
|
extraArgs:
|
||||||
|
- --iface-can-reach=10.0.1.1
|
||||||
dnsDomain: cluster.local
|
dnsDomain: cluster.local
|
||||||
serviceSubnets:
|
serviceSubnets:
|
||||||
- 10.96.0.0/12
|
- 10.96.0.0/12
|
||||||
|
|||||||
@@ -19,6 +19,10 @@ machine:
|
|||||||
max-pods: "110"
|
max-pods: "110"
|
||||||
kube-reserved: "cpu=100m,memory=200Mi"
|
kube-reserved: "cpu=100m,memory=200Mi"
|
||||||
system-reserved: "cpu=100m,memory=100Mi"
|
system-reserved: "cpu=100m,memory=100Mi"
|
||||||
|
# Force kubelet to use private network IP
|
||||||
|
nodeIP:
|
||||||
|
validSubnets:
|
||||||
|
- 10.0.0.0/8
|
||||||
|
|
||||||
# Time sync
|
# Time sync
|
||||||
time:
|
time:
|
||||||
@@ -37,6 +41,9 @@ cluster:
|
|||||||
network:
|
network:
|
||||||
cni:
|
cni:
|
||||||
name: flannel
|
name: flannel
|
||||||
|
flannel:
|
||||||
|
extraArgs:
|
||||||
|
- --iface-can-reach=10.0.1.1
|
||||||
dnsDomain: cluster.local
|
dnsDomain: cluster.local
|
||||||
serviceSubnets:
|
serviceSubnets:
|
||||||
- 10.96.0.0/12
|
- 10.96.0.0/12
|
||||||
|
|||||||
Reference in New Issue
Block a user