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

Jos*_*sch 7 digital-ocean kubernetes

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

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

rco*_*oup 10

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

  1. 集群的DO防火墙默认情况下没有打开80/443入站。

    如果您编辑自动创建的防火墙,规则最终将自行重置。解决方案是创建一个单独的防火墙,该防火墙也指向相同的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
Run Code Online (Sandbox Code Playgroud)

CLUSTER_UUID从仪表板或从中获取ID列的值doctl kubernetes cluster list

  1. 使用主机网络创建Nginx入口。我在下面包括了头盔图表配置,但是您也可以通过直接安装过程来完成。
$ helm install stable/nginx-ingress --name=myingress -f myingress.values.yml
Run Code Online (Sandbox Code Playgroud)

myingress.values.yml 对于图表:

---
controller:
  kind: DaemonSet
  hostNetwork: true
  dnsPolicy: ClusterFirstWithHostNet
  daemonset:
    useHostPort: true
  service:
    type: ClusterIP
rbac:
  create: true
Run Code Online (Sandbox Code Playgroud)
  1. 您应该能够通过任何辅助节点IP分别在:80和:443上访问群集,它将流量路由到您的入口。

  2. 由于节点IP可以并且确实会发生变化,因此请考虑部署外部DNS以管理指向您的工作节点的DNS条目。再次使用舵图并假设您的DNS域由DigitalOcean托管(尽管任何受支持的DNS提供商都可以使用):

$ helm install --name=mydns -f mydns.values.yml stable/external-dns
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)
  1. 创建一个Kubernetes 入口资源以将请求路由到现有的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
Run Code Online (Sandbox Code Playgroud)
  1. 一分钟左右后,您应该会看到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
Run Code Online (Sandbox Code Playgroud)

(编辑:编辑自动创建的防火墙规则最终会失败,请添加单独的防火墙)。

  • 非常感谢你做的这些!花了三天多的时间才找到这个很好的答案。 (2认同)
  • 我发现此配置导致 DNS 中的集群 IP 地址,而不是节点的可路由公共 IP。我通过更改“myingress.values.yml”来解决这个问题:将“controller.publishService.enabled”设置为“false”。不确定这是否是“正确”的做法,但它修复了 DNS。 (2认同)