kubernetes 如何在localhost上为istio-ingressgateway分配IP?

4ngedf3f  于 2023-05-22  发布在  Kubernetes
关注(0)|答案(4)|浏览(136)

我正在使用kubespray在我的笔记本电脑上运行kubernetes集群。群集在7个虚拟机上运行,虚拟机的角色分布如下:

NAME    STATUS   ROLES    AGE     VERSION
k8s-1   Ready    master   2d22h   v1.16.2
k8s-2   Ready    master   2d22h   v1.16.2
k8s-3   Ready    master   2d22h   v1.16.2
k8s-4   Ready    master   2d22h   v1.16.2
k8s-5   Ready    <none>   2d22h   v1.16.2
k8s-6   Ready    <none>   2d22h   v1.16.2
k8s-7   Ready    <none>   2d22h   v1.16.2

我已经安装了https://istio.io/来构建微服务环境。
我有2个服务正在运行,喜欢从外部访问:

k get services
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
greeter-service   ClusterIP   10.233.50.109   <none>        3000/TCP   47h
helloweb          ClusterIP   10.233.8.207    <none>        3000/TCP   47h

和运行的吊舱:

NAMESPACE      NAME                                      READY   STATUS    RESTARTS   AGE     IP             NODE    NOMINATED NODE   READINESS GATES
default        greeter-service-v1-8d97f9bcd-2hf4x        2/2     Running   0          47h     10.233.69.7    k8s-6   <none>           <none>
default        greeter-service-v1-8d97f9bcd-gnsvp        2/2     Running   0          47h     10.233.65.3    k8s-2   <none>           <none>
default        greeter-service-v1-8d97f9bcd-lkt6p        2/2     Running   0          47h     10.233.68.9    k8s-7   <none>           <none>
default        helloweb-77c9476f6d-7f76v                 2/2     Running   0          47h     10.233.64.3    k8s-1   <none>           <none>
default        helloweb-77c9476f6d-pj494                 2/2     Running   0          47h     10.233.69.8    k8s-6   <none>           <none>
default        helloweb-77c9476f6d-tnqfb                 2/2     Running   0          47h     10.233.70.7    k8s-5   <none>           <none>

问题是,我无法从外部访问服务,因为我没有 EXTERNAL IP 地址(请记住,集群正在我的笔记本电脑上运行)。

k get svc istio-ingressgateway -n istio-system  
NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                                                                                      AGE
istio-ingressgateway   LoadBalancer   10.233.61.112   <pending>     15020:31311/TCP,80:30383/TCP,443:31494/TCP,15029:31383/TCP,15030:30784/TCP,15031:30322/TCP,15032:30823/TCP,15443:30401/TCP   47h

如您所见,列EXTERNAL-IP的值为<pending>
问题是,如何为istio-ingressgateway分配EXTERNAL-IP

mrzz3bfm

mrzz3bfm1#

首先,您不能让k8s为您分配外部IP地址,因为LoadBalancer服务是特定于云提供商的。你可以把你的路由器外部IP地址Map到它,我猜,但这并不是微不足道的。
要访问该服务,您可以执行以下操作:

  1. kubectl edit svc istio-ingressgateway -n istio-system
    1.将服务类型从LoadBalancer更改为ClusterIp。你也可以做NodePort。实际上,您可以跳过此步骤,因为LoadBalancer服务已经包含NodePortClusterIp。只是为了摆脱那个待定状态。
  2. kubectl port-forward svc/istio-ingressgateway YOUR_LAPTOP_PORT:INGRESS_CLUSTER_IP_PORT -n istio-system
    我不知道你想从本地主机访问哪个端口。比如说8080,你可以做到:
    kubectl port-forward svc/istio-ingressgateway 8080:80 -n istio-system
    现在,笔记本电脑的端口8080(localhost:8080)将Map到istio-ingressgateway服务的端口80。
oewdyzsn

oewdyzsn2#

默认情况下,Kubernetes无法为LoadBalancer服务分配外部IP。这种服务类型需要在云产品(如GKE、AKS、EKS等)中工作的基础设施支持。
当您在笔记本电脑中运行此集群时,部署MetalLB Load Balancer以获得EXTERNAL-IP

zxlwwiss

zxlwwiss3#

这是不可能的,正如苏雷什解释的那样。
但如果你想从笔记本电脑访问,你可以在你的服务类型中使用:NodePort,它允许您从集群外部进行访问。
你应该首先获取集群的IP,然后创建你的服务,如下所示:

apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  type: NodePort
  ports:
  - name: http
    protocol: TCP
    port: 3000
    targetPort: 3000
    nodePort: 30000

之后,您可以从笔记本电脑访问:http://* cluster-ip**:30000
没有必要为此创建入口。
您应该使用范围(30000-32767)内的端口,如下所示:
如果将type字段设置为NodePort,Kubernetes控制平面将从--service-node-port-range标志指定的范围内分配端口(默认值:30000-32767)。

67up9zun

67up9zun4#

如果你正在使用minikube,只需运行:

$ minikube tunnel
$ k get svc -n istio-system
NAME                   TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                                      AGE
istio-ingressgateway   LoadBalancer   10.111.187.167   127.0.0.1     15021:31949/TCP,80:32215/TCP,443:30585/TCP   9m48s

相关问题