点赞
评论
收藏
分享
举报
课程实录 | 从 0 搭建高可用 Wordpress 博客(下)
发表于2023-02-08 14:29

浏览 567

原文作者:陶辉
原文链接:课程实录 | 从 0 搭建高可用 Wordpress 博客(下)
转载来源:NGINX 开源社区

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

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

NGINX唯一中文官方社区 ,尽在 nginx.org.cn

了解 K8s 架构

还有一个比较关键的是 CNI(container network interface),因为跨主机的网络通讯是非常复杂的,而 CNI 是一个重要的接口。所有的厂商例如阿里云、AWS 等等都会有自己的 CNI 插件,能够支持不同的网络让里面的容器互相进行通讯。

Kubelet 装好以后,其他的东西都是放在一个或者多个节点上的。由于服务器数量有限,我会把四个服务全部放在一台叫做 Master 的机器上。这四个服务可以由 Kubelet 来管,然后我会把这四个进程都放成四个容器来跑,这样我们演示会比较方便。

这四个服务分别是干什么的呢?ETCD 是一个 key value 数据库,它使用的 ·raft 协议,是用 GO 语言写的性能较好。其实 Raft 协议至少要部署 3-5 个节点才算正常且可用性高,我们这里只是一个简单的演示。这里面所有编排的东西包括 NGINX Config 还有 yaml 文件、甚至公私钥等等其实都是放在 ETCD 里面的,它相当于一个可靠性比较高的数据库。

Controller manager 是一个容器编排系统,Scheduler 是调度系统,它控制了需要根据什么样的规则,把不同容器放在什么位置。API 既可以和我们的运维进行交互,也可以和 Kubelet 进行交互。

图中紫色的线是 Protobuf ,它是一种很高效的编码方式。比如一个整数如果比较小,我们可能需要两个字节,普通的 32 位指数我们用 4 个字节,68 位用 8 个字节。

但是用 Protobuf 可能针对 100 多、200 多位的整数,只需要一个或两个字节就可以编码了,如果是几百万或几千万位,才需要用 4 个字节进行编码,所以 Protobuf 是非常高效且性能很好的。浅绿色的线所代表的 gRPC 是用 HTTP/2 协议作为自描述协议,包体再用 Protobuf 进行编码的。深蓝色的线则表示了和运维之间支持 JSON 模式。

K8s 中的重要组件

接下来,我将讲解一下 K8s 的组件。 K8s 中有几个组件十分重要, Ingress 就是对外的负载均衡,service 是服务可以理解为一个路由系统或是四层的网关,它是对外一个 IP 地址,后面可以像 NGINX 的负载均衡一样导到很多 pod。

而重点在于 K8s 里面的 pod,pod 其实和服务器是一样的,可以理解为一个正常的主机节点但 pod 是虚拟化的。一个真实的物理机会跑很多很多的 pod,在演示过程中可以看到我只有两台机器,但上面运行了十几个 pod。我们可以把每个 pod 理解为一个物理机,在上面会运行很多的容器。

比如在我的 pod 上前面部署了一个 NGINX,后面部署了一个 PHP,这两个我正好放在一台机器上,因为它们本机是通过本地的管道来进行通讯的。举例来说,它们两个映射到同一个文件系统上,我们可以互相把 PHP 上的文件直接用 NGINX 读出来返回给用户等等,这就叫 pod。

其余的组件包括:Job 是一次性的任务、cronjob 是定时任务、container 是跑在 pod 里面的容器。Deployment 是声明式的,比如我一会儿部署的时候会有两个 Wordpress,它就会把 container 变成两个 pod,这两个 pod 可以指定运行在第一个机器或者第二台机器上。

pod 中有很多配置,比如加密类的 NGINX 公司钥会放在 secret 里面,不需要加密的东西则放在 configmap 里。

详解最终架构

接下来我将介绍今天要搭建的架构,图中左边这台机器是两核 4G 的,性能比较好,右边这台机器是一核 2G 的,性能比较差。所以我把性能比较好的一台部署成 Master,但在这个 Master 上要节约一点,所以我会把实际上工作的 pod 包括 Wordpress、PHP 等等都会部署上来。

虽然我的这两台机器都有公网,但左边这台的带宽会比较大。因为买云服务器的时候都要买带宽,我需要先决定我的网络出口在哪,在这里我选择从 Master 这边出所以带宽会比较大。这个架构里有几种网络我分别用不同的颜色来表示,首先是标有数字 1、6 的两条深蓝色的线是公网 IP,因为我这台 Master 上有两个 IP 地址:一个内网一个公网。

