我有两个部署
部署 1
apiVersion: v1
kind: Service
metadata:
name: first-service
spec:
selector:
key: app1
ports:
- port: 81
targetPort: 5050
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: first-deployment
spec:
replicas: 1
selector:
matchLabels:
run: app1
template:
metadata:
labels:
run: app1
spec:
containers:
- name: ocr
image: ocr_app
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5050
部署2
apiVersion: v1
kind: Service
metadata:
name: second-service
spec:
selector:
key: app2
ports:
- port: 82
targetPort: 5000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: second-deployment
spec:
replicas: 1
selector:
matchLabels:
run: app2
template:
metadata:
labels:
run: app2
spec:
containers:
- name: ner
image: ner_app
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
在 minikube 上启用 ingress 后,我应用了 ingess
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: ingress
spec:
rules:
- host: demo.local
http:
paths:
- path: /ocr
backend:
serviceName: first-service
servicePort: 81
- path: /ner
backend:
serviceName: second-service
servicePort: 82
在我的主机文件中,我有
192.168.177.71 demo.local
其中
192.168.177.71
是我当前的 minikube ip然后我运行了这个命令
kubectl port-forward nginx-ingress-controller-6fc5bcc8c9-p6mvj 3000:80 --namespace kube-system
在控制台是输出
Forwarding from 127.0.0.1:3000 -> 80
Forwarding from [::1]:3000 -> 80
但是当我使用 postman 向
demo.local:3000/ocr
发出请求时,没有响应编辑:使用
minikube service first-service
给出这个输出PS D:\docker> minikube service first-service
|-----------|---------------|-------------|--------------|
| NAMESPACE | NAME | TARGET PORT | URL |
|-----------|---------------|-------------|--------------|
| default | first-service | | No node port |
|-----------|---------------|-------------|--------------|
* service default/first-service has no node port
最佳答案
@erotavlas 作为 Mafor 提供的答案可以帮助您解决问题,请接受他的回答。
我发布了可能对其他人有帮助的扩展答案。
此问题的根本原因是 selector/labels
。
在 first-service
中, spec.selector
被设置为 key: app1
,但是在部署中 spec.selector.matchLabels
被设置为 run: app1
。
要正常工作,您需要具有相同的选择器。因此,您需要将 service、spec.selector 更改为 run: app1
或将部署 spec.selector.matchLabels
更改为 key: app1
。 second-service
和 second-deployment
的情况相同。可以找到更多详细信息 here 。
我已经尝试基于 official docs 和您的 YAML 在 Minikube 上使用 Ingress。
此外,要在 Ingress
上使用 Minikube
,必须启用 Ingress addon
。
$ minikube addons list | grep ingress
- ingress: disabled
如果它被禁用,你必须启用它。
$ minikube addons enable ingress
✅ ingress was successfully enabled
targetPort:
是容器接受流量的端口/应用程序在 pod 内运行的端口port:
是抽象的 Service
端口,它可以是其他 pod 用来访问服务的任何端口。OP 使用自己的图像,其中应用程序在端口
5050
和 5000
上运行,对于本示例,我将在端口 8080
上使用 GCP hello world。标签/匹配标签已更改为在部署和服务中具有 sam 值。第一次服务
apiVersion: v1
kind: Service
metadata:
name: first-service
spec:
selector:
key: app1
ports:
- port: 81
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: first-deployment
spec:
replicas: 1
selector:
matchLabels:
key: app1
template:
metadata:
labels:
key: app1
spec:
containers:
- name: hello1
image: gcr.io/google-samples/hello-app:1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
service/first-service created
deployment.apps/first-deployment created
第二次服务
apiVersion: v1
kind: Service
metadata:
name: second-service
spec:
selector:
key: app2
ports:
- port: 82
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: second-deployment
spec:
replicas: 1
selector:
matchLabels:
key: app2
template:
metadata:
labels:
key: app2
spec:
containers:
- name: hello2
image: gcr.io/google-samples/hello-app:2.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
service/second-service created
deployment.apps/second-deployment created
它将服务打包为
ClusterIP
类型。如果需要,您可以使用 NodePort
但这不是必需的。应用入口
有问题提供的 Ingress 足以进行测试。
如 official docs 中所述。您应该将 minikube ip 添加到主机文件。
在 Ubuntu 操作系统中,它是
/etc/hosts
(需要使用 sudo 进行编辑)。在 Windows 操作系统中,请检查 this article对于我的集群(使用 GCE):
$ minikube ip
10.132.15.208
添加到
hosts
文件值:以下回复。
$ curl demo.local/ocr
Hello, world!
Version: 1.0.0
Hostname: first-deployment-85b75bf4f9-qlzrp
$ curl demo.local/ner
Hello, world!
Version: 2.0.0
Hostname: second-deployment-5b5bbb7f4-9sbqr
但是,Mafor 提供的带有
rewrite
的版本更加通用。此外,您还可以考虑在
LoadBalancer
上使用 Minikube
。更多信息可以在 Minikube docs 中找到。
关于kubernetes - 如何将入口暴露给我的本地机器? (windows 上的 minikube),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59994578/