kubernetes - 在没有负载均衡器的情况下在Digital Ocean的托管Kubernetes上暴露端口80

标签 kubernetes digital-ocean

我想在不使用Digital Ocean的负载平衡器的情况下在端口80上公开我的Kubernetes托管Digital Ocean(单节点)集群的服务。这可能吗?我该怎么做?

从本质上讲,这是一个业余项目(我从Kubernetes开始),只是想保持较低的成本。

最佳答案

您可以部署配置为使用主机网络和端口80/443的Ingress。

默认情况下,

  • DO用于您群集的防火墙没有打开80/443入站。
    如果您编辑自动创建的防火墙,则规则为will eventually reset themselves。解决方案是创建一个单独的防火墙,该防火墙也指向相同的Kubernetes工作节点:
  • $ doctl compute firewall create \
    --inbound-rules="protocol:tcp,ports:80,address:0.0.0.0/0,address:::/0 protocol:tcp,ports:443,address:0.0.0.0/0,address:::/0" \
    --tag-names=k8s:CLUSTER_UUID \
    --name=k8s-extra-mycluster
    
    (从仪表板获取CLUSTER_UUID值,或者从doctl kubernetes cluster list获取ID列)
  • 使用主机网络创建nginx ingress。我在下面包括了helm chart配置,但是您也可以通过直接安装过程来完成。
  • # For Helm 2
    $ helm install stable/nginx-ingress --name=myingress -f myingress.values.yml
    
    # For Helm 3
    $ helm install myingress stable/nginx-ingress -f myingress.values.yml
    
    图表的myingress.values.yml:
    ---
    controller:
      kind: DaemonSet
      hostNetwork: true
      dnsPolicy: ClusterFirstWithHostNet
      daemonset:
        useHostPort: true
      service:
        type: ClusterIP
    rbac:
      create: true
    
  • ,您应该可以通过任何辅助节点IP分别在:80和:443上访问集群,它将流量路由到您的入口。
  • 由于节点IP可以更改,因此请查看部署external-dns以管理指向您的工作节点的DNS条目。同样,使用 Helm chart 并假设您的DNS域由DigitalOcean托管(尽管任何受支持的DNS提供商都可以使用):
  • # For Helm 2
    $ helm install --name=mydns -f mydns.values.yml stable/external-dns
    
    # For Helm 3
    $ helm install mydns stable/external-dns -f mydns.values.yml
    
    图表的mydns.values.yml:
    ---
    provider: digitalocean
    digitalocean:
      # create the API token at https://cloud.digitalocean.com/account/api/tokens
      # needs read + write
      apiToken: "DIGITALOCEAN_API_TOKEN"
    domainFilters:
      # domains you want external-dns to be able to edit
      - example.com
    rbac:
      create: true
    
  • 创建一个Kubernetes Ingress resource以将请求路由到现有的Kubernetes服务:

  • ---
    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: testing123-ingress
      annotations:
        kubernetes.io/ingress.class: nginx
    spec:
      rules:
        - host: testing123.example.com             # the domain you want associated
          http:
            paths:
              - path: /
                backend:
                  serviceName: testing123-service  # existing service
                  servicePort: 8000                # existing service port
    

    大约一分钟后
  • ,您应该会看到DNS记录出现并且可以解决:
  • $ dig testing123.example.com             # should return worker IP address
    $ curl -v http://testing123.example.com  # should send the request through the Ingress to your backend service
    
    (编辑:编辑自动创建的防火墙规则最终会失败,请添加单独的防火墙)。

    关于kubernetes - 在没有负载均衡器的情况下在Digital Ocean的托管Kubernetes上暴露端口80,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54119399/

    相关文章:

    Kubernetes - 在预安装作业中使用 secret

    ruby-on-rails - 将多个 Rails 应用程序部署到 DigitalOcean

    python - Django 3、G Suite 的联系表 - 电子邮件发送错误

    digital-ocean - 如何在 Dokku 中更改域名主机名的默认应用程序

    docker - Kubernetes-覆盖量

    kubernetes - 是否有可能使kubernetes入口treafik适用于所有 namespace

    kubernetes - 禁用 Prometheus Community Helm Chart 中的默认仪表板

    kubernetes - 将Spinnaker部署到Spinnaker将管理的同一kubernetes集群是否安全/正确?

    node.js - 如何在 Digital Ocean 上为 Unity 设置 Socket.io 服务器?

    node.js - 为两个 Node 应用程序配置 nginx,一个在子域上