在自我管理的Kubernetes上为Istio网关获取External-IP

时间:2020-05-11 05:21:31

标签: amazon-web-services networking kubernetes istio

对不起,如果我的术语不够完善,我现在正在学习Kubernetes。

我在一系列AWS实例上有一个自我管理的Kubernetes集群,其中有一个主节点和五个工作节点。所有节点都在运行Ubuntu 18.04。这些节点都在VPC上,我使用堡垒主机将其插入。暂时,我还为所有节点提供了外部IP,以简化测试。我还有一个域,我们称它为xxx.example.org,它指向主节点的当前外部IP。

我使用Kubespray设置Kubernetes,然后继续安装Istio(使用istioctl)并根据官方文档herehere设置Ingress Gateway

当我运行kubectl get svc -n istio-system istio-ingressgateway时,群集的外部IP始终为:

NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)                                                                                                                                      AGE
istio-ingressgateway   LoadBalancer   10.233.3.209   <pending>     15020:30051/TCP,80:32231/TCP,443:30399/TCP,15029:31406/TCP,15030:32078/TCP,15031:30050/TCP,15032:30204/TCP,31400:31912/TCP,15443:31071/TCP   3m1s

我可以使用IP:32231/headersxxx.example.org:32231/headers在浏览器中访问服务

我使用以下命令为Istio文档中引用的httpbin和Bookinfo项目配置了Gateway和VirtualService:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: httpbin-gateway
spec:
  selector:
    istio: ingressgateway # use Istio default gateway implementation
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: httpbin
spec:
  hosts:
  - "*"
  gateways:
  - httpbin-gateway
  http:
  - match:
    - uri:
        prefix: /status
    - uri:
        prefix: /delay
    - uri:
        prefix: /headers
    route:
    - destination:
        port:
          number: 8000
        host: httpbin
  - match:
    - uri:
        exact: /productpage
    - uri:
        prefix: /static
    - uri:
        exact: /login
    - uri:
        exact: /logout
    - uri:
        prefix: /api/v1/products
    route:
    - destination:
        host: productpage
        port:
          number: 9080
EOF

看到这是一个自我管理的群集,是否有任何方法可以获取该群集的外部IP?如果没有,我将如何修改当前配置,以便可以从xxx.example.org而不是xxx.example.org:32231访问页面?

编辑#1

我确实尝试通过遵循this documentationthis guide在AWS上设置NLB。不幸的是,这没有任何改变,EXTERNAL-IP仍然是<pending>。之后,我部署了一个新的入口网关,如下所示:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
  labels:
    app: istio-ingressgateway-2
    istio: ingressgateway-2
    operator.istio.io/component: IngressGateways
    operator.istio.io/managed: Reconcile
    operator.istio.io/version: 1.5.2
    release: istio
  name: istio-ingressgateway-2
  namespace: istio-system
spec:
  ports:
  - name: status-port
    nodePort: 30625
    port: 15020
    protocol: TCP
    targetPort: 15020
  - name: http2
    nodePort: 32491
    port: 80
    protocol: TCP
    targetPort: 80
  - name: https
    nodePort: 30466
    port: 443
    protocol: TCP
    targetPort: 443
  - name: kiali
    nodePort: 32034
    port: 15029
    protocol: TCP
    targetPort: 15029
  - name: prometheus
    nodePort: 30463
    port: 15030
    protocol: TCP
    targetPort: 15030
  - name: grafana
    nodePort: 31176
    port: 15031
    protocol: TCP
    targetPort: 15031
  - name: tracing
    nodePort: 32040
    port: 15032
    protocol: TCP
    targetPort: 15032
  - name: tcp
    nodePort: 32412
    port: 31400
    protocol: TCP
    targetPort: 31400
  - name: tls
    nodePort: 30411
    port: 15443
    protocol: TCP
    targetPort: 15443
  selector:
    app: istio-ingressgateway-2
    istio: ingressgateway-2
  type: LoadBalancer

我也将httpbin-gateway更改为使用ingressgateway-2。这样即使在端口32231上也无法加载任何内容。

1 个答案:

答案 0 :(得分:0)

可以通过在LoadBalancer服务清单中添加注释来解决此问题。

根据Amazon文档:

Amazon EKS通过类型LoadBalancer的Kubernetes服务,支持在Amazon EC2实例工作程序节点上运行的Pod的网络负载平衡器和经典负载平衡器。在AWS Fargate(Fargate)上运行的Pod不支持Classic Load Balancer和Network Load Balancer。对于Fargate入口,我们建议您在Amazon EKS(最低版本v1.1.4)上使用ALB Ingress Controller

负载均衡器的配置由添加到服务清单中的注释控制。默认情况下,经典负载均衡器用于LoadBalancer类型的服务。要改为使用网络负载平衡器,请将以下注释应用于您的服务:

service.beta.kubernetes.io/aws-load-balancer-type: nlb

有关指定负载均衡器的示例服务清单,请参见Kubernetes文档中的Type LoadBalancer。有关将网络负载平衡器与Kubernetes结合使用的更多信息,请参阅Kubernetes文档中的Network Load Balancer support on AWS

默认情况下,类型LoadBalancer的服务会创建面向公众的负载均衡器。要使用内部负载平衡器,请将以下注释应用于您的服务:

service.beta.kubernetes.io/aws-load-balancer-internal: "true"

对于内部负载均衡器,必须将Amazon EKS集群配置为在VPC中使用至少一个私有子网。 Kubernetes检查子网的路由表以识别它们是公共的还是私有的。公共子网使用Internet网关直接路由到Internet,而私有子网则没有。

要将这样的一个或多个注释添加到istio入口配置中,您可以按照this文章中的示例进行操作。

希望有帮助。