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

Accessing app outside kubernetes cluster with 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 returns :

curl: (7) Failed to connect to Node IP port NodePORT: Connection refused

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

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

minikube service SERVICE_NAME

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

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

您不能像 8080 那样简单地通过在您的 Deployment 定义中指定不同的 containerPort 来使其在不同的端口上侦听,如您的示例所示:

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