当前位置: 首页 > 知识库问答 >
问题:

Kubernetes外部服务入口规则

仉伟兆
2023-03-14

此问题与问题类似,但更多是围绕规则中可以配置的路径。

入口应该能够同时处理内部服务和外部服务。外部服务的URL应该类似于超文本传输协议://host_name: 80/es。当用户点击此url时,应该将其重定向到外部服务。

服务定义和入口规则的配置如下,但会导致404。我哪里做错了?

入口规则

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: external-service
  annotations:
    kubernetes.io/ingress.class: “nginx”
    nginx.ingress.kubernetes.io/ingress.class: “nginx”
    nginx.ingress.kubernetes.io/ssl-redirect: “false”
spec:
  rules:
  - host:
    http:
      paths:
      - backend:
          serviceName: external-ip
          servicePort: 80
        path: /es

服务和endpoint定义

apiVersion: v1
kind: Service
metadata:
  name: external-ip
spec:
  ports:
  - name: app
    port: 80
    protocol: TCP
    targetPort: 80
---
apiVersion: v1
kind: Endpoints
metadata:
  name: external-ip
subsets:
- addresses:
  - ip: <ip to external service>
  ports:
  - name: app
    port: 80
    protocol: TCP

当我尝试使用URL时,它会起作用http://host_name:80以及以下入口规则。请注意入口规则中路径的差异。

apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: external-service
      annotations:
        kubernetes.io/ingress.class: “nginx”
        nginx.ingress.kubernetes.io/ingress.class: “nginx”
        nginx.ingress.kubernetes.io/ssl-redirect: “false”
    spec:
      rules:
      - host:
        http:
          paths:
          - backend:
              serviceName: external-ip
              servicePort: 80
            path: /

共有1个答案

潘阳舒
2023-03-14

有一个服务可以回显我的请求:https://postman-echo.com/,以后会有用的。这是它的ip,它会模拟你的外部服务:

$ dig postman-echo.com +short
107.23.20.188

其工作原理如下:

$ curl 107.23.20.188/get | jq
{
  "args": {},
  "headers": {
    "x-forwarded-proto": "http",
    "x-forwarded-port": "80",
    "host": "107.23.20.188",
    "x-amzn-trace-id": "Root=1-5ebced9c-941e363cc28bf3529b8e7246",
    "user-agent": "curl/7.52.1",
    "accept": "*/*"
  },
  "url": "http://107.23.20.188/get"
}

因此,正如您所看到的,它向我发送了一个json,其中包含我发送给它的所有头,最重要的是,包含它接收的路径的url。

这是我使用的入口yaml:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: external-service
  annotations:
    #kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  rules:
  - host:
    http:
      paths:
      - backend:
          serviceName: external-ip
          servicePort: 80
        path: /es/(.*)

除了endpointIP之外,服务和endpoint定义与您的定义保持一致。这里我使用了107.23.20.188(邮递员回声IP)。

现在,让我们尝试通过nginx发送一些请求,但首先让我们检查什么是入口ip:

$ kubectl get ingress
NAME               HOSTS   ADDRESS         PORTS   AGE
external-service   *       192.168.39.96   80      20h

ip是192.168.39.96,是它的私有ip,因为我在minikube上运行它,但这不重要。

$ curl -s 192.168.39.96/es/get
{
  "args": {},
  "headers": {
    "x-forwarded-proto": "http",
    "x-forwarded-port": "80",
    "host": "192.168.39.96",
    "x-amzn-trace-id": "Root=1-5ebcf259-6331e8c709656623f1a94ed4",
    "x-request-id": "d1545d1e8764da3cf57abb143faac4fb",
    "x-forwarded-host": "192.168.39.96",
    "x-original-uri": "/es/get",
    "x-scheme": "http",
    "user-agent": "curl/7.52.1",
    "accept": "*/*"
  },
  "url": "http://192.168.39.96/get"
}

如您所见,我正在发送路径请求,echo服务器正在接收路径请求。

在写这个答案时我注意到的一件事是(也许只是复制粘贴错误,但是)您在注释"中的引用与"不同,这可能导致nginx没有按应有的方式处理注释。出于某种原因,当我复制粘贴您的yaml时,它正在工作,但在没有您的注释的情况下它确实如此,所以这可能是我之前没有注意到它的原因。

 类似资料:
  • 假设我有一个不在Kubernetes上托管的服务。我还在kubernetes集群上设置了入口控制器和证书管理器。 因为使用kubernetes入口来控制对服务的访问非常简单,所以我想要一个指向非kubernetes服务的kubernetes入口。 例如,我有一个托管在<代码>https://10.0.40.1:5678(需要ssl,但需要自签名证书),并希望访问服务。实例com。

  • kubernetes-dashboard的yaml文件如下所示:apiversion:networking.k8s.io/v1 kind:Ingress metadata:name:dashboard-Ingress namespace:kubernetes-dashboard spec:tls:-hosts:-dashboard.com secretname:kubernetes-dashboa

  • 我正在尝试在kubernetes上部署nginx,kubernetes版本是V1.5.2,我已经部署了3个副本的nginx,下面是YAML文件, 现在我要在节点的端口30062上公开它的端口80,为此我在下面创建了一个服务,

  • https://kubernetes.io/docs/concepts/services-networking/Ingress/中的入口示例显示,为了指定bancked入口,我们必须指定servicePort和serviceName,例如: 我希望创建具有随机端口的服务,并避免在入口定义中指定它们。有没有ServicePort的替代方案?也许使用服务中分配的端口名称或targetPort?

  • 我正在尝试在minikube(Windows-10)上部署简单的spring boot REST服务。下面是我的配置 Docker文件 docker image运行良好,我能够运行该应用程序。 部署 服务 我无法使用< code > service-IP:node port/Uri < br > http://127 . 0 . 0 . 1:30008/hello访问restendpoint ht

  • 我正在尝试用MiniKube在azure VM上从外部运行和访问Hello节点服务。 minikube启动--Driver=VirtualBox 已创建部署 kubectl创建部署hello-node--image=k8s.gcr.io/echoServer 公开部署 kubectl公开部署hello-node--type=loadbalancer--port=8080 假设kubectl get