提问者:小点点

使用minikube访问kubernetes集群之外的应用程序


我是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超文本传输协议://NodeIP: NodePort返回:

curl:(7)无法连接到NodeIP端口NodePORT:连接被拒绝


共2个答案

匿名用户

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

您不能仅仅通过在您的部署定义中指定不同的容器端口来使其侦听不同的端口,例如8080,如您的示例所示:

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配置为侦听哪个端口。仅此而已。这真的很简单。您将容器端口更改为8080,但在您的容器内部实际上没有任何东西侦听这样的端口。

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

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

匿名用户

在minikube中创建服务后,您可以使用以下命令将服务公开到minikubeVM(主机)的外部

Minikube服务SERVICE_NAME

参考:https://minikube.sigs.k8s.io/docs/reference/commands/service/