k8s-部署实例(mysql+wordpress)

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 安装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 
╰─#













相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务&nbsp;ACK 容器服务&nbsp;Kubernetes&nbsp;版(简称&nbsp;ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情:&nbsp;https://www.aliyun.com/product/kubernetes
相关文章
|
1月前
|
存储 SQL 关系型数据库
创建并配置RDS实例
在阿里云上创建RDS实例涉及登录控制台、进入RDS管理页面、创建实例、选择数据库引擎和版本、配置实例规格与存储、设定网络与安全组、设置实例信息、确认订单并支付,最后初始化数据库。操作步骤可能因界面更新或数据库引擎不同略有差异。
20 1
|
17小时前
|
关系型数据库 MySQL
MySQL基础(二:常用数据类型及MySQL创建过程实例)
MySQL基础(二:常用数据类型及MySQL创建过程实例)
MySQL基础(二:常用数据类型及MySQL创建过程实例)
|
4天前
|
关系型数据库 MySQL 数据库
一台MySQL数据库启动多个实例
一台MySQL数据库启动多个实例
|
1月前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
422 1
|
1月前
|
存储 Kubernetes 关系型数据库
KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/4)
KubeSphere 核心实战之一【在kubesphere平台上部署mysql】(实操篇 1/4)
49 0
|
1月前
|
关系型数据库 MySQL 数据库
初始化RDS实例
初始化RDS实例
15 3
|
1月前
|
SQL 关系型数据库 MySQL
购买阿里云RDS实例
购买阿里云RDS实例
167 2
|
1月前
|
弹性计算 关系型数据库 MySQL
连接RDS实例
连接RDS实例
12 1
|
1月前
|
SQL 关系型数据库 MySQL
MySQL多实例部署:从概念到实操的全面指南
MySQL多实例部署:从概念到实操的全面指南
40 0
|
Kubernetes 开发者 微服务
简化Kubernetes应用部署工具-Helm之Hook
微服务和容器化给复杂应用部署与管理带来了极大的挑战。Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernetes的apt-get / yum,由Deis 公司发起,该公司已经被微软收购。
1563 0