在Digital Ocean'上显示端口80;s管理的Kubernetes没有负载平衡器

在Digital Ocean'上显示端口80;s管理的Kubernetes没有负载平衡器,kubernetes,digital-ocean,Kubernetes,Digital Ocean,我想公开Kubernetes Managed Digital Ocean(单节点)群集在端口80上的服务,而不使用Digital Ocean的负载平衡器。这可能吗?我该怎么做 这本质上是一个爱好项目(我从Kubernetes开始),只是想保持成本非常低 A可以做你想做的事。大概是这样的: kind: Service apiVersion: v1 metadata: name: my-service spec: type: NodePort selector: app: MyA

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

这本质上是一个爱好项目(我从Kubernetes开始),只是想保持成本非常低

A可以做你想做的事。大概是这样的:

kind: Service
apiVersion: v1
metadata:
  name: my-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
  - protocol: TCP
    nodePort: 80
    targetPort: 80
这会将传入流量从节点的端口80重定向到pod的端口80。在DNS中发布节点IP,即可设置


一般来说,像这样将服务公开给外部世界是一个非常非常糟糕的想法,因为将所有通信量传递给服务的单个节点都将接收到不平衡的负载,并且是一个单点故障。但是,这种考虑不适用于单节点集群,因此,有一点需要注意,即LoadBalancer和Ingress是实现所需功能的容错方法,NodePort最适合这种极端特殊的情况。

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

  • 默认情况下,您群集的DO防火墙没有80/443入站打开

    如果编辑自动创建的防火墙,则会修改规则。解决方案是创建一个单独的防火墙,也指向相同的Kubernetes工作节点:

  • (从仪表板获取
    CLUSTER\u UUID
    值,或从
    doctl kubernetes集群列表获取ID列

  • 使用主机网络创建。我已经包括了下面的配置,但是您也可以通过直接安装过程来完成
  • 编辑:上面链接中的舵手图表已被弃用,因此安装图表的正确方法是()如下:

    本回购协议添加和更新后

    # 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
    
    #EDIT: The New way to install in helm 3
    helm install myingress ingress-nginx/ingress-nginx -f myingress.values.yaml
    
    myingres.values.yml
    对于图表:

    ---
    控制器:
    种类:守护进程
    主机网络:对
    DNS策略:ClusterFirstWithHostNet
    守护程序:
    useHostPort:正确
    服务:
    类型:集群
    rbac:
    创建:true
    
  • 您应该能够通过任何工作节点IP访问:80和:443上的群集,它将流量路由到您的入口

  • 由于节点IP可以更改,请查看部署以管理指向工作节点的DNS条目(&D)。同样,使用helm图表并假设您的DNS域由DigitalOcean托管(尽管任何受支持的DNS提供商都可以工作):

  • mydns.values.yml
    用于图表:

    ---
    提供者:数码海洋
    数码海洋:
    #在以下位置创建API令牌:https://cloud.digitalocean.com/account/api/tokens
    #需要读+写
    apiToken:“数字海洋API\U令牌”
    域筛选器:
    #您希望外部dns能够编辑的域
    -example.com
    rbac:
    创建:true
    
  • 创建Kubernetes以将请求路由到现有Kubernetes服务:
  • ---
    apiVersion:extensions/v1beta1
    种类:入口
    元数据:
    名称:testing123入口
    注释:
    kubernetes.io/ingres.class:nginx
    规格:
    规则:
    -主机:testing123.example.com#您想要关联的域
    http:
    路径:
    -路径:/
    后端:
    服务名称:testing123服务#现有服务
    服务端口:8000#现有服务端口
    
  • 大约一分钟后,您应该会看到DNS记录出现并可解析:

  • (编辑:编辑自动创建的防火墙规则最终会被打破,改为添加一个单独的防火墙)。

    如果你对成本很敏感,那么为什么不能使用minikube,因为该应用程序仍然需要公开访问,比如个人网站或公文包的web应用程序。你包含的链接说minikube只允许你在“个人电脑上的虚拟机”中运行东西,这不足以实现这样的目标。谢谢你的回复和示例!我读到nodePort仅限于非标准端口(30000-32767)。在这种情况下是真的吗?你是对的,我没有正确地阅读文档。我建议的解决方案不起作用。以下是将端口
    80
    上的
    ingress controller服务
    公开给外部用户而不使用
    LoadBalancer
    的唯一方法吗?当我使用
    NodePort
    时,我必须使用
    Nginx
    Apache
    将80与NodePort(30000~32767)绑定。非常感谢!花了3天多的时间才找到这个好答案。
    helm安装myingres stable/nginx-ingres-f myingres.values.yml
    for helm3@ZitRo当K8s节点被自动替换时会发生什么情况?(例如:扩展/升级/故障等)。或者你是指自己在“裸”虚拟机上运行k8s吗?@rcoup我关于将浮动IP与DO k8s一起使用的建议(截至2020年12月1日)被证明是错误的。DO support的答案是:当节点被您/DO回收或集群升级时,浮动IP将不起作用。节点和替换它的节点之间没有关系,因此您分配的浮动IP只是认为它被分配到的节点已被删除,然后被分离。节点与替换节点之间缺乏这种关系是我们不建议在DOKS节点上使用浮动IP的原因,因为它们只是暂时“工作”。是否可以提供这些指令而不使用其他依赖项(如Helm)?
    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    
    # 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
    
    #EDIT: The New way to install in helm 3
    helm install myingress ingress-nginx/ingress-nginx -f myingress.values.yaml
    
    # 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
    
    $ 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