如何在Kubernetes中公开外部IP?

时间:2018-10-02 15:06:08

标签: kubernetes kubernetes-service

我想用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却没有。为什么没有外部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 个答案:

答案 0 :(得分:4)

根据K8S文档here。因此,type=LoadBalancer可以在AWS,GCP和其他受支持的云上使用,而不能在Minikube上使用。

  

在支持外部负载均衡器的云提供商上,将类型字段设置为LoadBalancer将为您的服务提供负载均衡器。

here的类型指定为NodePort,该服务将在Minikube的端口上公开。然后可以使用主机操作系统中的URL访问该服务。

  

minikube服务nodeapp --url

答案 1 :(得分:2)

使用metallb项目https://github.com/google/metallb

可以在minikube中实现负载平衡器类型的服务。

这使您不仅可以通过云提供商,还可以在minikube中离线使用外部ip。

祝你好运!

答案 2 :(得分:0)

如果运行以下命令:

kubectl expose deployment nodeapp --type=NodePort

然后运行:

kubectl get services

它应该向您显示服务及其公开的端口。

您可以使用以下方法获取Minikube IP:

curl $(minikube service nodeapp --url)