【问题标题】:Kubernetes host ingress with nested subdomains (GCP)具有嵌套子域 (GCP) 的 Kubernetes 主机入口
【发布时间】:2018-03-13 08:55:50
【问题描述】:

我正在尝试设置 K8s 部署,其中入口的控制器可以将服务定义为子域。即app1 可以在其入口配置中定义自己以从app1.sub.domain.io 获取流量。

我有一个 DNS A 记录 *.sub.domain.io 指向 Load Balancer。该负载均衡器指向集群的实例组。

所以,如果我是对的,所有流向 sub.domain.io 的任何流量都将落在集群内,只需要路由所述流量。

下面是 k8 配置,它有一个 pod、一个服务和一个入口。这些 pod 运行良好且正常工作,我相信该服务不是必需的,但希望其他 pod 通过内部 DNS 与其通信,因此已添加。

入口规则有一个主机app1.sub.domain.io,所以理论上,curl'ing app1.sub.domain.io 应该遵循: DNS -> 负载均衡器 -> 集群 -> 入口控制器 -> Pod

当我尝试点击app1.sub.domain.io 时,它只是挂起。我试过没有服务,做外部名称服务,但不起作用。

我不想继续使用 loadBalancer 入口的路线,因为这会产生一个需要手动应用于 DNS 记录的新外部 IP,或者使用等待服务外部 IP 并运行 GCP 的讨厌的 bash 脚本命令,我们不想为每个服务都这样做。

参考链接:https://kubernetes.io/docs/concepts/services-networking/ingress/#name-based-virtual-hosting

部署

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: app1
  namespace: default
  labels:
    app: app1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: app1
  template:
    metadata:
      labels:
        app: app1
    spec:
      containers:
      - image: xxxx:latest
        name: app1
        ports:
        - containerPort: 80
        env:
          - name: NODE_ENV
            value: production

服务

---
kind: Service
apiVersion: v1
metadata:
  name: app1
  labels:
    app: app1
spec:
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: app1
  type: ClusterIP

入口

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app1-ingress
  labels:
    app: app1
spec:
  rules:
  - host: app1.sub.domain.io
    http:
      paths:
      - backend:
          serviceName: app1
          servicePort: 80

如果您查询,一旦部署了所有内容 kubectl get pods,services,ingresses -l app=app1

NAME                       READY     STATUS    RESTARTS   AGE
po/app1-6d4b9d8c5-4gcz5    1/1       Running   0          20m
po/app1-6d4b9d8c5-m4kwq    1/1       Running   0          20m
po/app1-6d4b9d8c5-rpm9l    1/1       Running   0          20m

NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
svc/app1    ClusterIP   x.x.x.x         <none>        80/TCP    20m

NAME                HOSTS                   ADDRESS   PORTS     AGE
ing/app1-ingress    app1.sub.domain.io                80        20m

---------------------- 更新 -------- ---------------------------------------

目前正在这样做,并不理想。拥有分配给 DNS 记录的全局静态 IP。

---
kind: Service
apiVersion: v1
metadata:
  name: app1
  labels:
    app: app1
spec:
  type: NodePort
  selector:
    app: app1
  ports:
    - port: 80
      targetPort: 80

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app1-ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: app1-static-ip
  labels:
    app: app1-static-ip
spec:
  backend:
    serviceName: app1
    servicePort: 80

【问题讨论】:

  • 我认为您编辑中的解决方法解决方案。您想改进什么?
  • 您解决了这个问题吗?我们想在app.stg.xxx.com 设置一个暂存域。我们使用app-stg.xxx.com 作为解决方法,直到我们获得更多信息。

标签: dns kubernetes google-cloud-platform devops kubernetes-ingress


【解决方案1】:

*.sub.domain.io 应该指向 Ingress 的 IP。

您可以按照以下教程中的说明为 Ingress 使用静态 IP:https://cloud.google.com/kubernetes-engine/docs/tutorials/http-balancer#step_5_optional_configuring_a_static_ip_address

【讨论】:

  • 入口不是外部的,正如我所说的,我“可以”这样做,但是我每次都需要更新 DNS 记录,这不符合这一点。如果我添加另一个服务,这也会中断。因为我无法在 DNS *.sub.domain.io 中创建动态路由,所以它必须是 app1.sub.domain.io -> Ip of Ingress,这很糟糕。
  • 为什么不能创建*.sub.domain.io通配符A记录? ...为我工作。
【解决方案2】:

尝试为您的 Ingress 添加路径:

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: app1-ingress
  labels:
    app: app1
spec:
  rules:
  - host: app1.sub.domain.io
    http:
      paths:
      - backend:
          serviceName: app1
          servicePort: 80
        path: / 

如果这不起作用,请发布描述服务和描述入口的输出。

你有入口控制器吗? 流量应该走LB-> Ingress Controller-> Ingress-> Service ClusterIP-> Pods

【讨论】:

    猜你喜欢
    • 2019-02-08
    • 2021-05-31
    • 2019-08-03
    • 2020-06-23
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    相关资源
    最近更新 更多