【问题标题】:How to assign a DNS name to an application in a local Kubernetes cluster?如何为本地 Kubernetes 集群中的应用程序分配 DNS 名称?
【发布时间】:2020-03-07 00:23:08
【问题描述】:

我有一个基于 MicroK8s 的本地 Kubernetes 集群,在 Ubuntu 18.04 机器上运行。

我想要实现的目标: 通常我希望将我的应用程序暴露给 DNS 名称并在本地对其进行测试。

我的设置:

我创建了以下测试部署

apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-app
  labels:
    app: hello-app
    tier: backend
    version: v1
spec:
  selector:
    matchLabels:
      app: hello-app
  replicas: 2
  template:
    metadata:
      labels:
        app: hello-app
    spec:
      containers:
      - name: hello-app
        image: localhost:5000/a-local-hello-image
        ports:
        - containerPort: 3000

我添加了以下服务描述符:

apiVersion: v1
kind: Service
metadata:
  name: hello-app
spec:
  selector:
    app: hello-app
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000

现在我想在http://hello.someurl.com:3000 看到我的应用可用。

问题:除了我当前的配置之外,我还需要设置什么才能将我的应用程序映射到本地 DNS 名称?

注意:我已经阅读了the documentation,很遗憾没有帮助。我也在我的集群上enabled DNS addon

我将不胜感激任何帮助,任何关于如何前进的方向。

【问题讨论】:

  • Ingress 可以胜任。
  • @suren 你能详细说明一下吗?我可以使用 Ingress 将我的应用程序映射到 http://localhost/hello1http://localhost/hello2,但是如何处理 DNS 名称?

标签: kubernetes dns microk8s


【解决方案1】:

实现你想要的最简单的方法是使用

kubectl port-forward service/hello-app 3000:3000

并将以下条目附加到/etc/hosts 文件

127.0.0.1 hello.someurl.com

然后您可以打开浏览器并转到http://hello.someurl.com:3000

【讨论】:

    【解决方案2】:

    您可以创建一个 Ingress 资源,如下所示:

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: ingress
    spec:
      tls:
      - secretName: tls 
      rules:
      - host: site1.domain.com
        http:
          paths:
          - path: /path1/
            backend:
              serviceName: service1
              servicePort: 80
          - path: /path2/
            backend:
              serviceName: service2
              servicePort: 8080
          - path: /
            backend:
              serviceName: service3
              servicePort: 80
      - host: site2.domain.com
        http:
          paths:
          - backend:
              serviceName: service1
              servicePort: 80
    

    要完成这项工作,您需要一个 Ingress Controller,如 Nginx、Traefik 等。

    一旦您获得了 Ingress Controller(如果您还没有)并创建了 Ingress 资源(上面的 yaml),您就可以根据主机和路径将请求转发到所需的服务。例如,如果我想将流量发送到service2,我会这样做:

    curl -H "site1.domain.com/path2/" INGRESS_IP:INGRESS_PORT。该请求将通过 Ingress Controller,并将数据包传递给 service2。如果您自己修改服务名称和端口,它应该可以正常工作。

    当然,你也可以把它放在/etc/hosts

    您可以在 1 个单一入口资源中设置任意数量的域和路径。

    【讨论】:

      猜你喜欢
      • 2020-07-16
      • 1970-01-01
      • 2019-11-30
      • 2018-06-23
      • 1970-01-01
      • 2015-11-29
      • 2018-10-10
      • 1970-01-01
      • 2018-07-12
      相关资源
      最近更新 更多