k8s-部署实例(mysql+wordpress)

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 安装mysql安装wordpress部署ingress 进行流量负载控制

应用介绍


image.png


部署考虑


image.png


镜像下载


docker pull mysql:5.7.34
Docker pull wordpress:4.8-apache



mysql的部署

image.png


service文件配置


apiVersion: v1
kind: Service
metadata:  name: mysql-sts
  labels:    app: mysql-sts
spec:  ports:    - port: 3306  selector:    app: mysql-sts
  clusterIP: None


Secret文件配置


apiVersion: v1
kind: Secret
metadata:  name: mysecret
type: Opaque
data:  password: MTIzNDU2
  username: cm9vdA==
#user/pass=root/123456


StatefulSet 文件配置


apiVersion: apps/v1
kind: StatefulSet
metadata:  name: mysql-sts
spec:  serviceName: "mysql-sts"  replicas: 1  volumeClaimTemplates:  - metadata:      name: mysql-local-storage
      annotations:        volume.beta.kubernetes.io/storage-class: "nfs-csi"    spec:      accessModes: ["ReadWriteOnce"]      resources:        requests:          storage: 25Gi
  selector:    matchLabels:       app: mysql-sts
  template:    metadata:     labels:       app: mysql-sts
    spec:      nodeSelector:        wordpress: mysql
      containers:      - image: mysql:5.7.34        name: mysql
        env:        - name: MYSQL_ROOT_PASSWORD
          valueFrom:            secretKeyRef:              name: mysecret
              key: password
#- name: SECRET_USERNAME#  valueFrom:#  secretKeyRef:#    name: mysecret#    key: username        ports:        - containerPort: 3306          name: mysql
        volumeMounts:        - name: mysql-local-storage
          readOnly: false          mountPath: /var/lib/mysql
      initContainers:      - name: init-wordpress-mysql
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ['sh','-c','rm -rf /data/*','until nslookup mysql-sts; do echo waiting for mysql-sts; sleep 2; done;']        volumeMounts:        - name: mysql-local-storage
          readOnly: false          mountPath: /data


配置说明:


  volumeClaimTemplates:  - metadata:      name: mysql-local-storage
      annotations:        volume.beta.kubernetes.io/storage-class: "nfs-csi"    spec:      accessModes: ["ReadWriteOnce"]      resources:        requests:          storage: 25Gi


volumeClaimTemplates:PVC 的配置模块,存储类型是nfs, 驱动插件为 CSI


accessModes: ReadWriteOnce 模式




    spec:      nodeSelector:        wordpress: mysql
      containers:      - image: mysql:5.7.34        name: mysql
        env:        - name: MYSQL_ROOT_PASSWORD
          valueFrom:            secretKeyRef:              name: mysecret
              key: password



* spec.nodeSelector: 节点选择器。 作用:当前pod会部署到,含有wordpress=mysql标签的node。

 如果让pod部署到指定的node, 可以使用nodeSelector指定标签。前提需要在node 节点上创建label。命令: kubectl label node  node-name  label-key=label-value。

* spec.env容器中使用的环境变量配置, 由Secret文件配置


完整配置

mysql-sts.yaml


apiVersion: v1
kind: Service
metadata:  name: mysql-sts
  labels:    app: mysql-sts
spec:  ports:    - port: 3306  selector:    app: mysql-sts
  clusterIP: None
---apiVersion: v1
kind: Secret
metadata:  name: mysecret
type: Opaque
data:  password: MTIzNDU2
  username: cm9vdA==
#user/pass=root/123456---apiVersion: apps/v1
kind: StatefulSet
metadata:  name: mysql-sts
spec:  serviceName: "mysql-sts"  replicas: 1  volumeClaimTemplates:  - metadata:      name: mysql-local-storage
      annotations:        volume.beta.kubernetes.io/storage-class: "nfs-csi"    spec:      accessModes: ["ReadWriteOnce"]      resources:        requests:          storage: 25Gi
  selector:    matchLabels:       app: mysql-sts
  template:    metadata:     labels:       app: mysql-sts
    spec:      nodeSelector:        wordpress: mysql
      containers:      - image: mysql:5.7.34        name: mysql
        env:        - name: MYSQL_ROOT_PASSWORD
          valueFrom:            secretKeyRef:              name: mysecret
              key: password
#- name: SECRET_USERNAME#  valueFrom:#  secretKeyRef:#    name: mysecret#    key: username        ports:        - containerPort: 3306          name: mysql
        volumeMounts:        - name: mysql-local-storage
          readOnly: false          mountPath: /var/lib/mysql
      initContainers:      - name: init-wordpress-mysql
        image: busybox
        imagePullPolicy: IfNotPresent
        command: ['sh','-c','rm -rf /data/*','until nslookup mysql-sts; do echo waiting for mysql-sts; sleep 2; done;']        volumeMounts:        - name: mysql-local-storage
          readOnly: false          mountPath: /data


