AWS Alb 负载均衡做ingress的注意事项

目录

管理了一个AWS的EKS集群,用的是ALB的负载均衡,这个负载均衡和Nginx有区别,有很多特殊的地方需要注意。

基本需要宣告很多独有的 annotations

一、http自动跳转到https

 1  annotations:
 2    alb.ingress.kubernetes.io/actions.ssl-redirect: |
 3      {"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}
 4      
 5......
 6
 7  - host: '*.bajie.dev'
 8    http:
 9      paths:
10      - backend:
11          service:
12            name: ssl-redirect
13            port:
14              name: use-annotation
15        path: /
16        pathType: Prefix     

注意,annotation了上面一条,那么在LB中,http 80的规则就只剩下这一条了,压倒一切的规则。

之后你再annotation别的http规则,会不生效;你只能去annotition https的规则。

二、www重定向

例子: 输入 rendoumi.com,会自动重定义到 www.rendoumi.com

 1  annotations:
 2    alb.ingress.kubernetes.io/actions.www-redirect: |
 3      {"type":"redirect","redirectConfig":{"host":"www.rendoumi.com","port":"443","protocol":"HTTPS","statusCode":"HTTP_301"}}
 4
 5......
 6
 7  - host: rendoumi.com
 8    http:
 9      paths:
10      - backend:
11          service:
12            name: www-redirect
13            port:
14              name: use-annotation
15        path: /
16        pathType: Prefix

这个是直接301跳转到https去了

三、external-dns

ALB 的ingress有个大坑,那就是如果你大动ingress,前面的LB会发生变化,产生一个新的LB。这点非常要命,第一次遇到的时候,八戒被迫改掉了Route53的好多条DNS记录,擦的

所以务必把这个加上,避免引起联动,反正无所谓,没装external-dns的话annotation的不起作用

1  annotations:
2    external-dns.alpha.kubernetes.io/hostname: rendoumi.com,www.rendoumi.com,*.rendoumi.com

把要管理的域名用逗号分开

四、group属性

这个就是上面所说的大改动,加这个属性必然引起更换LB

这个场景也是必须的,举例来说,不同的namespace中的ingress都要用到同一个域名

这样就麻烦了,nginx ingress简单加个namespace就可以了,alb不行

需要显式声明 group 属性

1  annotations:
2    alb.ingress.kubernetes.io/group.name: rendoumi
3    alb.ingress.kubernetes.io/group.order: "100"

注意,两个属性务必在一起, order缺省是0,最大1000

这样LB会把不同ns中的ingress聚合成一个LB来使用

最后,给个完全的例子:

 1apiVersion: networking.k8s.io/v1
 2kind: Ingress
 3metadata:
 4  annotations:
 5    alb.ingress.kubernetes.io/actions.ssl-redirect: |
 6      {"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}
 7    alb.ingress.kubernetes.io/actions.www-redirect: |
 8      {"type":"redirect","redirectConfig":{"host":"www.bajie.dev","port":"443","protocol":"HTTPS","statusCode":"HTTP_301"}}
 9    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-southeast-1:000007118436:certificate/xxxxa910-46c9-4680-929a-99996deb98df
10    alb.ingress.kubernetes.io/group.name: bajie
11    alb.ingress.kubernetes.io/group.order: "100"
12    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
13    alb.ingress.kubernetes.io/scheme: internet-facing
14    alb.ingress.kubernetes.io/ssl-policy: ELBSecurityPolicy-TLS-1-1-2017-01
15    alb.ingress.kubernetes.io/ssl-redirect: "443"
16    alb.ingress.kubernetes.io/subnets: subnet-99996c43cb399f55c,subnet-9999c9681d11a3323,subnet-99999874db9639a77
17    alb.ingress.kubernetes.io/target-type: ip
18    external-dns.alpha.kubernetes.io/hostname: bajie.dev,www.bajie.dev,*.bajie.dev
19  namespace: default
20spec:
21  ingressClassName: alb
22  rules:
23  - host: official.bajie.dev
24    http:
25      paths:
26      - backend:
27          service:
28            name: dc-official-client
29            port:
30              number: 3000
31        path: /
32        pathType: Prefix
33  - host: bajie.dev
34    http:
35      paths:
36      - backend:
37          service:
38            name: www-redirect
39            port:
40              name: use-annotation
41        path: /
42        pathType: Prefix
43  - host: '*.bajie.dev'
44    http:
45      paths:
46      - backend:
47          service:
48            name: ssl-redirect
49            port:
50              name: use-annotation
51        path: /
52        pathType: Prefix        
53  tls:
54  - hosts:
55    - bajie.dev
56    - www.bajie.dev
57    - official.bajie.dev

我们在另外一个namespace annotatiton一个 ingress就是这样的

 1apiVersion: networking.k8s.io/v1
 2kind: Ingress
 3metadata:
 4  name: grafana
 5  namespace: prometheus
 6  annotations:
 7    alb.ingress.kubernetes.io/group.name: bajie
 8    alb.ingress.kubernetes.io/group.order: '10'
 9    alb.ingress.kubernetes.io/scheme: internet-facing
10    alb.ingress.kubernetes.io/target-type: ip
11    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-southeast-1:533267118436:certificate/e6c3a910-46c9-4680-929a-d60d6deb98df
12    external-dns.alpha.kubernetes.io/hostname: grafana.bajie.dev
13spec:
14  ingressClassName: alb
15  rules:
16    - host: grafana.bajie.dev
17      http:
18        paths:
19          - path: /
20            pathType: Prefix
21            backend:
22              service:
23                name: stable-grafana
24                port:
25                  number: 80
26  tls:
27  - hosts:
28    - grafana.bajie.dev

注意 order,grafana的order是10,而上面是100,所以grafana的记录会出现在*之前,否则,就首先被 星号 拦截,然后才到 grafana的路径,就不对了。


Mysql的某个表恢复到某一个时间点的操作
comments powered by Disqus