我正在使用kubespray在笔记本电脑上运行kubernetes集群。群集在7个VM上运行,并且VM的角色分布如下:
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 。
答案 0 :(得分:2)
默认情况下,Kubernetes无法将外部IP分配给LoadBalancer
服务。
这种服务类型需要基础架构支持,该支持可在GKE,AKS,EKS等云产品中使用。
在笔记本电脑中运行此群集时,请部署MetalLB负载均衡器以获取EXTERNAL-IP
答案 1 :(得分:2)
首先,由于LoadBalancer
服务是特定于Cloud Provider的,因此您无法使用k8来为您分配外部IP地址。我想,您可以将路由器的外部IP地址推送到该地址,但这并不容易。
要获得服务,您可以执行以下操作:
kubectl edit svc istio-ingressgateway -n istio-system
LoadBalancer
更改为ClusterIp
。您也可以执行NodePort
。实际上,您可以跳过此步骤,因为LoadBalancer
服务已经包含NodePort
和ClusterIp
。只是为了摆脱待审核状态。kubectl port-forward svc/istio-ingressgateway YOUR_LAPTOP_PORT:INGRESS_CLUSTER_IP_PORT -n istio-system
我不知道您要从本地主机访问哪个端口。说80,您可以这样做:
kubectl port-forward svc/istio-ingressgateway 8080:80 -n istio-system
现在,笔记本电脑的端口8080(localhost:8080)将映射到istio-ingressgateway
服务的端口80。
答案 2 :(得分:1)
按照Suresh的解释是不可能的。
但是,如果要从笔记本电脑访问,则可以在服务类型中使用: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
不需要为此创建一个入口。
您应该使用below中所述的端口(30000-32767):
如果将类型字段设置为NodePort,则Kubernetes控制平面会在--service-node-port-range标志指定的范围内分配端口(默认值:30000-32767)。