具有单个 ALB、多个命名空间和外部 DNS 的 EKS Ingress
EKS Ingress with Single ALB, multiple namespaces, and External DNS
我正在尝试在 aws EKS 中跨多个命名空间配置单个 ALB,每个命名空间都有自己的入口资源。
我正在尝试在 k8s v1.20 上配置入口控制器 aws-loadbalancer-controller
。
我面临的问题是,每次我尝试部署新服务时,除了在入口配置中指定的共享 ALB 之外,它总是启动一个新的经典负载均衡器。
https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/
# service-realm1-dev.yaml:
apiVersion: v1
kind: Service
metadata:
name: sentinel
annotations:
external-dns.alpha.kubernetes.io/hostname: realm1.dev.sentinel.mysite.io
namespace: realm1-dev
labels:
run: sentinel
spec:
ports:
- port: 5001
name: ps1
protocol: TCP
selector:
app: sentinel
type: LoadBalancer
# ingress realm1-app
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/group.name: sentinel-ingress
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
alb.ingress.kubernetes.io/healthcheck-port: traffic-port
alb.ingress.kubernetes.io/healthcheck-interval-seconds: "15"
alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
alb.ingress.kubernetes.io/success-codes: 200-300
alb.ingress.kubernetes.io/healthy-threshold-count: "2"
alb.ingress.kubernetes.io/unhealthy-threshold-count: "2"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]'
name: sentinel-ingress-controller
namespace: realm1-dev
spec:
rules:
- host: realm1.dev.sentinel.mysite.io
http:
paths:
- path: /
pathType: Prefix
backend:
servicePort: use-annotation
serviceName: sentinel
我还使用外部 dns 创建一个 route53 reecodset,然后我使用相同配置的 DNS 将请求路由到特定的 eks 服务,这种方法有什么问题吗?
不幸的是,用于您的用例的工具是错误的。 AWS Load Balancer Controller 将为每个入口资源创建一个新的负载均衡器,我认为,它为每个服务资源创建一个网络负载均衡器。
对于您的用例,最好的选择是使用 nginx 入口控制器。您可以在任何 1 命名空间中部署 nginx 入口控制器,然后在整个集群中创建入口资源,并且您可以在集群中拥有基于 path/hostname 的路由。
如果你有很多 teams/projects/applications 并且你想避免所有应用程序都依赖于 1 个 ELB 的单点故障,你可以在你的 k8s 集群中部署超过 1 个 nginx 入口控制器。
您只需在 nginx 入口控制器部署中定义一个 ingress-class 变量,并在您的应用程序中添加该 ingress-class 注释。这样,具有 ingress-class:nginxA 注释的应用程序将与在其部署中具有 ingress-class=nginxA 的 nginx 入口控制器集群。
我只用一个 ALB 就可以让它工作,
@YYashwanth,使用 Nginx 是我的后备计划,我试图使配置尽可能简单,也许将来当我们尝试在其他云提供商中部署我们的解决方案时,我们将使用 nginx 入口控制器。
1-启动服务类型应该是node端口,使用loadbalancer会创建一个经典的LB。
apiVersion: v1
kind: Service
metadata:
name: sentinel-srv
annotations:
external-dns.alpha.kubernetes.io/hostname: operatorv2.dev.sentinel.mysite.io
namespace: operatorv2-dev
labels:
run: jsflow-sentinel
spec:
ports:
- port: 80
targetPort: 80
name: ps1
protocol: TCP
selector:
app: sentinel-app
type: NodePort
2- 其次我们需要配置 group.name
,入口控制器使用注释 alb.ingress.kubernetes.io/group.name
合并所有入口配置
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/healthcheck-interval-seconds: "15"
alb.ingress.kubernetes.io/healthcheck-path: /
alb.ingress.kubernetes.io/healthcheck-port: traffic-port
alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
alb.ingress.kubernetes.io/healthy-threshold-count: "2"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80} ]'
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/success-codes: "200"
alb.ingress.kubernetes.io/tags: createdBy=aws-controller
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/unhealthy-threshold-count: "2"
external-dns.alpha.kubernetes.io/hostname: operatorv2.sentinel.mysite.io
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/group.name: sentinel-group
name: dev-operatorv2-sentinel-ingress-controller
namespace: operatorv2-dev
spec:
rules:
- host: operatorv2.dev.sentinel.mysite.io
http:
paths:
- path: /*
backend:
servicePort: 80
serviceName: sentinel-srv
我正在尝试在 aws EKS 中跨多个命名空间配置单个 ALB,每个命名空间都有自己的入口资源。
我正在尝试在 k8s v1.20 上配置入口控制器 aws-loadbalancer-controller
。
我面临的问题是,每次我尝试部署新服务时,除了在入口配置中指定的共享 ALB 之外,它总是启动一个新的经典负载均衡器。
https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/
# service-realm1-dev.yaml:
apiVersion: v1
kind: Service
metadata:
name: sentinel
annotations:
external-dns.alpha.kubernetes.io/hostname: realm1.dev.sentinel.mysite.io
namespace: realm1-dev
labels:
run: sentinel
spec:
ports:
- port: 5001
name: ps1
protocol: TCP
selector:
app: sentinel
type: LoadBalancer
# ingress realm1-app
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/group.name: sentinel-ingress
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
alb.ingress.kubernetes.io/healthcheck-port: traffic-port
alb.ingress.kubernetes.io/healthcheck-interval-seconds: "15"
alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
alb.ingress.kubernetes.io/success-codes: 200-300
alb.ingress.kubernetes.io/healthy-threshold-count: "2"
alb.ingress.kubernetes.io/unhealthy-threshold-count: "2"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP":80}]'
name: sentinel-ingress-controller
namespace: realm1-dev
spec:
rules:
- host: realm1.dev.sentinel.mysite.io
http:
paths:
- path: /
pathType: Prefix
backend:
servicePort: use-annotation
serviceName: sentinel
我还使用外部 dns 创建一个 route53 reecodset,然后我使用相同配置的 DNS 将请求路由到特定的 eks 服务,这种方法有什么问题吗?
不幸的是,用于您的用例的工具是错误的。 AWS Load Balancer Controller 将为每个入口资源创建一个新的负载均衡器,我认为,它为每个服务资源创建一个网络负载均衡器。
对于您的用例,最好的选择是使用 nginx 入口控制器。您可以在任何 1 命名空间中部署 nginx 入口控制器,然后在整个集群中创建入口资源,并且您可以在集群中拥有基于 path/hostname 的路由。
如果你有很多 teams/projects/applications 并且你想避免所有应用程序都依赖于 1 个 ELB 的单点故障,你可以在你的 k8s 集群中部署超过 1 个 nginx 入口控制器。
您只需在 nginx 入口控制器部署中定义一个 ingress-class 变量,并在您的应用程序中添加该 ingress-class 注释。这样,具有 ingress-class:nginxA 注释的应用程序将与在其部署中具有 ingress-class=nginxA 的 nginx 入口控制器集群。
我只用一个 ALB 就可以让它工作, @YYashwanth,使用 Nginx 是我的后备计划,我试图使配置尽可能简单,也许将来当我们尝试在其他云提供商中部署我们的解决方案时,我们将使用 nginx 入口控制器。
1-启动服务类型应该是node端口,使用loadbalancer会创建一个经典的LB。
apiVersion: v1
kind: Service
metadata:
name: sentinel-srv
annotations:
external-dns.alpha.kubernetes.io/hostname: operatorv2.dev.sentinel.mysite.io
namespace: operatorv2-dev
labels:
run: jsflow-sentinel
spec:
ports:
- port: 80
targetPort: 80
name: ps1
protocol: TCP
selector:
app: sentinel-app
type: NodePort
2- 其次我们需要配置 group.name
,入口控制器使用注释 alb.ingress.kubernetes.io/group.name
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/healthcheck-interval-seconds: "15"
alb.ingress.kubernetes.io/healthcheck-path: /
alb.ingress.kubernetes.io/healthcheck-port: traffic-port
alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
alb.ingress.kubernetes.io/healthy-threshold-count: "2"
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80} ]'
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/success-codes: "200"
alb.ingress.kubernetes.io/tags: createdBy=aws-controller
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/unhealthy-threshold-count: "2"
external-dns.alpha.kubernetes.io/hostname: operatorv2.sentinel.mysite.io
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/group.name: sentinel-group
name: dev-operatorv2-sentinel-ingress-controller
namespace: operatorv2-dev
spec:
rules:
- host: operatorv2.dev.sentinel.mysite.io
http:
paths:
- path: /*
backend:
servicePort: 80
serviceName: sentinel-srv