使用ALB重定向到外部资源的入口

时间:2020-11-08 19:53:16

标签: kubernetes amazon-cloudfront kubernetes-ingress amazon-eks

我在集群上运行了一些服务,并且ALB运行正常。但是我有一个CloudFront发行版,由于某些内部因素,我想将集群用作入口点。因此,我正在尝试添加一个入口,以根据默认规则或命名主机将请求重定向到CloudFront分配,两者都将起作用。

我尝试了2种不同的方法,但是没有骰子:

创建外部名称和入口:

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

1 个答案:

答案 0 :(得分:2)

它不能与ExternalName服务类型一起使用的原因是因为它没有端点。 ALB只能将目标设置为instanceipdocumentation),因此此处ExternalName不可选项。

您可以创建带注释的重定向,但这有点棘手。 首先,您需要至少两个具有alb.ingress.kubernetes.io/subnets批注公共访问权限的子网。子网可以自动发现,但是我不知道它是否可以从分配给EKS集群的所有子网中选择公共子网,因此最好进行明确设置。 第二,您需要使用alb.ingress.kubernetes.io/actions.<ACTION NAME>批注(documentation),其中<ACTION NAME>必须与入口规则中的serviceName相匹配。 第三,您需要在重定向配置中指定Host,否则它将是入口host的{​​{1}}。

这是一个可行的示例:

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。我建议您使用Web控制台(链接中的更改区域)https://console.aws.amazon.com/ec2/v2/home?region=eu-central-1#LoadBalancers:sort=loadBalancerName查看生成的重定向规则并调试其他选项。

还有其他方法可以解决此问题,例如使用<my-host-name>进行专用部署。或者您可以使用nginx ingress controller,根据我的经验,使用它设置重定向会容易得多。