我对kubernetes ingress有疑问。
我想使用我的亚马逊帐户和/或私有云进行入口,并希望分配外部IP。
可以为服务分配外部IP: Services documentation - chapter external IP 但无法为Ingress找到办法:Ingress documentation。
我的问题直接针对Kubernetes团队。 西蒙在这个主题中提出了类似的问题:How to force SSL for Kubernetes Ingress on GKE 2 但是当我对私有云AWS感兴趣时,他询问了GKE。
提前谢谢。
[UPDATE]
大家发现我的问题可能已在this主题中得到解答。
实际上回答@anigosa放在那里是特定的GCloud。
他的解决方案在AWS云中也没有在私有云中工作。在我看来,原因是他使用type: LoadBalancer
(不能在私有云中使用)并使用仅适用于GCloud的loadBalancerIP property
(对于AWS它会导致错误:"失败为服务默认值/ nginx-ingress-svc创建负载均衡器:无法为AWS ELB指定LoadBalancerIP
&#34)。
答案 0 :(得分:0)
看看这个 issue,您似乎可以在您的服务上定义注释并将其映射到现有的 elastic ip。 类似的东西:
apiVersion: v1
kind: Service
metadata:
name: my-service
annotations:
service.beta.kubernetes.io/aws-load-balancer-eip-allocations: <>
spec:
type: LoadBalancer
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
请注意,这将为此服务创建 ELB,而不是入口。
由于入口只是一个处理许多其他服务请求的服务 (=ELB),因此应该可以对入口执行类似的操作,但我找不到任何相关文档。
答案 1 :(得分:0)
有两种主要方法可以做到这一点。一种是使用如 Omer 的回答中所示的静态 IP 注释(这是特定于云的,通常依赖于预先设置的外部 IP),另一种是使用入口控制器(通常与云无关)。
入口控制器将获取其服务的外部 IP,然后将其传递给您的入口,入口将使用该 IP 作为自己的 IP。
然后流量将通过控制器的服务进入集群,控制器将路由到您的入口。
以下是入口示例:
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: my-ingress
annotations:
kubernetes.io/ingress.class: my-ingress-class
spec:
tls:
- hosts:
- ssl.somehost.com
rules:
- host: ssl.somehost.com
http:
paths:
- backend:
serviceName: backend-service
servicePort: 8080
线
kubernetes.io/ingress.class: my-ingress-class
告诉集群我们只需要一个入口控制器来处理这个“类别”的入口流量——您可以在集群中有多个入口控制器,每个控制器都声明它们正在处理不同类别的入口流量,因此当您安装入口时控制器,您还需要声明您希望它处理哪个入口类。
警告:如果你没有在入口资源上声明入口类,集群中的所有入口控制器都会尝试将流量路由到入口
现在,如果您想要一个私有的外部 IP,您可以通过控制器来实现。对于 AWS 和 GCP,您可以通过向入口控制器的负载均衡器添加特定注释来告诉云提供商您想要一个内部 IP 的注释
对于 AWS:
service.beta.kubernetes.io/aws-load-balancer-type: "internal"
对于 GCP:
networking.gke.io/load-balancer-type: "Internal"
或( 您的入口将继承入口控制器的负载均衡器获取的 IPcloud.google.com/load-balancer-type: "Internal"
答案 2 :(得分:-1)
看起来这个问题很快就被其他用户问过了!
https://stackoverflow.com/a/40164860/1342445
引用@danigosa的答案,看起来你需要创建一个指向你的入口控制器的服务。