k8s-部署实例(mysql+wordpress)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 安装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 
╰─#













相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 关系型数据库 MySQL
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
131 1
|
2月前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
56 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
26天前
|
关系型数据库 MySQL 应用服务中间件
测评部署和管理 WordPress 最方便的面板
本文介绍了如何使用Websoft9面板轻松搭建WordPress网站,相比宝塔和1Panel,Websoft9简化了Nginx和MySQL的配置步骤,实现了快速一键部署。用户只需在应用商店中搜索WordPress,选择版本和端口后等待几分钟即可完成安装,随后通过提供的链接进入WordPress界面,轻松启动个人网站。
|
1月前
|
关系型数据库 MySQL 数据库
【赵渝强老师】启动与关闭MySQL数据库实例
MySQL数据库安装完成后,可以通过命令脚本启动、查看状态、配置开机自启、查看自启列表及关闭数据库。本文提供了详细的操作步骤和示例代码,并附有视频讲解。
|
2月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
84 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
2月前
|
存储 关系型数据库 MySQL
mysql 8.0 的 建表 和八种 建表引擎实例
mysql 8.0 的 建表 和八种 建表引擎实例
29 0
|
2月前
|
存储 关系型数据库 MySQL
Key_Value 形式 存储_5级省市城乡划分代码 (mysql 8.0 实例)
本文介绍了如何使用MySQL8.0数据库中的Key_Value形式存储全国统计用区划代码和城乡划分代码(5级),包括导入数据、通过数学函数提取省市区信息,以及查询5级行政区划的详细数据。
37 0
|
2月前
|
算法 关系型数据库 MySQL
复购率 mysql 实例(sample database classicmodels _No.1 )
复购率 mysql 实例(sample database classicmodels _No.1 )
33 0
|
2月前
|
Kubernetes 关系型数据库 MySQL
k8s学习--利用helm部署应用mysql,加深helm的理解
k8s学习--利用helm部署应用mysql,加深helm的理解
267 0
|
6天前
|
存储 Kubernetes 关系型数据库
阿里云ACK备份中心,K8s集群业务应用数据的一站式灾备方案
本文源自2024云栖大会苏雅诗的演讲,探讨了K8s集群业务为何需要灾备及其重要性。文中强调了集群与业务高可用配置对稳定性的重要性,并指出人为误操作等风险,建议实施周期性和特定情况下的灾备措施。针对容器化业务,提出了灾备的新特性与需求,包括工作负载为核心、云资源信息的备份,以及有状态应用的数据保护。介绍了ACK推出的备份中心解决方案,支持命名空间、标签、资源类型等维度的备份,并具备存储卷数据保护功能,能够满足GitOps流程企业的特定需求。此外,还详细描述了备份中心的使用流程、控制台展示、灾备难点及解决方案等内容,展示了备份中心如何有效应对K8s集群资源和存储卷数据的灾备挑战。