使用minikube访问kubernetes集群外的应用

时间:2020-03-04 17:15:22

标签: docker kubernetes minikube

我是kubernetes的新手,我正在尝试使用minikube学习它,而且在访问集群外的应用程序时遇到了问题。我创建了一个部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx

  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 8080

要访问它,我需要装饰性地或强制性地公开它。以命令式方式起作用:

kubectl expose deployment nginx-deployment --port 80 --type NodePort

当我以声明方式创建服务时,我总是会遇到拒绝连接错误

apiVersion: v1

kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type : NodePort
  ports:
  - port : 8080
    nodePort : 30018
    protocol : TCP
  selector:
    app: nginx

curl -k http://NodeIP:NodePort返回:

卷曲:(7)无法连接到节点IP端口NodePORT:连接 拒绝

2 个答案:

答案 0 :(得分:1)

按照@Ansil的建议,如果要在8080定义中引用此端口,则应将您的 nginx 配置为侦听端口Service。默认情况下,它在端口80上侦听。

仅通过在您的8080定义中指定不同的containerPort(如您的示例),就无法使其像Deployment一样在不同的端口上侦听:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx

  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 8080

通过附加到这样的Pod上,您可以轻松地自己进行验证:

kubectl exec -ti <nginx-pod-name> -- /bin/bash

一旦到达,请运行:

ss -ntlp

您应该看到您的 nginx 实际上在哪个端口上监听。

此外,您可以:

cat /etc/nginx/conf.d/default.conf

它还会告诉您 nginx 在哪个端口上进行监听。就这样。真的很简单。您将containerPort更改为8080,但是在您的容器中实际上没有任何内容在该端口上侦听。

您仍然可以将其公开为Service(无论是声明式还是命令式),但它不会更改任何内容,因为最终它指向容器上的错误端口,在该端口上没有任何侦听的内容,您将看到与此类似的消息:

curl: (7) Failed to connect to 10.1.2.3 port 30080: Connection refused

答案 1 :(得分:0)

在minikube中创建服务后,可以使用命令

将服务公开到minikube VM(主机)的外部。

minikube service SERVICE_NAME

引用:https://minikube.sigs.k8s.io/docs/reference/commands/service/

相关问题