Kubernetes具有挑战性。对此,没有任何争议。不仅在将容器部署到Kubernetes集群中有很多移动部件,而且在这一过程中可能会出现很多问题。更为复杂的是,部署Kubernetes集群可能是一件棘手的事情。
这就是Canonical的MicroK8等工具被开发出来的原因。有了这样的软件,部署Kubernetes集群的过程就不那么具有挑战性,你可以更加专注于加快向集群部署应用程序和服务的速度。
将应用程序和服务部署到Kubernetes集群的诸多因素之一就是访问它们。与Docker不同,当你将应用程序或服务部署到Kubernetes集群时,它不会自动用于你的网络。如果你所在的计算机是集群的一部分,那么当然可以访问该应用程序或服务,因为该计算机可以访问集群使用的子网。如果没有一些额外的技巧,该应用程序和服务在集群之外根本不可用。这意味着你必须手动使其可用。
再一次强调,很多活动部件。
笔者已经完成了在Rocky Linux上安装Microk8s,然后将节点连接到控制器的步骤。通过添加节点,可以创建应用程序和服务可以部署到的集群。
现在要做的是展示如何将第一个应用程序部署到集群,然后使该应用程序可以在集群之外访问。需要注意的一点是,将应用程序/服务部署到MicroK8s集群与任何其他Kubernetes发行版类似。最大的不同是,部署需要MicroK8s命令,而其他Kubernetes发行版则没有这个要求。
需要什么
为此,你只需要一个运行中的MicroK8s集群,该集群至少包含一个控制器和两个节点。这些可以部署到数据中心、测试网络或第三方云主机。只要节点连接到控制器,就可以开始了。
如果不确定节点是否已连接,请登录控制器并发出命令:
1 | microk8s kubectl get nodes |
你应该看到列出的控制器和所有连接的节点。如果没有,请确保再次执行连接节点的步骤。
使用MicroK8s部署第一个应用程序
登录MicroK8s控制器。对于本演示,我们将部署一个NGINX web服务器应用程序。我们将此部署命名为nginx-webserver,并使用正式的nginx容器镜像进行部署。此命令为:
microk8s kubectl create deployment nginx-webserver --image=nginx
该命令的输出应如下所示:
deployment.apps/nginx-webserver created
使用以下命令验证部署是否成功:
microk8s kubectl get pods
你应该在输出中看到类似的内容:
nginx-webserver-67f557b648-4mfc6 1/1 Running
第一个pod已部署到集群。什么是pod?Kubernetes pod是一个或多个容器的集合,是应用程序的最小单元。pod通常由多个集成容器组成,但也可以由单个容器组成。在上面的例子中,我们部署了一个带有单个容器(NGINX)的pod。
此时,NGINX应用程序正在运行,但无法访问。为了使其可访问,我们还必须部署一个服务。我们将在这里使用端口80上的类型“NodePort”公开nginx Web服务器部署。什么是NodePort?简单地说,NodePort是连接到集群的每个节点上的一个开放端口。Kubernetes将NodePort上的传入流量路由到部署的服务或应用程序。
要部署服务,命令如下所示:
microk8s kubectl expose deployment nginx-webserver --type="NodePort" --port80
命令的输出应如下所示:
service/webserver exposed
如果你试图访问端口80上正在运行的容器,例如http://192.168.1.45,你会发现它无法访问。有什么好处?好吧,Kubernetes将内部端口80映射到一个随机的内部端口。在我们访问正在运行的web服务器之前,我们必须找出它映射到了哪个端口。为此,发出命令:
microk8s kubectl get svc nginx-webserver
输出应该如下所示:
nginx-webserver NodePort 10.152.183.105 <none> 80:31508/TCP 3m11s
如你所见,Kubernetes已将内部端口80(NGINX使用的端口)映射到外部端口31508(Kubernete集群使用的端口)。因此,如果你将web浏览器指向192.168.1.45:1508,你应该会在浏览器中看到NGINX欢迎屏幕。
当然,你可以使用任何一个节点的IP地址。但是,如果使用控制器的IP地址,则不会显示NGINX站点。为什么?因为控制器将容器部署到节点,而不是自身。
这就是使用MicroK8s将第一个应用程序部署到Kubernetes集群的全部内容。