k8s-部署实例(mysql+wordpress)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 安装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搭建和管理企业级网站应用
相关文章
|
6天前
|
存储 关系型数据库 MySQL
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
环比、环比增长率、同比、同比增长率 ,占比,Mysql 8.0 实例(最简单的方法之一)(sample database classicmodels _No.2 )
25 1
|
6天前
|
SQL 前端开发 关系型数据库
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
17 0
全表数据核对 ,行数据核对,列数据核对,Mysql 8.0 实例(sample database classicmodels _No.3 )
|
11天前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
104 60
|
12天前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
109 62
|
8天前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
32 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
4天前
|
存储 关系型数据库 MySQL
mysql 8.0 的 建表 和八种 建表引擎实例
mysql 8.0 的 建表 和八种 建表引擎实例
11 0
|
6天前
|
存储 关系型数据库 MySQL
Key_Value 形式 存储_5级省市城乡划分代码 (mysql 8.0 实例)
本文介绍了如何使用MySQL8.0数据库中的Key_Value形式存储全国统计用区划代码和城乡划分代码(5级),包括导入数据、通过数学函数提取省市区信息,以及查询5级行政区划的详细数据。
12 0
|
6天前
|
算法 关系型数据库 MySQL
复购率 mysql 实例(sample database classicmodels _No.1 )
复购率 mysql 实例(sample database classicmodels _No.1 )
14 0
|
10天前
|
NoSQL 关系型数据库 Redis
高可用和性能:基于ACK部署Dify的最佳实践
本文介绍了基于阿里云容器服务ACK,部署高可用、可伸缩且具备高SLA的生产可用的Dify服务的详细解决方案。
|
20天前
|
Kubernetes Cloud Native 云计算
云原生之旅:Kubernetes 集群的搭建与实践
【8月更文挑战第67天】在云原生技术日益成为IT行业焦点的今天,掌握Kubernetes已成为每个软件工程师必备的技能。本文将通过浅显易懂的语言和实际代码示例,引导你从零开始搭建一个Kubernetes集群,并探索其核心概念。无论你是初学者还是希望巩固知识的开发者,这篇文章都将为你打开一扇通往云原生世界的大门。
90 17