使用 ALB 重定向到外部资源的入口
Ingress to redirect to external resource using ALB
我在集群上有一些服务 运行,ALB 工作正常。但是我有一个 CloudFront 发行版,由于一些内部因素,我想使用集群作为入口点。因此,我正在尝试添加一个入口以根据默认规则或命名主机将请求重定向到 CloudFront 分配,两者都可以工作。
我尝试了两种不同的方法,但没有成功:
正在创建外部名称和入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: "internet-facing"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80,"HTTPS": 443}]'
alb.ingress.kubernetes.io/certificate-arn: <my-cert-arn>
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": {
"Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
alb.ingress.kubernetes.io/group.name: <my-group-name>
spec:
rules:
- host: test.my-host.net
HTTP:
paths:
- backend:
serviceName: test
servicePort: use-annotation
path: /
---
apiVersion: v1
kind: Service
metadata:
name: test
spec:
type: ExternalName
externalName: test.my-host.net
我还尝试使用带有 ALB Ingress v2 注释的重定向创建入口,就像文档一样:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: "internet-facing"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80,"HTTPS": 443}]'
alb.ingress.kubernetes.io/certificate-arn: <my-cert-arn>
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": {
"Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
alb.ingress.kubernetes.io/actions.redirect-to-eks: >
{"type":"redirect","redirectConfig":{"host":"my-
dist.cloudfront.net","path":"/","port":"443",
"protocol":"HTTPS","query":"k=v","statusCode":"HTTP_302"}}
alb.ingress.kubernetes.io/group.name: <my-group-name>
spec:
rules:
- host: <my-host-name>
HTTP:
paths:
- backend:
serviceName: ssl-redirect
servicePort: use-annotation
它不能使用 ExternalName
服务类型的原因是因为它没有端点。 ALB 只能将目标设置为 instance
或 ip
(documentation),因此 ExternalName
不是此处的选项。
您可以创建带注释的重定向,但这有点棘手。 首先,您至少需要两个具有 public 访问权限的子网才能进行 alb.ingress.kubernetes.io/subnets
注释。可以自动发现子网,但我不知道它是否可以从分配给 EKS 集群的所有子网中选择 public 个子网,因此最好明确设置。 其次,你需要使用alb.ingress.kubernetes.io/actions.<ACTION NAME>
注解(documentation),其中<ACTION NAME>
必须匹配来自入口规则的serviceName
。 第三个,您需要在重定向配置中指定Host
,否则它将host
来自入口spec
。
这是一个工作示例:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-alb
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: "internet-facing"
alb.ingress.kubernetes.io/subnets: "public-subnet-id1,public-subnet-id2"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80,"HTTPS": 443}]'
alb.ingress.kubernetes.io/actions.redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Host":"example.com", "port":"443", "StatusCode": "HTTP_301"}}'
spec:
rules:
- host: alb-test.host.name
http:
paths:
- backend:
serviceName: redirect
servicePort: use-annotation
您的 ssl-redirect
注释几乎是正确的,除了它重定向到 <my-host-name>
。我建议您使用 Web 控制台(在 link 中更改区域)https://console.aws.amazon.com/ec2/v2/home?region=eu-central-1#LoadBalancers:sort=loadBalancerName 来查看生成的重定向规则并调试其他选项。
还有其他选项可以解决这个问题,例如 nginx
的专用部署。或者你可以使用 nginx ingress controller,根据我的经验,用它设置重定向要容易得多。
我在集群上有一些服务 运行,ALB 工作正常。但是我有一个 CloudFront 发行版,由于一些内部因素,我想使用集群作为入口点。因此,我正在尝试添加一个入口以根据默认规则或命名主机将请求重定向到 CloudFront 分配,两者都可以工作。
我尝试了两种不同的方法,但没有成功:
正在创建外部名称和入口:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: "internet-facing"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80,"HTTPS": 443}]'
alb.ingress.kubernetes.io/certificate-arn: <my-cert-arn>
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": {
"Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
alb.ingress.kubernetes.io/group.name: <my-group-name>
spec:
rules:
- host: test.my-host.net
HTTP:
paths:
- backend:
serviceName: test
servicePort: use-annotation
path: /
---
apiVersion: v1
kind: Service
metadata:
name: test
spec:
type: ExternalName
externalName: test.my-host.net
我还尝试使用带有 ALB Ingress v2 注释的重定向创建入口,就像文档一样:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: "internet-facing"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80,"HTTPS": 443}]'
alb.ingress.kubernetes.io/certificate-arn: <my-cert-arn>
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": {
"Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
alb.ingress.kubernetes.io/actions.redirect-to-eks: >
{"type":"redirect","redirectConfig":{"host":"my-
dist.cloudfront.net","path":"/","port":"443",
"protocol":"HTTPS","query":"k=v","statusCode":"HTTP_302"}}
alb.ingress.kubernetes.io/group.name: <my-group-name>
spec:
rules:
- host: <my-host-name>
HTTP:
paths:
- backend:
serviceName: ssl-redirect
servicePort: use-annotation
它不能使用 ExternalName
服务类型的原因是因为它没有端点。 ALB 只能将目标设置为 instance
或 ip
(documentation),因此 ExternalName
不是此处的选项。
您可以创建带注释的重定向,但这有点棘手。 首先,您至少需要两个具有 public 访问权限的子网才能进行 alb.ingress.kubernetes.io/subnets
注释。可以自动发现子网,但我不知道它是否可以从分配给 EKS 集群的所有子网中选择 public 个子网,因此最好明确设置。 其次,你需要使用alb.ingress.kubernetes.io/actions.<ACTION NAME>
注解(documentation),其中<ACTION NAME>
必须匹配来自入口规则的serviceName
。 第三个,您需要在重定向配置中指定Host
,否则它将host
来自入口spec
。
这是一个工作示例:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: test-alb
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: "internet-facing"
alb.ingress.kubernetes.io/subnets: "public-subnet-id1,public-subnet-id2"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80,"HTTPS": 443}]'
alb.ingress.kubernetes.io/actions.redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Host":"example.com", "port":"443", "StatusCode": "HTTP_301"}}'
spec:
rules:
- host: alb-test.host.name
http:
paths:
- backend:
serviceName: redirect
servicePort: use-annotation
您的 ssl-redirect
注释几乎是正确的,除了它重定向到 <my-host-name>
。我建议您使用 Web 控制台(在 link 中更改区域)https://console.aws.amazon.com/ec2/v2/home?region=eu-central-1#LoadBalancers:sort=loadBalancerName 来查看生成的重定向规则并调试其他选项。
还有其他选项可以解决这个问题,例如 nginx
的专用部署。或者你可以使用 nginx ingress controller,根据我的经验,用它设置重定向要容易得多。