写点什么

运维进阶训练营 -W14H

作者:赤色闪电
  • 2023-03-21
    北京
  • 本文字数:2637 字

    阅读完需:约 9 分钟

  1. WordPress 示例中:

使用 StatefulSet 编排运行 MySQL,实例数为 1:

部署思路:

  • 创建 Kubernetes 集群

  • 创建一个 MySQL 镜像

  • 创建一个 PVC(Persistent Volume Claim),用于存储 MySQL 数据

  • 创建一个 Service,用于提供 MySQL 服务

  • 创建一个 StatefulSet,用于运行 MySQL 实例

具体操作步骤:

  1. 创建 PVC:

apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: mysql-pv-claimspec:  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 1Gi
复制代码
  1. 创建 Service:

apiVersion: v1kind: Servicemetadata:  name: mysql  labels:    app: mysqlspec:  ports:    - name: mysql      port: 3306      targetPort: 3306  selector:    app: mysql
复制代码
  1. 创建 StatefulSet:

apiVersion: apps/v1kind: StatefulSetmetadata:  name: mysqlspec:  selector:    matchLabels:      app: mysql  serviceName: mysql  replicas: 1  template:    metadata:      labels:        app: mysql    spec:      containers:        - name: mysql          image: mysql:5.7          env:            - name: MYSQL_ROOT_PASSWORD              value: "password"          ports:            - containerPort: 3306              name: mysql          volumeMounts:            - name: mysql-persistent-storage              mountPath: /var/lib/mysql  volumeClaimTemplates:    - metadata:        name: mysql-persistent-storage      spec:        accessModes:          - ReadWriteOnce        resources:          requests:            storage: 1Gi
复制代码

换成使用 Operator 编排运行 MySQL,实例数为 1+:

部署思路:

  • 安装 MySQL Operator

  • 创建一个 MySQLCluster 对象,指定副本数

具体操作步骤:

  1. 安装 MySQL Operator:

kubectl create namespace mysql-operatorhelm repo add presslabs https://presslabs.github.io/chartshelm install mysql-operator presslabs/mysql-operator --namespace mysql-operator
复制代码
  1. 创建 MySQLCluster 对象:

apiVersion: mysql.presslabs.org/v1alpha1kind: MySQLClustermetadata:  name: mysqlclusterspec:  replicas: 1
复制代码

将 MySQL 以传统模型的主从复制的形式运行于 Kubernetes 外部,让运行在 Kubernetes 集群上的 WordPress 去访问外部的 MySQL 服务:

部署思路:

  • 在 Kubernetes 集群外部搭建 MySQL 主从复制集群

  • 在 Kubernetes 内部创建一个 Service,将外部 MySQL 主节点的 IP 地址暴露给 WordPress

具体操作步骤:

  1. 在 Kubernetes 集群外部搭建 MySQL 主从复制集群,具体操作步骤可以参考 MySQL 官方文档:https://dev.mysql.com/doc/refman/8.0/en/replication.html

  2. 在 Kubernetes 内部创建一个 Service:

apiVersion: v1kind: Servicemetadata:  name: mysqlspec:  type: ExternalName  externalName: <mysql-master-ip-address>  ports:    - port: 3306      name: mysql
复制代码
  1. WordPress 实例扩展至多个,测试应用是否工作正常:

部署思路:

  • 扩展 WordPress Deployment 的副本数

  • 创建一个 Service,用于提供 WordPress 服务

具体操作步骤:

  1. 扩展 WordPress Deployment 的副本数:

kubectl scale deployment wordpress --replicas=3
复制代码
  1. 创建一个 Service:

apiVersion: v1kind: Servicemetadata:  name: wordpressspec:  ports:    - name: http      port: 80      targetPort: 80  selector:    app: wordpress  type: LoadBalancer
复制代码
  1. Nginx 实例扩展至多个,测试应用是否工作正常;额外为 Nginx 添加 HTTPS 虚拟主机:

部署思路:

  • 扩展 Nginx Deployment 的副本数

  • 创建一个 ConfigMap

配置 HTTPS 证书和 Nginx 配置文件

  • 创建一个 Secret,用于存储 HTTPS 证书

  • 修改 Nginx 配置文件,添加 HTTPS 虚拟主机

  • 创建一个 Service,用于提供 Nginx 服务

具体操作步骤:

  1. 扩展 Nginx Deployment 的副本数:

kubectl scale deployment nginx --replicas=3
复制代码
  1. 创建一个 ConfigMap,用于存储 HTTPS 证书和 Nginx 配置文件:

apiVersion: v1kind: ConfigMapmetadata:  name: nginx-configdata:  default.conf: |    server {        listen 80;        server_name example.com;        location / {            proxy_pass http://wordpress;            proxy_set_header Host $host;            proxy_set_header X-Real-IP $remote_addr;        }    }  ssl.conf: |    server {        listen 443 ssl;        server_name example.com;        ssl_certificate /etc/nginx/ssl/cert.pem;        ssl_certificate_key /etc/nginx/ssl/key.pem;        location / {            proxy_pass http://wordpress;            proxy_set_header Host $host;            proxy_set_header X-Real-IP $remote_addr;        }    }
复制代码
  1. 创建一个 Secret,用于存储 HTTPS 证书:

kubectl create secret tls tls-secret --cert=cert.pem --key=key.pem
复制代码
  1. 修改 Nginx 配置文件,添加 HTTPS 虚拟主机:

apiVersion: apps/v1kind: Deploymentmetadata:  name: nginxspec:  replicas: 1  selector:    matchLabels:      app: nginx  template:    metadata:      labels:        app: nginx    spec:      containers:        - name: nginx          image: nginx:latest          volumeMounts:            - name: nginx-config              mountPath: /etc/nginx/conf.d            - name: tls-secret              mountPath: /etc/nginx/ssl              readOnly: true          ports:            - name: http              containerPort: 80            - name: https              containerPort: 443      volumes:        - name: nginx-config          configMap:            name: nginx-config        - name: tls-secret          secret:            secretName: tls-secret
复制代码
  1. 创建一个 Service,用于提供 Nginx 服务:

apiVersion: v1kind: Servicemetadata:  name: nginxspec:  ports:    - name: http      port: 80      targetPort: 80    - name: https      port: 443      targetPort: 443  selector:    app: nginx  type: LoadBalancer
复制代码

注意:以上操作仅供参考,具体操作可能需要根据实际情况进行调整。

发布于: 刚刚阅读数: 4
用户头像

赤色闪电

关注

还未添加个人签名 2018-05-30 加入

还未添加个人简介

评论

发布
暂无评论
运维进阶训练营 -W14H_赤色闪电_InfoQ写作社区