EKS助力小白实践云原生——通过k8s部署wordpress应用

目前云原生在大厂已经有了充分的实践,也逐渐向小厂以及非互联网公司推广。适逢12月20日,腾讯云原生【燎原社】精心打造了云原生在线技术工坊,让零基础的同学也能快速入门和实践 Docker 和 Kubernetes 技术。

技术工坊

云原生技术工坊 通过六天的学习,让零基础的小白能够对云原生,特别是对如何基于 Kubernetes 部署应用,有一个初步的了解。在每天1-2小时的动手学习之后,还可以参与打卡,对所学进行记录和输出,学习氛围十足。本次学习的内容主要有以下几点:

  1. 在本地安装 Docker Desktop 并通过 getting-started 项目了解 Docker 命令,并学习制作容器镜像
  2. 了解常用的 Linux 发行版,以及对应的容器镜像,了解 Linux 基本命令和包管理器
  3. 学习 Dockerfile,基于官方编程语言镜像,将不同语言的项目源码打包成容器镜像
  4. 学习 Docker Volume 的使用,在本地部署 wordpress 和 MySQL 容器;了解腾讯云常用服务(私有网络、EKS 弹性集群、TCR 镜像仓库、CFS 文件存储等),通过 EKS 可视化控制台快速部署应用
  5. 搭建本地 Kubernetes 集群,配置 kubectl 管理本地和远程集群;通过 EKS 控制台以及 kubectl 命令行了解 Kubernetes 的重要概念,如工作节点 Node、计算单元 Pod、工作负载 Deployment 等、命名空间 Namespace 和服务 Service 等
  6. 理解 YAML 与 Kubernetes 中资源对象的关系,了解 PV 和 PVC 存储。使用 YAML 配置文件在 Kubernetes 上部署应用,包括创建 PV、PVC、Deployment、Service 对象,使得应用数据可以持久化,并能够通过公网访问

前三天主要是 Docker 相关内容的学习,后三天就对本地以及腾讯云 EKS 的 Kubernetes 使用进行实践了。

这里要感谢一下 @李东bbsky 在交流群中的耐心指导。

而在六天学习的最后,有一个大作业:就是在 EKS 上使用 kubectl 和 YAML 配置文件,通过创建 Deployment 负载、存储、服务等在Kubernetes 集群上部署一个 WordPress(含 MySQL 数据库)应用。

而本文的主要内容也是记录一下完成这个大作业的主要思路以及实践过程。

前置准备

部署方案分析(如下图所示):

  • 部署 wordpress 应用需要的容器镜像,可以直接使用官方镜像 ,无需自己构建。
  • wordpress 应用依赖于 MySQL 数据库存储一些文章等数据。这里数据库部署有三种方案:一是在 Kubernetes 中搭建一个多副本的 MySQL 数据库,二是使用腾讯云的云数据库,三是使用腾讯云的云原生数据库。自建方案有一定复杂度,这次暂时先不考虑。后面两者经过评估,决定采用云原生数据库 TDSQL-C for MySQL,原因嘛,主要是价格更便宜。
  • wordpress 应用本身还有一些文件存储的需求(如主题、插件等),决定采用腾讯云 CFS 文件存储,通过 Kubernetes 的PV/PVC 机制提供给 wordpress 应用的容器使用。
  • 解决了文件存储和数据库存储的方案之后,就可以在本地(推荐轻量级应用服务器)通过 kubectl 管理 EKS 集群,使用 PV、PVC、Deployment、Service 的 YAML 配置文件来创建相关资源对象了。