到了内网以后,这两台机器都有 b 类内网地址段 172.16,它们之间通讯的时候就是使用虚拟化技术,大概是在二层和三层网络之间有一层网络,这层我们在虚拟机上是看不到的。它其实和 K8s 有点像,但性能会更好。上图中黑色的线我们可以简单理解为主机间的网络,是不同的云服务之间的物理网络。

再往里就是我们的 K8s 了,K8s 之间的网络我选择的是 flannel。由于 K8s 的 CNI 插件很灵活,所以很多网络都可以适用,但之所以选择 flannel 是因为它比较简单。

进入以后又有很多种不同的情况,比如今天的架构中外面的 NGINX 和我们以前介绍过的会比较接近。这个 NGINX 有负载均衡功能,是负载均衡这两台机器的 30001 端口,用 NodePort 的方式把容器里的 80 端口映射到主机上的 30001 端口。在这个 service 中实际上两台机器都会开 30001 端口,然后我再把 NGINX 负载均衡到这两台。

其实这种方式肯定是有问题的,因为假设它停止运行的话,NGINX 并不会接收到讯息,NGINX 的 Round-Robin 算法还是会经历一个试错的成本,还是要通过 next_upstream 机制 33:00。更好的方式是这里挂掉以后通过 Master 节点就能告诉 NGINX ,而不是通过 NGINX 自身的 next_upstream 进行再一次试错。但这个是和 Ingress 有关的东西,我们会放到后面的课程讲。

NGINX 还有第二个功能就是缓存以及读取静态文件。静态文件是用 NFS 来搭的,因为我们需要持久化存储。我们知道容器会经常进行迁移,容器停止运行之后,但容器内存储的文件不能丢失。

比如 Wordpress 这个博客允许用户上传图片和视频,上传的这些图片需要放到磁盘上。放到磁盘以后这两个 Wordpress 其实都是为一个域名服务,所以他们需要写同一个持久化的磁盘,而且跨组机都要读同一个目录。所以这个时候就需要用到 storage 系统,我暂时选的是最简单的 NFS。

像 Mysql 也是一样,也要把数据文件放到磁盘上。Mysql 也有可能宕机,如果这台设备停止运行,K8s 会自动的帮我迁到另外一个设备上,这种情况下如果磁盘不是永久性的那数据就丢失了。网络我选择的是 flannel,当你开始跨组机通讯的时候,flannel 会做很多变化,这里跨组机的我用了红色的线来表示。

如果没有跨级组交互,仅在本机上进行的话又不一样,本机的话比较简单用 ARP 协议,也就是 MAC 地址和 IP 地址的一个映射。因为 K8s 内部的 IP 地址和我们外部的 172.16 是完全不一样的,比如说成都机房的路由器是识别 172.16 的 IP,172.16 就是腾讯云给我分配的 IP 地址。

但我新搭的 K8s 是一套新的地址,这套地址必须 K8s 自己来管,因为这样才能做到例如在 100 台物理机上可以生成十万个容器,因为每个容器都有自己的独立 IP,K8s 一定要管自己的 IP 地址。

K8s 里面的地址外面是不认的,所以为了解决最外层地址的相互传输问题,在跨组机的时候需要先传到交换机,再由交换机传给机器来完成。

我的 pod 一共有三个,我在图中用粉色来标识:有两个 Wordpress,一个 MySql。Service 我用了 NodePort 的方式,然后 Mysql 的 service 是普通的 Cluster ip。

K8s 给我分配了一个 10 段的虚拟 IP,这边是把端口暴露出来了。然后负载均衡用的是外部的,这就是我们今天要搭建的最终的样子。下面请观看视频,和我一起动手搭建。


NGINX唯一中文官方社区 ,尽在 nginx.org.cn

更多 NGINX 相关的技术干货、互动问答、系列课程、活动资源:

已修改于2023-03-09 02:17
本作品系原创
创作不易,留下一份鼓励
NGINX官方账号

暂无个人介绍

关注



写下您的评论
发表评论
全部评论(0)

按点赞数排序

按时间排序

关于作者
NGINX官方账号
这家伙很懒还未留下介绍~
239
文章
21
问答
198
粉丝
相关文章