向internet公开裸机kubernetes群集
我正在尝试在裸机专用服务器上设置自己的单节点kubernetes群集。我在开发操作方面没有那么丰富的经验,但我需要为我自己的项目部署一些服务。我已经用向internet公开裸机kubernetes群集,kubernetes,juju,bare-metal-server,Kubernetes,Juju,Bare Metal Server,我正在尝试在裸机专用服务器上设置自己的单节点kubernetes群集。我在开发操作方面没有那么丰富的经验,但我需要为我自己的项目部署一些服务。我已经用jujuju和在LXD上设置了一个集群。我跑得很好 $ juju status Model Controller Cloud/Region Version SLA Timestamp conjure-canonical-kubern-
jujuju
和在LXD
上设置了一个集群。我跑得很好
$ 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内的端口8080
上输出一些Hello,并nginx入口
,以便它将流量重新路由到指定主机上的此服务
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 -H "Host: testhost.com" 10.213.117.136
Hello Kubernetes!
它再次像魅力一样工作!这意味着入口控制器正在根据host
规则成功地将端口80路由到正确的服务。在这一点上,我100%确信集群能够正常工作
现在,我正在尝试通过internet外部访问此服务。当我加载
时,显然没有加载任何内容,因为它位于自己的lxd
子网中。因此,我考虑将端口80
从服务器eth0
转发到此IP。所以我在iptables中添加了这个规则
sudo iptables-t nat-A预路由-p tcp-j DNAT-到目的地10.213.117.136
(为了示例,让我们路由所有内容,而不仅仅是端口80)。现在,当我在我的计算机上打开http://
时,它会加载
所以真正的问题是如何在生产中做到这一点?我应该在iptables中设置此转发规则吗?这是正常的方法还是老套的解决方案,而我缺少一些“标准”吗?问题是将此规则添加到staticworker
节点将使集群完全静态。IP最终会改变,我可以删除/添加工作单元,它将停止工作。我正在考虑编写脚本,从juju
获取此IP地址,如下所示:
$ juju status kubernetes-worker/0 --format=json | jq '.machines["7"]."dns-name"'
"10.213.117.136"
并将其添加到IP表中,这是比硬编码IP更合适的解决方案,但我仍然觉得这是一个棘手的问题,必须有更好的方法
作为最后一个想法,我可以在集群之外直接在机器上运行HAProxy
,只需将流量转发给所有可用的工作者。这最终也可能奏效。但我仍然不知道答案是什么正确的解决方案以及在这种情况下通常使用什么。谢谢大家!
所以真正的问题是如何在生产中做到这一点
在生产系统中执行此操作的正常方法是使用
最简单的情况是,您只想从节点外部访问应用程序。在这种情况下,您可以使用服务。这将创建必要的iptables规则,以将流量从主机IP地址转发到提供服务的pod
如果您只有一个节点(这在生产环境中是不推荐的!),那么此时您已经准备好了
如果您的Kubernetes集群中有多个节点,那么Kubernetes将配置所有节点以提供对服务的访问(您的客户端可以使用它们中的任何一个来访问服务)。不过,您必须解决客户端如何知道哪些节点可以联系的问题
有几种方法可以处理此问题:
- 使用客户端理解的协议发布当前可用的IP地址(例如DNS)
- 使用由Kubernetes节点(例如pacemaker/corosync)上的某些软件管理的浮动(故障切换、虚拟、HA)IP地址,并将客户端指向该地址
- 使用单独配置的外部负载平衡器将流量转发到某些操作节点
- 使用Kubernetes使用云提供商集成脚本(通过使用服务)自动配置的外部负载平衡器,将流量转发到一些操作节点
太棒了!非常感谢。几天前我开始使用kubernetes,我只是不知道服务
也在维护iptables。最初我认为这是为了让其他pod可以访问pod(例如后端连接到不同pod上的db)。你的回答给了我一个更好的印象!(关于生产,我知道,但它仍然是开发的暂存实例,但暴露在internet上是可以访问的:)在生产中,它肯定会在多个节点上运行。谢谢
$ juju status kubernetes-worker/0 --format=json | jq '.machines["7"]."dns-name"'
"10.213.117.136"