课程实录 | 从 0 搭建高可用 Wordpress 博客(上)

语言: CN / TW / HK

原文作者:陶辉

原文链接:课程实录 | 从 0 搭建高可用 Wordpress 博客(上)

转载来源:NGINX 开源社区


编者按——本文为系列课程《在 K8s 中用好 NGINX 》的第一节《从 0 搭建高可用 WordPress 博客》的课程实录。由于文章较长,将分为上下两篇发布,点击这里收看课程回放。

在本节课程中,陶辉老师首先基于环境搭建,讲解如何从 0 搭建高可用 Wordpress 博客,然后展开讲述存储、网络部分课程概述了作者对 K8s 的理解、虚拟化技术与容器的差别,也帮助您快速了解 K8s 的架构、重要组件以及教学中所用例子的最终架构。

课程背景简介

本文将分享如何在 K8s 中用好 NGINX。K8s 目前是一个特别火的话题,无论是 Server List、还是 FAS 都是要基于 K8s 来构建。一些基础实力不是很强的非互联网公司,他们也有能力去管理几万个节点共同完成一些任务,很多时候都归功于 K8s。

在开始之前,我们需要基于环境来讲解 NGINX ,因为 K8s 太灵活了, NGINX Ingress、Load Balance 等等用法太多,必须要不断的调整并通过实操进行学习。

第一步,通过一个案例来讲解如何从 0 搭建高可用 Wordpress 博客。Wordpress 是用 PHP 语言编写,和 MySql 数据库连通,可以定制化搭建各种类型网站的博客。环境搭建完成后就可以开始研究网络以及存储的整个架构。

托管:从 IaaS 到 PaaS

 

在演示之前分享一下我对 K8s 的理解。由于这是一个比较新的技术,很多概念和版本都在变更中,所以会基于我的理解为大家讲解,未必会适用于未来。

比如我刚工作的时候还没有公有云,如果你在大厂可能会有自己的 IDC 机房,但如果你是在一个小公司很多时候服务器是放在运营商的机房里,所以需要从头搭建——操作系统需要自己安装,存储、网络、甚至包括长时间不间断的 UPS 电源等等,这些设备都需要自己搭建,特别是以前运维和开发分工不明、新应用上线时更加麻烦,准备时长也很长。

后来有了公有云,其以前的名称叫 IaaS,本次演示也将基于 IaaS 上。那么 K8s 和 IaaS 的差别在哪里呢?做 IaaS 的时候我们需要理解操作系统,例如在 Windows 2000 或是在 Linux Server 上操作是不一样的,甚至 Linux 里的 CentOS 和 Ubuntu 也有略微的差别。

本次讲解将会基于 CentOS 和 Ubuntu 搭建 K8s 系统。如果分布式系统里宕掉一个机器还需要容灾,要监控机器之间的流量,比如针对公网的出入流量、内网之间的 CPU、还有磁盘、RO 等等。

接下来着重介绍 PaaS,以前公有云的 PaaS 是非常不落地的,它本质上是希望开发只需要提交代码和数据就可以了。至于服务上如何调度、运维并演化成进程以及进程如何切换都由 PaaS 平台自主完成,然而以前的 PaaS 平台做不到这些, K8s 却可以完成。

 

前端经常会讲的 ServerLess/FaaS,这些 function as a service 只是一些概念,本次讲解不做展开分析。

 

包括云原生也是同样的道理,我们希望开发只关注核心的东西,并不需要分散精力去处理运维工作,不像在用 IaaS 的时候每个公司都要有运维。

在未来云原生的趋势下,公司将不再需要运维,因为我们可以把运维的工作交给云厂商,这也是为什么这些公有云特别积极的在推 K8s 。

虚拟化技术与容器的差别

 

容器和之前的虚拟化技术有什么差别呢?比如演示需要用的腾讯云 CentOS 7.i 系统,我们在这个虚拟机上面放了很多 K8s 系统。他们之间有什么差别呢?

其实我以前也是从事虚拟化技术的,在 2012 年加入阿里云的时候还在用英国剑桥大学的一个开源虚拟化系统 Xen 进行开发,当时底层用的 Linux,基于 Xen 这一层,上面可以有 Windows、Linux 等各种不同版本的虚拟化操作系统。

