无法从 minikube 获取 ClusterIP 服务 url

Dmi*_*nov 10 kubernetes minikube

我已经根据下面的配置文件创建了 ClusterIP 服务,但是我似乎无法从 minikube 获取该服务的 URL

\n\n
k create -f service-cluster-definition.yaml\n\xe2\x9e\x9c minikube service myapp-frontend --url                                           \n  service default/myapp-frontend has no node port\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我尝试将 NodePort 添加到service-cluster-definition.yaml 的ports部分,它会抱怨错误,认为此类密钥已被弃用。

\n\n

我错过了什么或做错了什么?

\n\n

服务集群定义.yaml

\n\n
apiVersion: v1\nkind: Service\nmetadata:\n  name: myapp-frontend\nspec:\n  type: ClusterIP\n  ports:\n    - targetPort: 80\n      port: 80\n  selector:\n    app: myapp\n    type: etl\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

部署定义.yaml

\n\n
apiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: myapp-deployment\n  labels:\n    app: myapp\n    env: experiment\n    type: etl\nspec:\n  template:\n    metadata:\n      name: myapp-pod\n      labels:\n        app: myapp\n        env: experiment\n        type: etl\n    spec:\n      containers:\n        - name: nginx-container\n          image: nginx:1.7.1\n  replicas: 3\n  selector:\n    matchLabels:\n      type: etl\n
Run Code Online (Sandbox Code Playgroud)\n\n
\xe2\x9e\x9c k get pods --selector="app=myapp,type=etl" -o wide\nNAME                                READY   STATUS    RESTARTS   AGE   IP           NODE       NOMINATED NODE   READINESS GATES\nmyapp-deployment-59856c4487-2g9c7   1/1     Running   0          45m   172.17.0.9   minikube   <none>           <none>\nmyapp-deployment-59856c4487-mb28z   1/1     Running   0          45m   172.17.0.4   minikube   <none>           <none>\nmyapp-deployment-59856c4487-sqxqg   1/1     Running   0          45m   172.17.0.8   minikube   <none>           <none>\n\n\n(\xe2\x8e\x88 |minikube:default)\nProjects/experiments/kubernetes \n\xe2\x9e\x9c k version     \nClient Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.3", GitCommit:"06ad960bfd03b39c8310aaf92d1e7c12ce618213", GitTreeState:"clean", BuildDate:"2020-02-11T18:14:22Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"}\nServer Version: version.Info{Major:"1", Minor:"17", GitVersion:"v1.17.3", GitCommit:"06ad960bfd03b39c8310aaf92d1e7c12ce618213", GitTreeState:"clean", BuildDate:"2020-02-11T18:07:13Z", GoVersion:"go1.13.6", Compiler:"gc", Platform:"linux/amd64"}\n(\xe2\x8e\x88 |minikube:default)\n
Run Code Online (Sandbox Code Playgroud)\n

Wil*_*.F. 15

首先让我们从文档中明确一些概念:

\n\n
\n
    \n
  • ClusterIP:在群集内部 IP 上公开服务。\n 选择此值使得只能从群集内部访问该服务。

  • \n
  • NodePort:在静态端口(NodePort)上公开每个 Node\xe2\x80\x99s IP 上的服务。\n 您\xe2\x80\x99 将能够通过请求从集群 外部NodeIP:NodePort联系 NodePort 服务。

  • \n
\n
\n\n
\n\n

问题一:

\n\n
\n

我已经根据下面的配置文件创建了 ClusterIP 服务,但是我似乎无法从 minikube 获取该服务的 URL。

\n
\n\n
    \n
  • 由于 Minikube 是单个主机上的虚拟化环境,我们往往会忘记集群与主机是隔离的。如果您将服务设置为ClusterIP,Minikube 将不会给予外部访问。
  • \n
\n\n

问题2:

\n\n
\n

如果我尝试将 NodePort 添加到 service-cluster-definition.yamlports部分,它会抱怨错误,认为此类密钥已被弃用。

\n
\n\n
    \n
  • 也许你粘贴到了错误的位置。您应该将字段替换type: ClusterIPtype: NodePort。这是 yaml 的正确形式:
  • \n
\n\n
apiVersion: v1\nkind: Service\nmetadata:\n  name: myapp-frontend\nspec:\n  type: NodePort\n  ports:\n    - targetPort: 80\n      port: 80\n  selector:\n    app: myapp\n    type: etl\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

再生产:

\n\n
user@minikube:~$ kubectl apply -f deployment-definition.yaml \ndeployment.apps/myapp-deployment created\n\nuser@minikube:~$ kubectl get pods\nNAME                                READY   STATUS    RESTARTS   AGE\nmyapp-deployment-59856c4487-7dw6x   1/1     Running   0          5m11s\nmyapp-deployment-59856c4487-th7ff   1/1     Running   0          5m11s\nmyapp-deployment-59856c4487-zvm5f   1/1     Running   0          5m11s\n\nuser@minikube:~$ kubectl apply -f service-cluster-definition.yaml \nservice/myapp-frontend created\n\nuser@minikube:~$ kubectl get service myapp-frontend\nNAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE\nmyapp-frontend   NodePort    10.101.156.113   <none>        80:32420/TCP   3m43s\n\nuser@minikube:~$ minikube service list\n|-------------|----------------|-----------------------------|-----|\n|  NAMESPACE  |      NAME      |         TARGET PORT         | URL |\n|-------------|----------------|-----------------------------|-----|\n| default     | kubernetes     | No node port                |     |\n| default     | myapp-frontend | http://192.168.39.219:32420 |     |\n| kube-system | kube-dns       | No node port                |     |\n|-------------|----------------|-----------------------------|-----|\n\nuser@minikube:~$ minikube service myapp-frontend --url\nhttp://192.168.39.219:32420\n\nuser@minikube:~$ curl http://192.168.39.219:32420\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n...{{output suppressed}}...\n
Run Code Online (Sandbox Code Playgroud)\n\n
    \n
  • 如您所见,将服务设置为NodePortminikube 后,开始使用MinikubeIP:NodePort将连接路由到匹配的 pod 来为应用程序提供服务。\n\n
      \n
    • 请注意,默认情况下,节点端口将在 30000:32767 之间选择
    • \n
  • \n
\n\n

如果您有任何疑问,请在评论中告诉我。

\n