那么在使用 kubectl 创建资源前,我们需要先准备好以下内容:

  1. 拥有腾讯云账号(应该都有的吧,新注册的账号记得先买点便宜的云服务器)
  2. 新建一个 VPC 私有网络; 和子网(建议选上海)。后续弹性容器集群、CFS 文件存储以及云原生数据库都会放在这个子网里。
  3. 新建一个 EKS 弹性容器集群,区域选择要与上一步私有网络的地区保持一致(后面的服务都配置在同一个地域),集群网络和容器网络选择上一步新建的私有网络和子网。完成后,坐等一两分钟,集群就创建成功了。
  4. 新建一个 云原生数据库 实例,选择 Serverless 计费模式(便宜)、选择与 EKS 相通的私有网络、算力配置选择最低、勾选10分钟未使用自动暂停的选项,费用 0.09 ~ 0.17 元/小时。下一步,设置数据库 root 口令,完成购买即可。创建完成后,可以在控制台看到数据库集群的内网 IP 地址,用于让后面 EKS 的 wordpress 容器访问。
  5. 创建 wordpress 数据库:在云原生数据库控制台,点击数据库集群实例右边【管理】,【数据库管理】标签,【创建数据库】按钮,新增一个名为 wordpress 的数据库,用于给 wordpress 应用提供访问。
  6. 新建 腾讯云文件系统 CFS 实例,文件协议选择 NFS,网络选择已有的 VPC 子网,立即购买即可创建完成,记住实例的内网 IP 地址,后面创建 PV 对象的时候需要使用。
  7. 到 EKS 集群控制台,点击创建好的实例。在【命名空间】新建一个 Namespace(如 ns-wp),用于集群中应用的隔离,后面创建的 PVC、Deployment、Service 均要设置到同一个 Namespace 中。
  8. 在 EKS 集群实例的控制台,在【配置管理】中,选择命名空间,新建一个 secret(如 wordpress-mysql),填入变量名为WORDPRESS_DB_PASSWORD,变量值为第四步创建的数据库 root 密码。这样使得编写 YAML 时,无需明文记录密码。

部署过程

这里我们要使用编写 YAML 配置文件的方式来部署应用。因此需要在本机或者云服务器安装好 kubectl,用于管理 k8s 集群。

在 EKS 集群实例的控制台,【基本信息】——【集群APIServer信息】开启外网访问并设置白名单(本地是互联网出口地址/云服务器是其公网 IP 地址),点击【证书管理】,下载集群的访问凭证,用于配置 kubectl。

[lighthouse@VM-4-3-centos eks-wp]$ kubectl config get-contexts
CURRENT   NAME                                        CLUSTER        AUTHINFO       NAMESPACE
*         cls-1incp0y9-xxxxxxxxxxxx-context-default   cls-1incp0y9   xxxxxxxxxxxx

随后依次创建 PV 和 PVC 存储,用于持久化 wordpress 应用的数据,创建 Deployment、Service 对象即可部署完成。

  1. 在 wp-pv.yaml 中,wp-pv 为 PV 对象名 ,server 为上面创建 CFS 的内网 IP 地址,path 为根目录 / 即可。
wp-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: wp-pv
spec:
  capacity:
    storage: 10Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  mountOptions:
    - hard
    - nfsvers=4
  nfs:
    path: /
    server: x.x.x.x

随后通过 kubectl 创建 PV 对象。也可以在所有的 YAML 文件编写完成后一起执行。

[lighthouse@VM-4-3-centos eks-wp]$ kubectl apply -f wp-pv.yaml
persistentvolume/wp-pv created
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE
wp-pv   10Gi       RWX            Retain           Available                                   2s
  1. 在 wp-pvc.yaml 中,wp-pvc 为 PVC 对象名 ,namespace 指定 PVC 所在的命名空间。
wp-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pvc
  namespace: ns-wp
spec:
  accessModes:
  - ReadWriteMany
  volumeMode: Filesystem
  storageClassName: ""
  resources:
    requests:
      storage: 10Gi

通过 kubectl 创建 PVC 对象完成后,将自动绑定到上面的 PV 对象。

[lighthouse@VM-4-3-centos eks-wp]$ kubectl apply -f wp-pvc.yaml
persistentvolumeclaim/wp-pvc created
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get pv
NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM         STORAGECLASS   REASON   AGE
wp-pv   10Gi       RWX            Retain           Bound    ns-wp/wp-pv                           13m
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get pvc --namespace ns-wp
NAME     STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
wp-pvc   Bound    wp-pv    10Gi       RWX                           4m41s
  1. 在 wp-deployment.yaml 中,wp-deployment 为工作负载的对象名 ,namespace 指定对象所在的命名空间。设置 k8s-app: tke-wp 的标签。Pod 副本数设置为 3,wordpress 镜像从 Docker 官网拉取,暴露端口 80,目录 /var/www/html 映射 wp-data 的数据卷。

设置环境变量 WORDPRESS_DB_HOST 为上面云原生数据库的内网IP地址,WORDPRESS_DB_USER 为 root,WORDPRESS_DB_PASSWORD 从名为 wordpress-mysql 的 secret 对象获取。

而名为 wp-data 的数据卷,需要绑定之前设置的名为 wp-pvc 的 PVC 对象。

wp-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wp-deployment
  namespace: ns-wp
  labels:
    k8s-app: tke-wp
    qcloud-app: tke-wp