安装mysql




kubectl create ns wp   # 创建命名空间kubectl apply -f  mysql-sts.yaml -n wp   # 部署mysql


部署wordpress



PVC配置


apiVersion: v1
kind: PersistentVolumeClaim
metadata:  name: pvc-wp
spec:  storageClassName: nfs-csi    # 存储类型为nfs, 驱动插件为CSI  accessModes:  - ReadWriteMany          # 访问模式:支持多个service 读写  resources:     requests:       storage: 12G


Service 配置


apiVersion: v1
kind: Service
metadata:  name: wordpress
  labels:    app: wordpress
spec:  ports:    - port: 80      targetPort: 80      nodePort: 30180  selector:    app: wordpress
  type: NodePort              # 类型为NodePort



ConfigMap 配置定义





apiVersion: v1
data:  db-host: mysql-sts   # 使用mysql的serviceName作为hostkind: ConfigMap
metadata:  name: mycm



Deployment 配置定义



apiVersion: apps/v1
kind: Deployment
metadata:  name: wordpress
  labels:    app: wordpress
spec:  selector:    matchLabels:      app: wordpress
  template:    metadata:      labels:        app: wordpress
    spec:      nodeSelector:        wordpress: mysql
      containers:        - image: wordpress:4.8-apache
          name: wordpress
          imagePullPolicy: IfNotPresent
          env:            - name: WORDPRESS_DB_HOST
              valueFrom:                configMapKeyRef:                  name: mycm
                  key: db-host                   # 读取configmap中定义的host            - name: WORDPRESS_DB_USER
              valueFrom:                secretKeyRef:                  name: mysecret                  # 使用mysecret配置,参考 mysql-sts.yaml  中定义的 Secret                  key: username
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:                secretKeyRef:                  name: mysecret                  # 使用mysecret配置,参考 mysql-sts.yaml  中定义的 Secret                  key: password
          ports:            - containerPort: 80              name: wordpress
          resources:            requests:              cpu: 0.5          volumeMounts:            - name: wordpress-local-storage
              readOnly: false              mountPath: /var/www/html          # 容器内部的卷path      volumes:        - name: wordpress-local-storage
          persistentVolumeClaim:                # 使用的PVC 为 pvc-wp            claimName: pvc-wp



完整的配置



wp-deploy.yaml


apiVersion: v1
kind: PersistentVolumeClaim
metadata:  name: pvc-wp
spec:  storageClassName: nfs-csi
  accessModes:  - ReadWriteMany
  resources:     requests:       storage: 12G
---apiVersion: v1
kind: Service
metadata:  name: wordpress
  labels:    app: wordpress
spec:  ports:    - port: 80      targetPort: 80      nodePort: 30180  selector:    app: wordpress
  type: NodePort
---apiVersion: v1
data:  db-host: mysql-sts   # 使用mysql的serviceName作为hostkind: ConfigMap
metadata:  name: mycm
---apiVersion: apps/v1
kind: Deployment
metadata:  name: wordpress
  labels:    app: wordpress
spec:  selector:    matchLabels:      app: wordpress
  template:    metadata:      labels:        app: wordpress
    spec:      nodeSelector:        wordpress: mysql
      containers:        - image: wordpress:4.8-apache
          name: wordpress
          imagePullPolicy: IfNotPresent
          env:            - name: WORDPRESS_DB_HOST
              valueFrom:                configMapKeyRef:                  name: mycm
                  key: db-host
            - name: WORDPRESS_DB_USER
              valueFrom:                secretKeyRef:                  name: mysecret                  # 使用mysecret配置,参考 mysql-sts.yaml  中定义的 Secret                  key: username
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:                secretKeyRef:                  name: mysecret                  # # 使用mysecret配置,参考 mysql-sts.yaml  中定义的 Secret                  key: password
          ports:            - containerPort: 80              name: wordpress
          resources:            requests:              cpu: 0.5          volumeMounts:            - name: wordpress-local-storage
              readOnly: false              mountPath: /var/www/html
      volumes:        - name: wordpress-local-storage
          persistentVolumeClaim:            claimName: pvc-wp



安装 wordpress



kubectl apply -f  wp-deploy.yaml -n wp



部署ingress



wp-ingress.yaml 相关配置



apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:  name: ing-wordpress
spec:  ingressClassName: nginx
  rules:  - host: wp.tuling.com
    http:      paths:      - pathType: Prefix
        path: "/"        backend:          service:            name: wordpress
            port:              number: 80



注意:


spec.ingressClassName: 需要指定的 部署ingress-nginx 时,创建的ingressClass。


可以通过命令 kubectl get ingressclass , 进行查看。



