4

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

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

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

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

ingress 规则有一个 host app1.sub.domain.io,所以理论上 curl'ing app1.sub.domain.io 应该遵循:DNS -> Load Balancer -> Cluster -> Ingress Controller -> Pod

在我试图击中它的那一刻,app1.sub.domain.io它只是挂起。我试过没有服务,做外部名称服务并且不起作用。

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

参考链接: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
4

2 回答 2

0

*.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

于 2018-03-13T09:39:21.463 回答
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: / 

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

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

于 2018-03-13T16:46:27.650 回答