spec:
  selector:
    matchLabels:
      k8s-app: tke-wp
      qcloud-app: tke-wp
  replicas: 3
  template:
    metadata:
      labels:
        k8s-app: tke-wp
        qcloud-app: tke-wp
    spec:
      containers:
      - name: wordpress
        image: wordpress
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: "/var/www/html"
          name: wp-data
        env:
          - name: WORDPRESS_DB_HOST
            value: x.x.x.x:3306
          - name: WORDPRESS_DB_USER
            value: root
          - name: WORDPRESS_DB_PASSWORD
            valueFrom:
              secretKeyRef:
                name: wordpress-mysql
                key: WORDPRESS_DB_PASSWORD
          - name: WORDPRESS_DB_NAME
            value: wordpress
      volumes:
      - name: wp-data
        persistentVolumeClaim:
          claimName: wp-pvc

通过 kubectl 创建 Deployment 对象后,Kubernetes 将创建 3 个 Pod 副本,每个 Pod 中包含一个 wordpress 容器,每个容器都将访问同一个数据库,以及同一个 NFS 文件存储。此时,我们还无法通过公网地址访问应用。

[lighthouse@VM-4-3-centos eks-wp]$ kubectl apply -f wp-deployment.yaml
deployment.apps/wp-deployment created
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get deployment --namespace ns-wp
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
wp-deployment   3/3     3            3           30s
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get pod --namespace ns-wp
NAME                             READY   STATUS    RESTARTS   AGE
wp-deployment-78c8658fd5-cqrhk   1/1     Running   0          38s
wp-deployment-78c8658fd5-g2vcb   1/1     Running   0          38s
wp-deployment-78c8658fd5-qgfbt   1/1     Running   0          38s
  1. 在 wp-service.yaml 中,wp-clb 为 Service 的对象名 ,namespace 指定对象所在的命名空间。使用 LoadBalancer 来满足公网访问的需求,端口映射配置为 TCP 80 到 80 端口。最后通过 k8s-app: tke-wp 绑定前面已创建好的 deployment 对象。
wp-service.yaml
piVersion: v1
kind: Service
metadata:
  name: wp-clb
  namespace: ns-wp
spec:
  ports:
  - name: tcp-80-80
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    k8s-app: tke-wp
    qcloud-app: tke-wp
  type: LoadBalancer

通过 kubectl 创建 Service 对象后,可以查看 LoadBalancer 提供的公网访问地址。

[lighthouse@VM-4-3-centos eks-wp]$ kubectl apply -f wp-service.yaml
service/wp-clb created
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get service --namespace ns-wp
NAME     TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
wp-clb   LoadBalancer   192.168.3.87   <pending>     80:31955/TCP   3s
[lighthouse@VM-4-3-centos eks-wp]$ kubectl get service --namespace ns-wp
NAME     TYPE           CLUSTER-IP     EXTERNAL-IP    PORT(S)        AGE
wp-clb   LoadBalancer   192.168.3.87   xx.xx.xx.xxx   80:31955/TCP   29s</pending>

最后通过浏览器访问公网地址即可访问到 wordpress 应用了。

其他

一些需要注意的点:

  1. wordpress 应用在最初的设置后,会有将当前的公网地址写入数据库(wp_options 表的 siteurl 和 home 字段)。如果 Service 的公网地址发生变化,访问 wordpress 时,静态资源将无法访问到。可以修改数据库或者 wordpress 后台的设置。
  2. 费用问题:云原生数据库最低配 0.1/h,EKS 的 CLB负载均衡 0.2/h,EKS 的 Pod 副本数*0.2/h,加起来大约一小时五毛到一块,练习完成后,删除 EKS 中的资源对象即可,云原生数据库 10 分钟不访问会自动停止。

后续可做的几点优化:

  1. 云原生数据库的使用,其实简化了部署的复杂度,后面可能还会尝试通过 Kubernetes 集群自己搭建一个多副本数据库
  2. wordpress 应用的数据存储,除了应用本身依赖的一些文件,还会有一些用户上传的图片等数据。这部分的数据后续可以考虑使用 COS 对象存储来保存,即将 PV/PVC 绑定对象存储;
  3. 如果 wordpress 应用需要应对海量流量,或者二次开发后业务变得复杂,还可以考虑将应用拆成微服务,这个就比较进阶了。

如果你对云原生繁多的概念困惑不已,或者苦于不知如何对云原生入门实践,那么强烈推荐一下 云原生技术工坊

笔者在云原生领域的经验尚少,文章如有纰漏,还请指点更正。

—END—