╰─# kubectl get ingressclass -n ingress-nginx
NAME    CONTROLLER             PARAMETERS   AGE
nginx   k8s.io/ingress-nginx   <none>       4d22h
╭─root@k201 ~/k8s/hpa 
╰─#


安装 wp-ingress.yaml



kubectl apply -f wp-ingress.yaml -n wp


查看ingress 和 ingress-nginx-controller 是否绑定成功


╰─# kubectl get ingress -n wp
NAME            CLASS   HOSTS           ADDRESS         PORTS   AGE
ing-wordpress   nginx   wp.tuling.com   10.20.143.255   80      102m

查看到 CLASS 和 ADDRESS 绑定了值,说明已创建成功。


使用 `wp.tuling.com`   访问


访问前需要在宿主机上 配置  ip 和 host之间的映射。

如图所示:

image.png


访问地址: `http://wp.tuling.com:30180/`


这里的 端口号 `30180`   ingress-nginx-controller 的 NodePort 的端口号


通过一下命令查看:


╰─# kubectl get svc -n ingress-nginx 
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.20.143.255   <none>        80:32091/TCP,443:32029/TCP   2d20h
ingress-nginx-controller-admission   ClusterIP   10.20.129.109   <none>        443/TCP                      2d20h
╭─root@k201 ~/k8s/k8s-ingress 
╰─#













相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
5月前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。
|
4月前
|
存储 关系型数据库 MySQL
MySQL Docker 容器化部署全指南
MySQL是一款开源关系型数据库,广泛用于Web及企业应用。Docker容器化部署可解决环境不一致、依赖冲突问题,实现高效、隔离、轻量的MySQL服务运行,支持数据持久化与快速迁移,适用于开发、测试及生产环境。
758 5
|
5月前
|
存储 弹性计算 关系型数据库
如何通过控制台创建RDS MySQL实例
本文介绍了通过控制台创建RDS MySQL实例的详细步骤,包括准备工作、选择计费方式、地域、实例规格、存储空间等关键配置,并指导用户完成下单与实例查看。
|
11月前
|
运维 数据可视化 关系型数据库
使用 Websoft9 运维面板部署和维护 WordPress 到底有多简单?
如何实现 WordPress 极速部署?Websoft9 通过应用商店一键安装与可视化运维管理,10 分钟完成零门槛上线。
379 1
|
6月前
|
存储 关系型数据库 MySQL
【赵渝强老师】MySQL数据库的多实例环境
MySQL多实例是指在一台服务器上运行多个MySQL服务,通过不同端口提供独立的数据服务。各实例共享安装程序,但使用各自的配置文件和数据文件,实现资源高效利用。本文详细介绍了如何通过“mysqld_multi”工具配置和启动多个MySQL实例,并演示了目录创建、初始化、配置文件修改及实例启动等操作步骤。
293 1
|
6月前
|
关系型数据库 MySQL 数据库
为什么 MySQL 不推荐用 Docker 部署?
本文探讨了MySQL是否适合容器化的问题,分析了Docker容器在数据安全、性能瓶颈、状态管理及资源隔离等方面的挑战,并指出目前主流分布式数据库如TDSQL和OceanBase仍倾向于部署在物理机或KVM上。
333 0
|
9月前
|
Java 关系型数据库 MySQL
在Linux平台上进行JDK、Tomcat、MySQL的安装并部署后端项目
现在,你可以通过访问http://Your_IP:Tomcat_Port/Your_Project访问你的项目了。如果一切顺利,你将看到那绚烂的胜利之光照耀在你的项目之上!
473 41
|
数据可视化 NoSQL 开发者
国内免费高效部署WordPress方案探索之Websoft9多应用托管实践
在数字化普及的当下,WordPress 成为众多开发者和企业的建站首选。然而国内缺乏高效免费的部署方案。本文对比主流平台后推荐 **Websoft9**:其具备一键部署、多应用托管、性能优越、技术体系完善等优势,支持 WordPress 与其他系统的集成,适配阿里云、华为云等主流平台,是当前最值得尝试的开源建站方案之一。
216 0
国内免费高效部署WordPress方案探索之Websoft9多应用托管实践
|
9月前
|
开发框架 Java 关系型数据库
在Linux系统中安装JDK、Tomcat、MySQL以及部署J2EE后端接口
校验时,浏览器输入:http://[your_server_IP]:8080/myapp。如果你看到你的应用的欢迎页面,恭喜你,一切都已就绪。
602 17
|
9月前
|
Java 关系型数据库 MySQL
在Linux操作系统上设置JDK、Tomcat、MySQL以及J2EE后端接口的部署步骤
让我们总结一下,给你的Linux操作系统装备上最强的军队,需要先后装备好JDK的弓箭,布置好Tomcat的阵地,再把MySQL的物资原料准备好,最后部署好J2EE攻城车,那就准备好进军吧,你的Linux军团,无人可挡!
226 18

推荐镜像

更多