我有两个部署

部署 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: app1second-servicesecond-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 使用自己的图像,其中应用程序在端口 50505000 上运行,对于本示例,我将在端口 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/

10-15 22:03