Original: https://www.cnblogs.com/cathonzhd/p/15760219.html
Author: Cathon
Title: EKS助力小白实践云原生——通过k8s部署wordpress应用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609277/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL日志管理之通用日志和慢查询日志

    MySQL的通用日志: 用来记录对数据库的通用操作,包括错误的sql语句等信息。 通用日志可以保存在:file(默认值)或 table(mysql.general_log表) my…

    Linux 2023年6月7日
    0144
  • 【EventOS Nano】EventOS Nano初步了解

    EventOS Nano是什么? EventOS Nano是一个面向单片机、事件驱动的、分布式的、可跨平台开发的嵌入式开发平台。主要有两大技术特色: 事件驱动和 超轻量 Event…

    Linux 2023年6月13日
    0105
  • Linux性能监控-sar

    sar是一个非常全面的一个分析工具,对文件的读写,系统调用的使用情况,磁盘IO,CPU相关使用情况,内存使用情况,进程活动等都可以进行有效的分析。sar工具将对系统当前的状态进行取…

    Linux 2023年6月6日
    0138
  • 使用PowerShell收集多台服务器的性能计数器

    写在前面 当管理多台Windows Server服务器时(无论是DB、AD、WEB以及其他的应用服务器),当出现性能或其他问题后,参阅性能计数器都是一个非常好的维度从而推测出问题可…

    Linux 2023年5月28日
    099
  • 超算TOP500中的Linux占比——Operating System&Operating System Family

    2022-09-18-21:28:59 老师作业说明: TOP500中国超算占比,LINUX系统占比 说明:当时使用的是bing搜索,中国超算占比其实澎湃新闻什么的都有介绍,但是我…

    Linux 2023年6月6日
    0116
  • Docker-数据卷管理

    Docker-数据卷管理 1.利用数据卷和数据容器管理数 管理Docker 容器中数据主要有两种方式:数据卷(Data Volumes)和数据卷容器( DataVolumes Co…

    Linux 2023年6月13日
    0102
  • 【建议收藏】你知道数据库是怎么运行的吗?

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    092
  • Linux系统僵尸进程详解

    大安好,我是良许。 本文我们将来讨论一下什么是僵尸进程,僵尸进程是怎么产生的,如何杀死一个僵尸进程。 Linux中的进程是什么? 讲到进程,我们要先了解一下另一个概念: &…

    Linux 2023年6月14日
    0166
  • POJ1322Chocolate–概论DP

    每次从包装中取出一块巧克力并放在桌子上。如果桌子上有两个相同颜色的巧克力,则将这两个丢掉。如果包中有C种颜色的巧克力(颜色均匀分布),从包装中取出N个巧克力后,桌子上确实有M个巧克…

    Linux 2023年6月7日
    0136
  • Spring Boot连接数据库,从MySql5.13飞跃到MySql8.0.18的坑

    Spring Boot连接数据库,从MySql5.13飞跃到MySql8.0.18的坑 1.驱动名 驱动包用的是:mysql-connector-java-8.0.18.jar 驱…

    Linux 2023年6月7日
    0103
  • 运维开发之路:带你解剖html列表,一个看似简单而又不简单的知识点。

    HTML支持有序、无序和自定义列表,本篇笔者对这几个知识点进行剖析,跟紧步伐,我们一起出发吧! 无序列表 无序列表以ul标签开始,每个列表项都以li标签开始,无序列表是一个项目的列…

    Linux 2023年6月7日
    0120
  • IEEE浮点数标准

    IEEE浮点数标准 阅读笔记:Computer System : A Programmmer’s Perspective 基本概念 IEEE浮点数标准采用 [V=(-1…

    Linux 2023年6月8日
    0134
  • 【5】2022年7月

    7月3日 总结3号的一天就是只有一句话,”自己经历了什么只有自己最清楚,不要辜负自己经历的”。 7月3号凌晨2点,收拾好行李和整理房间,在网上购买日常用品到…

    Linux 2023年6月13日
    097
  • NoteOfMySQL-08-视图

    视图是从一个表或多个表中导出的表,是一种虚拟存在的表,不占用存储空间。视图可以使用户的操作更方便,并且可以保障数据库系统安全性。 1. 视图概述 视图中保存的仅仅是一条select…

    Linux 2023年6月14日
    0101
  • 为spring cloud config实现刷新动态掉的坑

    正常搭建配置中心,网上教程多,这里不讨论,只记坑也是为了后来者少花时间在这里,由于是当时研究了好久才写的文章,所以只能提供问题的原因,当然会给出印证的思路,闲话不多说进入正题! 版…

    Linux 2023年6月7日
    0113
  • ES6

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &lt…

    Linux 2023年6月13日
    0109
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球