re_deploy_nlb.sh
3.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/bin/bash
echo "🔧 强制删除并重新创建 microservices-nlb(无需 jq)..."
# 1. 强制删除现有服务
echo "强制删除 microservices-nlb..."
kubectl delete svc microservices-nlb -n ecommerce --force --grace-period=0
# 2. 检查是否卡在删除状态
echo "检查删除状态..."
sleep 10
if kubectl get svc microservices-nlb -n ecommerce &>/dev/null; then
echo "服务仍然存在,移除 finalizers..."
# 使用 kubectl patch 移除 finalizers
kubectl patch svc microservices-nlb -n ecommerce -p '{"metadata":{"finalizers":[]}}' --type=merge
sleep 10
fi
# 3. 再次尝试删除
kubectl delete svc microservices-nlb -n ecommerce --force --grace-period=0 &>/dev/null || true
# 4. 等待完全删除
echo "等待删除完成..."
sleep 30
# 5. 检查 NLB 状态
echo "检查 NLB 状态..."
NLB_INFO=$(aws elbv2 describe-load-balancers --region us-east-1 --query 'LoadBalancers[?contains(LoadBalancerName, `k8s-ecommerc-microser`)]' --output text)
if [ -n "$NLB_INFO" ]; then
echo "找到 NLB,提取 ARN..."
# 从输出中提取 ARN
NLB_ARN=$(echo "$NLB_INFO" | grep -o 'arn:aws:elasticloadbalancing:[^ ]*')
echo "手动删除 NLB: $NLB_ARN"
aws elbv2 delete-load-balancer --load-balancer-arn "$NLB_ARN" --region us-east-1
echo "等待 NLB 删除..."
sleep 30
else
echo "✅ NLB 已自动删除"
fi
# 6. 重新创建服务
echo "重新创建 microservices-nlb..."
kubectl apply -f - <<EOF
apiVersion: v1
kind: Service
metadata:
name: microservices-nlb
namespace: ecommerce
labels:
app: microservices
service: nlb-internal
annotations:
# 固定 NLB 名称
service.beta.kubernetes.io/aws-load-balancer-name: "ecommerce-microservices-nlb"
# NLB 配置
service.beta.kubernetes.io/aws-load-balancer-type: "external"
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
service.beta.kubernetes.io/aws-load-balancer-scheme: "internal"
service.beta.kubernetes.io/aws-load-balancer-cross-zone-load-balancing-enabled: "true"
# SSL 配置
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "arn:aws:acm:us-east-1:319998871902:certificate/fc39f8cd-dede-4f92-bbae-b154c7aff2b7"
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "http"
service.beta.kubernetes.io/aws-load-balancer-ssl-negotiation-policy: "ELBSecurityPolicy-TLS13-1-2-2021-06"
# 健康检查
service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol: "HTTPS"
service.beta.kubernetes.io/aws-load-balancer-healthcheck-port: "443"
service.beta.kubernetes.io/aws-load-balancer-healthcheck-path: "/actuator/health"
service.beta.kubernetes.io/aws-load-balancer-healthcheck-interval: "30"
service.beta.kubernetes.io/aws-load-balancer-healthcheck-timeout: "10"
service.beta.kubernetes.io/aws-load-balancer-healthcheck-healthy-threshold: "2"
service.beta.kubernetes.io/aws-load-balancer-healthcheck-unhealthy-threshold: "2"
# 连接设置
service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: "120"
spec:
type: LoadBalancer
selector:
app.kubernetes.io/part-of: ecommerce
ports:
- name: https
port: 443
targetPort: 8080
protocol: TCP
- name: http
port: 80
targetPort: 8080
protocol: TCP
EOF
# 7. 等待创建完成
echo "等待 NLB 创建..."
sleep 45
# 8. 验证结果
echo "验证创建结果..."
echo "=== Service 状态 ==="
kubectl get svc microservices-nlb -n ecommerce -o wide
echo ""
echo "=== NLB 名称验证 ==="
aws elbv2 describe-load-balancers --region us-east-1 --query 'LoadBalancers[?contains(DNSName, `ecommerce-microservices`)].{Name:LoadBalancerName,DNS:DNSName}' --output table
echo ""
echo "=== 如果名称不是 ecommerce-microservices-nlb,请检查 AWS Load Balancer Controller 日志 ==="
kubectl logs -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller --tail=10