首页 文章

Kubernetes使用嵌套子域(GCP)进行入口

提问于
浏览
2

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

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

因此,如果我是对的,所有在sub.domain.io上发生任何事情的流量都将落在集群内部,只需要路由所述流量 .

以下是k8配置,它有一个吊舱,一个服务和一个入口 . 这些播客是 Health 且有效的,我相信该服务不是必需的,但是会希望其他播客通过内部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

Deployment

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

Service

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

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

一旦部署了所有内容,如果您查询 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

----------------------------------- Update -----------------------------------

目前这样做,并不理想 . 拥有分配给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

2 回答

  • 0

    尝试添加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: /
    

    如果这不起作用,请发布describe服务的输出并描述ingress .

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

  • -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

相关问题