树叶云kubernetes教程:Kubernetes 示例:使用Persistent Volumes部署WordPress和MySQL

示例:使用 Persistent Volumes 部署 WordPress 和 MySQL

本示例描述了如何通过 Minikube 在 Kubernetes 上安装 WordPress 和 MySQL。 这两个应用都使用 PersistentVolumes 和 PersistentVolumeClaims 保存数据。

PersistentVolume​(PV)是一块集群里由管理员手动提供, 或 kubernetes 通过 ​StorageClass ​动态创建的存储。 ​PersistentVolumeClaim ​是用户对存储的请求,该请求可由某个 PV 来满足。 PersistentVolumes 和 PersistentVolumeClaims 独立于 Pod 生命周期而存在, 在 Pod 重启,重新调度甚至删除过程中保存数据。

警告:

这种部署并不适合生产场景,它使用单实例 WordPress 和 MySQL Pods。 在生产场景中,请考虑使用  WordPress Helm Chart 部署 WordPress。

说明:

本教程中提供的文件使用 GA Deployment API,并且特定于 kubernetes 1.9 或更高版本。如果你希望将本教程与 Kubernetes 的早期版本一起使用,请相应地更新 API 版本,或参考本教程的早期版本。

教程目标

  • 创建 PersistentVolumeClaims 和 PersistentVolumes
  • 创建 ​kustomization.yaml​ 使用
    • Secret 生成器
    • MySQL 资源配置
    • WordPress 资源配置
  • 应用整个 kustomization 目录 ​kubectl apply -k ./
  • 清理

准备开始

你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 Minikube 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

  • Katacoda
  • 玩转 Kubernetes

要获知版本信息,请输入 ​kubectl version​。

此例在​kubectl ​1.14 或者更高版本有效。

下载下面的配置文件:

  1. mysql-deployment.yaml
  2. wordpress-deployment.yaml

创建 PersistentVolumeClaims 和 PersistentVolumes

MySQL 和 Wordpress 都需要一个 PersistentVolume 来存储数据。 他们的 PersistentVolumeClaims 将在部署步骤中创建。

许多集群环境都安装了默认的 StorageClass。如果在 PersistentVolumeClaim 中未指定 StorageClass, 则使用集群的默认 StorageClass。

创建 PersistentVolumeClaim 时,将根据 StorageClass 配置动态设置 PersistentVolume。

警告:

在本地集群中,默认的 StorageClass 使用​
hostPath​供应器。 ​
hostPath​卷仅适用于开发和测试。 使用 ​
hostPath ​卷,你的数据位于 Pod 调度到的节点上的​
/tmp​中,并且不会在节点之间移动。 如果 Pod 死亡并被调度到集群中的另一个节点,或者该节点重新启动,则数据将丢失。

说明:

如果要建立需要使用​
hostPath​设置程序的集群, 则必须在 controller-manager 组件中设置​
--enable-hostpath-provisioner​标志。

说明:

如果你已经有运行在 Google Kubernetes Engine 的集群, 请参考 此指南。

创建 kustomization.yaml

创建 Secret 生成器

Secret 是存储诸如密码或密钥之类的敏感数据的对象。 从 1.14 开始,​kubectl​支持使用 kustomization 文件管理 Kubernetes 对象。 你可以通过​kustomization.yaml​中的生成器创建一个 Secret。

通过以下命令在​kustomization.yaml​中添加一个 Secret 生成器。 你需要用你要使用的密码替换​YOUR_PASSWORD​。

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
  literals:
  - password=YOUR_PASSWORD
EOF

补充 MySQL 和 WordPress 的资源配置 

以下 manifest 文件描述了单实例 MySQL 部署。MySQL 容器将 PersistentVolume 挂载在​/var/lib/mysql​。 ​MYSQL_ROOT_PASSWORD​环境变量设置来自 Secret 的数据库密码。

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim

以下 manifest 文件描述了单实例 WordPress 部署。WordPress 容器将网站数据文件位于​/var/www/html​的 PersistentVolume。​WORDPRESS_DB_HOST​环境变量集上面定义的 MySQL Service 的名称,WordPress 将通过 Service 访问数据库。​WORDPRESS_DB_PASSWORD​环境变量设置从 Secret kustomize 生成的数据库密码。

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wp-pv-claim
  1. 下载 MySQL deployment 配置文件。
  2. curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
    
  3. 下载 WordPress 配置文件。
  4. curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
    
  5. 补充到 ​kustomization.yaml​ 文件。
  6. cat <<EOF >>./kustomization.yaml
    resources:
      - mysql-deployment.yaml
      - wordpress-deployment.yaml
    EOF

应用和验证 

kustomization.yaml​包含用于部署 WordPress 网站的所有资源以及 MySQL 数据库。你可以通过以下方式应用目录

kubectl apply -k ./

现在,你可以验证所有对象是否存在。

  1. 通过运行以下命令验证 Secret 是否存在:
  2. kubectl get secrets
    

    响应应如下所示:

    NAME                    TYPE                                  DATA   AGE
    mysql-pass-c57bb4t7mf   Opaque                                1      9s
  3. 验证是否已动态配置 PersistentVolume:
  4. kubectl get pvc
    

    说明: 设置和绑定 PV 可能要花费几分钟。

    响应应如下所示:

    NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
    mysql-pv-claim   Bound     pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002   20Gi       RWO            standard           77s
    wp-pv-claim      Bound     pvc-8cd0df54-4044-11e9-b2bb-42010a800002   20Gi       RWO            standard           77s
  5. 通过运行以下命令来验证 Pod 是否正在运行:
  6. kubectl get pods
    

    说明: 等待 Pod 状态变成RUNNING可能会花费几分钟。

    响应应如下所示:

    NAME                               READY     STATUS    RESTARTS   AGE
    wordpress-mysql-1894417608-x5dzt   1/1       Running   0          40s
  7. 通过运行以下命令来验证 Service 是否正在运行:
  8. kubectl get services wordpress
    

    响应应如下所示:

    NAME        TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    wordpress   ClusterIP   10.0.0.89    <pending>     80:32406/TCP   4m

    说明: Minikube 只能通过 NodePort 公开服务。EXTERNAL-IP 始终处于挂起状态

  9. 运行以下命令以获取 WordPress 服务的 IP 地址:
  10. minikube service wordpress --url
    

    响应应如下所示:

    http://1.2.3.4:32406
    
  11. 复制 IP 地址,然后将页面加载到浏览器中来查看你的站点。
  12. 你应该看到类似于以下屏幕截图的 WordPress 设置页面。

警告:

不要在此页面上保留 WordPress 安装。如果其他用户找到了它,他们可以在你的实例上建立一个网站并使用它来提供恶意内容。

通过创建用户名和密码来安装 WordPress 或删除你的实例。

清理

运行以下命令删除你的 Secret,Deployments,Services and PersistentVolumeClaims:

kubectl delete -k ./

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/158458.html<

(0)
管理的头像管理
上一篇2025-03-16 20:35
下一篇 2025-03-16 20:36

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注