EKS助力小白实践云原生——通过k8s部署wordpress应用
目前云原生在大厂已经有了充分的实践,也逐渐向小厂以及非互联网公司推广。适逢12月20日,腾讯云原生【燎原社】精心打造了云原生在线技术工坊,让零基础的同学也能快速入门和实践 Docker 和 Kubernetes 技术。
技术工坊
云原生技术工坊 通过六天的学习,让零基础的小白能够对云原生,特别是对如何基于 Kubernetes 部署应用,有一个初步的了解。在每天1-2小时的动手学习之后,还可以参与打卡,对所学进行记录和输出,学习氛围十足。本次学习的内容主要有以下几点:
- 在本地安装 Docker Desktop 并通过 getting-started 项目了解 Docker 命令,并学习制作容器镜像
- 了解常用的 Linux 发行版,以及对应的容器镜像,了解 Linux 基本命令和包管理器
- 学习 Dockerfile,基于官方编程语言镜像,将不同语言的项目源码打包成容器镜像
- 学习 Docker Volume 的使用,在本地部署 wordpress 和 MySQL 容器;了解腾讯云常用服务(私有网络、EKS 弹性集群、TCR 镜像仓库、CFS 文件存储等),通过 EKS 可视化控制台快速部署应用
- 搭建本地 Kubernetes 集群,配置 kubectl 管理本地和远程集群;通过 EKS 控制台以及 kubectl 命令行了解 Kubernetes 的重要概念,如工作节点 Node、计算单元 Pod、工作负载 Deployment 等、命名空间 Namespace 和服务 Service 等
- 理解 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 创建资源前,我们需要先准备好以下内容:
- 拥有腾讯云账号(应该都有的吧,新注册的账号记得先买点便宜的云服务器)
- 新建一个 VPC 私有网络和子网(建议选上海)。后续弹性容器集群、CFS 文件存储以及云原生数据库都会放在这个子网里。
- 新建一个 EKS 弹性容器集群,区域选择要与上一步私有网络的地区保持一致(后面的服务都配置在同一个地域),集群网络和容器网络选择上一步新建的私有网络和子网。完成后,坐等一两分钟,集群就创建成功了。
- 新建一个云原生数据库实例,选择 Serverless 计费模式(便宜)、选择与 EKS 相通的私有网络、算力配置选择最低、勾选10分钟未使用自动暂停的选项,费用 0.09 ~ 0.17 元/小时。下一步,设置数据库 root 口令,完成购买即可。创建完成后,可以在控制台看到数据库集群的内网 IP 地址,用于让后面 EKS 的 wordpress 容器访问。
- 创建 wordpress 数据库:在云原生数据库控制台,点击数据库集群实例右边【管理】,【数据库管理】标签,【创建数据库】按钮,新增一个名为 wordpress 的数据库,用于给 wordpress 应用提供访问。
- 新建腾讯云文件系统 CFS 实例,文件协议选择 NFS,网络选择已有的 VPC 子网,立即购买即可创建完成,记住实例的内网 IP 地址,后面创建 PV 对象的时候需要使用。
- 到 EKS 集群控制台,点击创建好的实例。在【命名空间】新建一个 Namespace(如 ns-wp),用于集群中应用的隔离,后面创建的 PVC、Deployment、Service 均要设置到同一个 Namespace 中。
- 在 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
2. 在 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
3. 在 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
4. 在 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
最后通过浏览器访问公网地址即可访问到 wordpress 应用了。
其他
一些需要注意的点:
- wordpress 应用在最初的设置后,会有将当前的公网地址写入数据库(wp_options 表的 siteurl 和 home 字段)。如果 Service 的公网地址发生变化,访问 wordpress 时,静态资源将无法访问到。可以修改数据库或者 wordpress 后台的设置。
- 费用问题:云原生数据库最低配 0.1/h,EKS 的 CLB负载均衡 0.2/h,EKS 的 Pod 副本数*0.2/h,加起来大约一小时五毛到一块,练习完成后,删除 EKS 中的资源对象即可,云原生数据库 10 分钟不访问会自动停止。
后续可做的几点优化:
- 云原生数据库的使用,其实简化了部署的复杂度,后面可能还会尝试通过 Kubernetes 集群自己搭建一个多副本数据库。
- wordpress 应用的数据存储,除了应用本身依赖的一些文件,还会有一些用户上传的图片等数据。这部分的数据后续可以考虑使用 COS 对象存储来保存,即将 PV/PVC 绑定对象存储;
- 如果 wordpress 应用需要应对海量流量,或者二次开发后业务变得复杂,还可以考虑将应用拆成微服务,这个就比较进阶了。
如果你对云原生繁多的概念困惑不已,或者苦于不知如何对云原生入门实践,那么强烈推荐一下 云原生技术工坊
笔者在云原生领域的经验尚少,文章如有纰漏,还请指点更正。
—END—
EKS助力小白实践云原生——通过k8s部署wordpress应用的更多相关文章
- 云原生系列2 部署你的第一个k8s应用
云原生的概念和理论体系非常的完备,but talk is cheap , show me the code ! 但是作为一名程序员,能动手的咱绝对不多BB,虽然talk并不cheap , 能跟不同层次 ...
- 阿里云上Docker Compose部署wordpress
先上官方文档: https://docs.docker.com/compose/wordpress/ 我的环境: [root@xyjk1002 ~]# cat /etc/redhat-release ...
- 阿里云如何基于标准 K8s 打造边缘计算云原生基础设施
作者 | 黄玉奇(徙远) 阿里巴巴高级技术专家 关注"阿里巴巴云原生"公众号,回复关键词 1219 即可下载本文 PPT 及实操演示视频. 导读:伴随 5G.IoT 的发展,边缘 ...
- 云原生生态周报 Vol.10 | 数据库能否运行在 K8s 当中?
业界要闻 IBM 以总价 340 亿美元完成里程碑意义的红帽收购:这是这家拥有 107 年历史的公司史上规模最大的一笔收购,该收购金额在整个科技行业的并购史上也能排到前三.在当天公布的声明中,IBM ...
- AI云原生浅谈:好未来AI中台实践
AI时代的到来,给企业的底层IT资源的丰富与敏捷提出了更大的挑战,利用阿里云稳定.弹性的GPU云服务器,领先的GPU容器化共享和隔离技术,以及K8S集群管理平台,好未来通过云原生架构实现了对资源的灵活 ...
- Longhorn,企业级云原生容器分布式存储 - K8S 资源配置示例
内容来源于官方 Longhorn 1.1.2 英文技术手册. 系列 Longhorn 是什么? Longhorn 企业级云原生容器分布式存储解决方案设计架构和概念 Longhorn 企业级云原生容器分 ...
- CNCF 宣布成立应用交付领域小组,正式开启云原生应用时代
作者|赵钰莹 作为云原生领域的顶级开源社区, Cloud Native Computing Foundation (云原生基金会,以下简称 CNCF)近日宣布成立 Application Delive ...
- 华为云亮相QCon2020深圳站,带你体会大厂的云原生玩法与秘诀
摘要:在QCon全球软件开发大会上,华为云开发者生态总监张全文作为"云原生应用开发实践"专题出品人,携手华为云四位资深技术专家带来精彩分享. 作为当下技术领域最火热的技术趋势之一, ...
- 柯基数据通过Rainbond完成云原生改造,实现离线持续交付客户
1.关于柯基数据 南京柯基数据科技有限公司成立于2015年,提供一站式全生命周期知识图谱构建和运维.智能应用服务,致力于"链接海量数据,从大数据中挖掘智慧".帮助企业运用知识 ...
随机推荐
- RabbitMQ学习笔记二:Java实现RabbitMQ
本地安装好RabbitMQ Server后,就可以在Java语言中使用RabbitMQ了. RabbitMQ是一个消息代理,从"生产者"接收消息并传递消息至"消费者&qu ...
- Java初学者作业——编写JAVA程序,根据用户输入课程名称,输出对应课程的简介,各门课程的简介见表
返回本章节 返回作业目录 需求说明: 编写JAVA程序,根据用户输入课程名称,输出对应课程的简介,各门课程的简介见表 课程名称 课程简介 JAVA课程 JAVA语言是目前最流行的编写语言,在本课程中将 ...
- 编写Java程序,在子类老虎中重写父类动物的吃食方法
返回本章节 返回作业目录 需求说明: 在子类老虎中重写父类动物的吃食方法 实现思路: 在子类老虎中重写父类动物的吃食方法的实现思路如下: 创建各种动物的父类Animal类,在该类中定义eat()方法. ...
- 面试中问你MySql,这一篇就够了
说一说主键索引与唯一索引 主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键索引默认是聚簇索引.唯一索引一般是非聚簇索引. 主键索引不能为空,唯一索引在InnoDB中可以出现多个null ...
- SQLServer中的CTE(Common Table Expression)通用表表达式使用详解
概述 我们经常会编写由基本的 SELECT/FROM/WHERE 类型的语句派生而来的复杂 SQL 语句.其中一种方案是需要编写在 FROM 子句内使用派生表(也称为内联视图)的 Transact-S ...
- 对接网易云信音视频2.0呼叫组件集成到vue中,实现web端呼叫app,视频语音通话。
项目中需要实现视频通话功能,经过公司的赛选,采用网易云信的视频通话服务,app小伙伴集成很顺利.web端需要实现呼叫app端用户.网易云信文档介绍不全,vue的demo满足不了需求,和客服人员沟通,只 ...
- .net core的配置介绍(二):自定义配置(Zookeeper,数据库,Redis)
上一篇介绍了.net core的配置原理已经系统提供的一些常用的配置,但有时我们的配置是存放在Zookeeper,DB,Redis中的,这就需要我们自己去实现集成了. 这里再介绍几个我们用的多的配置集 ...
- 我踩过的python的坑
1. string中Template用法 变量名不能是${tradeDate+1}, python无法识别其为变量,应改为 ${tradeDate1} 变量替换的语句:data_new = Templ ...
- 初识python: 继承
继承:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承创建的新类称为"子类"或"派生类". 被继承的类称为"基 ...
- mybatis-plus中查询出的字段为空
数据查询出后其中几个字段为null 解决方法: 数据库的字段命名方式为使用下划线连接,对应的实体类应该是驼峰命名方式,而我使用的是和数据库同样的命名方式. 所以mybatis-plus映射不到,修改实 ...