如何在Kubernetes中暴露外部IP?

3

我想使用minikube来暴露我的kubernetes集群。

考虑我的树

.                                                                                                                                                                            
├── deployment.yaml                                                                                                                                                          
├── Dockerfile                                                                                                                                                               
├── server.js                                                                                                                                                                
└── service.yaml    

我在本地构建了Docker镜像,能够通过命令运行所有的Pod:

kubectl create -f deployment.yaml 
kubectl create -f service.yaml 

然而,当我运行

 $ kubectl get services                                                                                                                                        
NAME                      TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE                                                                                    
kubernetes                ClusterIP      10.96.0.1       <none>        443/TCP        2h
nodeapp                   LoadBalancer   10.110.106.83   <pending>     80:32711/TCP   9m

目前无法连接到集群的外部ip。尝试暴露一个pod,但外部ip仍然为none。为什么没有外部ip?

 $ cat deployment.yaml                                                                                                                                         
apiVersion: apps/v1                                                                                                                                                          
kind: Deployment
metadata:
  name: nodeapp
  labels:
    app: nodeapp
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nodeapp
  template:
    metadata:
      labels:
        app: nodeapp
    spec:
      containers:
      - name: hello-node
        image: hello-node:v2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3000

并且。
 cat service.yaml                                                                                                                                            
kind: Service                                                                                                                                                                
apiVersion: v1
metadata:
  name: nodeapp
spec:
  selector:
    app: nodeapp
  ports:
  - name: http 
    port: 80
    targetPort: 3000
    protocol: TCP
  type: LoadBalancer


$ cat server.js                                                                                                                                               
var http = require('http');                                                                                                                                                  

var handleRequest = function(request, response) {
  console.log('Received request for URL: ' + request.url);
  response.writeHead(200);
  response.end('Hello User');
};
var www = http.createServer(handleRequest);
3个回答

5
根据K8S文档此处的说明, type = LoadBalancer 可用于AWS、GCP和其他支持的云端,但不适用于Minikube。
在支持外部负载均衡器的云提供商上,将type字段设置为LoadBalancer将为您的服务提供一个负载均衡器。 如此处所述,将类型指定为NodePort,并在Minikube上的端口公开服务。 然后可以使用来自主机OS的url访问该服务。

minikube service nodeapp --url


很遗憾,“minikube”不像“Docker for Desktop”的kubernetes那样支持开箱即用。尽管后者在k8s更新方面不够快,但配置和使用起来要容易得多。 - demisx

3

使用 Metallb 项目https://github.com/google/metallb可以在 Minikube 中实现负载均衡器类型的服务。

这使您可以在 Minikube 中离线使用外部 IP,而不仅仅是云提供商。

祝好运!


1
很好知道这个。应该包含在官方K8S服务文档中。我投赞成票 :) - Praveen Sripati

0
如果你运行以下命令:
``` kubectl expose deployment nodeapp --type=NodePort ```
然后运行:
``` kubectl get services ```
它应该显示服务及其所公开的端口。
你可以使用以下命令获取你的Minikube IP:
``` curl $(minikube service nodeapp --url) ```

谢谢你的提示。curl命令有效,但我仍然无法看到暴露的IP地址。 - A.Dumas
type=LoadBalancer 用于云。 - Praveen Sripati
1
@PraveenSripati,实际上,您可以在云供应商之外自由使用 type: LoadBalancer。它将作为常规的 NodePort 运行,并具有完全相同的端点列表,但是它的 EXTERNAL-IP 将永远处于 <pending> 状态。 - Konstantin Vustin
1
@KonstantinVustin - 我同意,负载均衡器端口使用的是NodePort,它使用服务端口。但最好明确指出。这是我的建议。 - Praveen Sripati
如何使用此命令在命名空间中公开部署? kubectl expose deployment nodeapp --type=NodePort --namespace=test - Jananath Banuka
是的,那应该可以工作,或者也许把 --namespace=test 放到 nodeapp 之前。 - ajtrichards

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接