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

时间:2018-03-13 08:55:50

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

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

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

所以如果我说得对,那么所有在sub.domain.io上发生任何事情的流量都将落在集群内部,只需要路由所述流量。

以下是k8配置,它有一个吊舱,一个服务和一个入口。这些播客是健康且有效的,我相信该服务不是必需的,但是会希望其他播客通过内部DNS与之通话,因此它已被添加。

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

当我尝试点击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

2 个答案:

答案 0 :(得分: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 service的输出并描述ingress。

你有Ingress控制器吗? 流量应该是LB->入口控制器 - &gt; Ingress-&GT; Service ClusterIP-&gt;豆荚

答案 1 :(得分:-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