裸露的金属kubernetes集群暴露在互联网上



我正试图在裸机专用服务器上建立自己的单节点kubernetes集群。我在开发操作方面没有那么丰富的经验,但我需要为自己的项目部署一些服务。我已经在LXD上用jujuconjure-up kubernetes进行了集群设置。我的集群运行得很好。

$ juju status
Model                         Controller                Cloud/Region         Version  SLA          Timestamp
conjure-canonical-kubern-3b3  conjure-up-localhost-db9  localhost/localhost  2.4.3    unsupported  23:49:09Z
App                    Version  Status  Scale  Charm                  Store       Rev  OS      Notes
easyrsa                3.0.1    active      1  easyrsa                jujucharms  195  ubuntu
etcd                   3.2.10   active      3  etcd                   jujucharms  338  ubuntu
flannel                0.10.0   active      2  flannel                jujucharms  351  ubuntu
kubeapi-load-balancer  1.14.0   active      1  kubeapi-load-balancer  jujucharms  525  ubuntu  exposed
kubernetes-master      1.13.1   active      1  kubernetes-master      jujucharms  542  ubuntu
kubernetes-worker      1.13.1   active      1  kubernetes-worker      jujucharms  398  ubuntu  exposed
Unit                      Workload  Agent  Machine  Public address  Ports           Message
easyrsa/0*                active    idle   0        10.213.117.66                   Certificate Authority connected.
etcd/0*                   active    idle   1        10.213.117.171  2379/tcp        Healthy with 3 known peers
etcd/1                    active    idle   2        10.213.117.10   2379/tcp        Healthy with 3 known peers
etcd/2                    active    idle   3        10.213.117.238  2379/tcp        Healthy with 3 known peers
kubeapi-load-balancer/0*  active    idle   4        10.213.117.123  443/tcp         Loadbalancer ready.
kubernetes-master/0*      active    idle   5        10.213.117.172  6443/tcp        Kubernetes master running.
flannel/1*              active    idle            10.213.117.172                  Flannel subnet 10.1.83.1/24
kubernetes-worker/0*      active    idle   7        10.213.117.136  80/tcp,443/tcp  Kubernetes worker running.
flannel/4               active    idle            10.213.117.136                  Flannel subnet 10.1.27.1/24
Entity  Meter status  Message
model   amber         user verification pending
Machine  State    DNS             Inst id        Series  AZ  Message
0        started  10.213.117.66   juju-b03445-0  bionic      Running
1        started  10.213.117.171  juju-b03445-1  bionic      Running
2        started  10.213.117.10   juju-b03445-2  bionic      Running
3        started  10.213.117.238  juju-b03445-3  bionic      Running
4        started  10.213.117.123  juju-b03445-4  bionic      Running
5        started  10.213.117.172  juju-b03445-5  bionic      Running
7        started  10.213.117.136  juju-b03445-7  bionic      Running

我还部署了Hello-world应用程序,以便在pod内的端口8080nginx-ingress上输出一些Hello,以便它将流量重新路由到指定主机上的此服务。

NAME                               READY   STATUS    RESTARTS   AGE
pod/hello-world-696b6b59bd-fznwr   1/1     Running   1          176m
NAME                      TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/example-service   NodePort    10.152.183.53   <none>        8080:30450/TCP   176m
service/kubernetes        ClusterIP   10.152.183.1    <none>        443/TCP          10h
NAME                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hello-world   1/1     1            1           176m
NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/hello-world-696b6b59bd   1         1         1       176m

当我按预期执行curl localhost时,我得到了connection refused,它看起来仍然很好,因为它没有暴露在集群中。当我在端口30450上用公共地址10.213.117.136卷曲kubernetes-worker/0时(我从kubectl get all获得)

$ curl 10.213.117.136:30450
Hello Kubernetes!

一切都像一种魅力(这是显而易见的)。当我做时

curl -H "Host: testhost.com" 10.213.117.136
Hello Kubernetes!

它再次发挥魅力!这意味着入口控制器基于host规则成功地将端口80路由到正确的服务。在这一点上,我100%确信集群可以正常工作。

现在我正在尝试通过外部互联网访问此服务。当我加载<server_ip>时,显然没有加载任何内容,因为它位于自己的lxd子网中。因此,我考虑将服务器eth0的端口80转发到此IP。所以我把这个规则添加到iptables

sudo iptables -t nat -A PREROUTING -p tcp -j DNAT --to-destination 10.213.117.136(为了示例起见,让我们路由所有东西,而不仅仅是端口80)。现在,当我在电脑上打开http://<server_ip>时,它会加载!

所以真正的问题是如何在生产中做到这一点?我应该在iptables中设置此转发规则吗?这是一种正常的方法还是一种巧妙的解决方案,而我却缺少一些"标准"?问题是在静态worker节点中添加此规则将使集群完全静态。IP最终更改,我可以删除/添加单元到工人,它将停止工作。我正在考虑写一个脚本,从juju获得这个IP地址,如下所示:

$ juju status kubernetes-worker/0 --format=json | jq '.machines["7"]."dns-name"'
"10.213.117.136"

并将其添加到IP表中,这是比硬编码IP更合适的解决方案,但我仍然觉得这很棘手,必须有更好的方法。

作为最后一个想法,我可以在集群之外直接在机器上运行HAProxy,并将流量转发给所有可用的工作人员。这最终也可能奏效。但我仍然不知道correct解决方案是什么,在这种情况下通常使用什么。非常感谢。

所以真正的问题是如何在生产中做到这一点?

在生产系统中执行此操作的正常方法是使用服务。

最简单的情况是,您只希望您的应用程序可以在节点上从外部访问。在这种情况下,您可以使用类型NodePort服务。这将创建将流量从主机IP地址转发到提供服务的pod所需的iptables规则。

如果您只有一个节点(这在生产中是不推荐的!),那么此时您已经准备好了。

如果您的Kubernetes集群中有多个节点,那么所有节点都将由Kubernete配置为提供对服务的访问(您的客户端可以使用其中任何一个节点来访问服务)。不过,您必须解决客户端如何知道哪些节点可以联系的问题。。。

有几种方法可以处理此问题:

  • 使用客户端理解的协议来发布当前可用的IP地址(例如DNS)、

  • 使用由Kubernetes节点上的一些软件管理的浮动(故障转移、虚拟、HA)IP地址(例如起搏器/corosync),并将客户端引导到此地址

  • 使用单独配置的外部负载均衡器将流量转发到一些操作节点

  • 使用外部负载均衡器,由Kubernetes使用云提供商集成脚本(通过使用Type LoadBalancer Service)自动配置,将流量转发到一些操作节点。

相关内容

  • 没有找到相关文章

最新更新