在 2013 年时,阿里云从 Xen 切到了 KVM,因为当时认为 KVM 性能提升了很多,但和今天的容器相比较还是天差地别的。

KVM 其实是一种很重的虚拟化,它上面和底层的操作系统之间会消耗很多的性能和内存。在虚拟化里,底层放 Linux 上层放 Windows,或者底层放 Linux 2.6 内核,上层放 Linux 4.9 内核都是可以的。

但容器不一样,其内核是共用的,这些容器之间只是通过名字空间隔离的技术,也就是 Linux 中的 C-Group 技术来把进程、网络,和磁盘给隔离开。

如果你用了 Docker 就会知道它只是做到了隔离,并不会占用其他资源。在宿主机上能看到所有 Docker 里面跑的 Apache、PHP 全都一目了然。所以它性能很高,只是简单隔离了一下网络和 CPU。其中 CPU 就是把时间片隔离了,可以设置只用 25% 的 CPU、单颗CPU等等,并且隔离网络。以上就是 KVM 和容器两者之间的差别。

然而这个名字空间隔离是极其有限的,比如如果在某个虚拟机里改系统时间,物理机的系统时间是不受影响的。而容器就不行了,由于系统时间只有一个,修改一个容器之后所有的容器都会被改掉。

所以名字空间隔离技术其实是很轻且很有限的,像是进程、存储、网络、系统时间等等这些是没有办法进行隔离的。

了解 K8s 架构

 

在演示部署之前,需要先了解 K8s 架构里面有哪些东西。大部分人在学习 K8s 的时候,可能公司运维已经做好了搭建,所以对架构怎么部署并不用关注。

但在今天的讲解中,由于我需要经常调整 K8s 的网络去演示 NGINX 和 K8s 之间的关系,所以必须从头开始搭建。

K8s 的架构核心是在每一个服务器上,比如目前我们做搭建的两台服务器,它们都被部署了 Kubelet。 会负责管理容器,所以不能在容器内运行,这需要先安装 Kubelet。当部署 Kubelet 后就可以管理每台 Linux 上的容器了,比如 Docker 也是一种容器。

如果不用 Docker 也没关系,曾有新闻报道表示容器运行时不支持 Docker 了,这其实是一个误读。比如我们看图中的红线,这代表着操作系统通过驱动去使用硬件。

操作系统和 Container Runtime (容器运行时)中间的黄线是 OCI(Open Container Initiative)它包含了容器镜像的标准,也就是当我们 pull 一个镜像的时候所需的所有规则,以及容器运行起来的时候怎样去启动进程等等,这两个接口标准都放在 OCI里。OCI 是很多公司包括 Docker 所使用的一种规范。而 Docker 更多只适合单机运行,它的集群非常不好用。

后来 K8s 发展的特别好,因为它的定位从一开始就不是为单机交付进行服务的。K8s 核心的关键是在于 Controller Manager 和 Scheduler,并且使用一种声明式的语言编排。

比如我会先定义清楚前面有 3 个 PHP 的 Wordpress,后面有一个 MySql 是组倍的或是一组多倍的,前面有几个 Load Balance,中间是读写分离或是别的等等,这些东西先定义清楚并且写在 yaml 文件中,然后提交给 K8s 由它自己来帮我维护。这就是 k8s 的切入点,是我们能维护上万台节点的关键所在。

而 Docker Swam 的切入点就差很多了并且很不灵活,所以 K8s 自己设计了一套容器运行时接口(container runtime interface)。

上图中黄色的线是很多厂商共同定制的 OCI 标准,绿色的线是 K8s 自己的 CI。对 K8s 来说,无论是否适用于 OCI ,只要能支持这条绿色的 CI 接口,就能知道怎么去拉镜像、起容器、怎么去管理了。所以核心在于把 kubelet 安装上,其他东西自然就受支持了。


更多资源

想要更及时全面地获取 NGINX 相关的技术干货、互动问答、系列课程、活动资源?

请前往 NGINX 开源社区: