对不起,如果我的术语不够完善,我现在正在学习Kubernetes。
我在一系列AWS实例上有一个自我管理的Kubernetes集群,其中有一个主节点和五个工作节点。所有节点都在运行Ubuntu 18.04。这些节点都在VPC上,我使用堡垒主机将其插入。暂时,我还为所有节点提供了外部IP,以简化测试。我还有一个域,我们称它为xxx.example.org,它指向主节点的当前外部IP。
我使用Kubespray设置Kubernetes,然后继续安装Istio(使用istioctl)并根据官方文档here和here设置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/headers
或xxx.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 documentation和this 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上也无法加载任何内容。
答案 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文章中的示例进行操作。
希望有帮助。