k8s-部署实例(mysql+wordpress)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 安装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搭建和管理企业级网站应用
相关文章
|
12天前
|
Kubernetes Java Docker
利用(K8S)配合Docker部署jar包
通过Docker打包并部署到Kubernetes(K8S)集群的过程。首先,通过SpringBoot生成jar包,接着在K8S环境中创建并编辑Dockerfile文件。随后构建Docker镜像,并将其推送到镜像仓库。最后,通过一系列kubectl命令(如get pods、get svc、logs等),展示了如何在K8S中管理应用,包括查看Pod状态、服务信息、Pod日志以及重启Pod等操作。
69 2
|
10天前
|
存储 Kubernetes 负载均衡
CentOS 7.9二进制部署K8S 1.28.3+集群实战
本文详细介绍了在CentOS 7.9上通过二进制方式部署Kubernetes 1.28.3+集群的全过程,包括环境准备、组件安装、证书生成、高可用配置以及网络插件部署等关键步骤。
81 3
CentOS 7.9二进制部署K8S 1.28.3+集群实战
|
10天前
|
NoSQL 关系型数据库 Redis
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
mall在linux环境下的部署(基于Docker容器),docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongodb、minio详细教程,拉取镜像、运行容器
mall在linux环境下的部署(基于Docker容器),Docker安装mysql、redis、nginx、rabbitmq、elasticsearch、logstash、kibana、mongo
|
10天前
|
Kubernetes 负载均衡 前端开发
二进制部署Kubernetes 1.23.15版本高可用集群实战
使用二进制文件部署Kubernetes 1.23.15版本高可用集群的详细教程,涵盖了从环境准备到网络插件部署的完整流程。
22 2
二进制部署Kubernetes 1.23.15版本高可用集群实战
|
10天前
|
Linux pouch 容器
CentOS7部署阿里巴巴开源的pouch容器管理工具实战
关于如何在CentOS 7.6操作系统上安装和使用阿里巴巴开源的Pouch容器管理工具的实战教程。
45 2
CentOS7部署阿里巴巴开源的pouch容器管理工具实战
|
10天前
|
存储 关系型数据库 MySQL
使用Docker快速部署Mysql服务器
本文介绍了如何使用Docker快速部署MySQL服务器,包括下载官方MySQL镜像、启动容器、设置密码、连接MySQL服务器以及注意事项。
81 18
|
1天前
|
Kubernetes 应用服务中间件 nginx
Kubernetes上安装Metallb和Ingress并部署应用程序
Kubernetes上安装Metallb和Ingress并部署nginx应用程序,使用LoadBalancer类型的KubernetesService
15 2
|
9天前
|
存储 Kubernetes Ubuntu
Ubuntu 22.04LTS版本二进制部署K8S 1.30+版本
这篇文章详细介绍了在Ubuntu 22.04 LTS系统上使用VMware Fusion虚拟化软件部署Kubernetes 1.30+版本的完整过程,包括环境准备、安装containerd、配置etcd、生成证书、部署高可用组件、启动Kubernetes核心组件以及网络插件的部署和故障排查。
38 4
|
10天前
|
Kubernetes Ubuntu 网络安全
Ubuntu基于kubeadm快速部署K8S实战
关于如何在Ubuntu系统上使用kubeadm工具快速部署Kubernetes集群的详细实战指南。
50 2
|
10天前
|
Kubernetes Linux API
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇
该博客文章详细介绍了在CentOS 7.6操作系统上使用kubeadm工具部署kubernetes 1.17.2版本的测试集群的过程,包括主机环境准备、安装Docker、配置kubelet、初始化集群、添加节点、部署网络插件以及配置k8s node节点管理api server服务器。
38 0
CentOS 7.6使用kubeadm部署k8s 1.17.2测试集群实战篇

热门文章

最新文章