此示例教程介绍如何在 vSphere IaaS control plane 环境中使用 vSphere Pod 部署 WordPress 应用程序。

WordPress 部署包括用于 WordPress 前端和 MySQL 后端的容器以及同时用于这两者的服务。此外,还需要密钥对象。

本教程使用一个部署对象。在生产环境中,通常对 WordPress 和 MySQL 容器使用 StatefulSet。

必备条件

部署 WordPress

使用此工作流时,可使用 vSphere Pod 来部署 WordPress 应用程序。

第 1 部分.访问命名空间

使用以下步骤访问命名空间。

过程

  1. 登录到主管。
     kubectl vsphere login --server=SVC-IP-ADDRESS --vsphere-username [email protected] 
  2. 切换到 vSphere 命名空间。
     kubectl config use-context VSPHERE-PODS-NAMESPACE
  3. 确认您创建的存储策略 (vwt-storage-policy) 在该命名空间中可用作存储类。

第 2 部分.创建 WordPress PVC

使用以下命令创建 WordPress PVC。

过程

  1. 创建 MySQL PVC。
     kubectl apply -f mysql-pvc.yaml
  2. 创建 WordPress PVC。
     kubectl apply -f wordpress-pvc.yaml
  3. 验证 PVC。
     kubectl get pvc,pv

第 3 部分.创建密钥

公共 Docker Hub 是 Kubernetes 的默认容器注册表。Docker Hub 现在会限制映像拉取。您需要拥有一个付费帐户,并将帐户密钥添加到密钥 YAML 中的 data.dockerconfigjson 字段。

过程

  1. 创建 Docker Hub 注册表密钥。
     kubectl apply -f regcred.yaml
  2. 创建 mysql 密码密钥。
    MySQL 数据库密码是必填项。在密钥中,密码需要以 base64 格式编码。
    kubectl apply -f mysql-pass.yaml
  3. 验证密钥。
    kubectl get secrets

第 4 部分.创建服务

按照以下步骤创建服务。

过程

  1. 创建 MySQL 服务。
    kubectl apply -f mysql-service.yaml
  2. 创建 WordPress 服务。
    kubectl apply -f wordpress-service.yaml
  3. 验证服务。
    kubectl get services

第 5 部分.创建 Pod 部署

使用此任务可创建 Pod 部署。

本教程使用部署对象。在生产环境中,应将 StatefulSet 同时用于 WordPress 和 MySQL 容器。

过程

  1. 创建 MySQL 部署。
    kubectl apply -f mysql-deployment-vsphere-pod.yaml
    注: 创建 vSphere Pod 时,系统会为 Pod 中的容器创建一个虚拟机。默认情况下,虚拟机具有 512 MB RAM 的限制。MySQL 容器需要更多内存。Pod 部署规范 mysql-deployment-vsphere-pod.yaml 包括一节,通过该节可增加为 vSphere Pod 虚拟机提供的内存。如果不包括此节,Pod 部署将失败,并显示内存不足 (OOM) 异常。将 MySQL Pod 部署到 TKG 集群时,不需要增加 RAM。
  2. 创建 WordPress 部署。
    kubectl apply -f wordpress-deployment.yaml
  3. 验证部署。
    kubectl get deployments	

第 6 部分.测试 WordPress

按照以下步骤测试 WordPress 部署。

过程

  1. 验证所有对象是否均已创建且正在运行。
    kubectl get pv,pvc,secrets,rolebinding,services,deployments,pods
  2. 从 WordPress 服务获取 EXTERNAL-IP 地址。
    kubectl get service wordpress
    
    NAME        TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)        AGE
    wordpress   LoadBalancer   10.96.9.180   10.197.154.73   80:30941/TCP   87s
  3. 浏览到 EXTERNAL-IP 地址。
  4. 配置 WordPress 实例。
    用户名:administrator
    密码:使用提供的强密码

WordPress 部署的示例 YAML 文件

使用 vSphere Pod 部署 WordPress 应用程序时,请使用以下示例 YAML 文件。

mysql-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: vwt-storage-policy
  resources:
    requests:
      storage: 20Gi

wordpress-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wordpress-pvc
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: vwt-storage-policy  
  resources:
    requests:
      storage: 20Gi

regcred.yaml

apiVersion: v1
kind: Secret
metadata:
  name: regcred
data:
  .dockerconfigjson: ewoJImF1dGhzIjog....zZG1KcE5WUmtXRUozWpc
type: kubernetes.io/dockerconfigjson

mysql-pass.yaml

apiVersion: v1
data:
  password: YWRtaW4=  #admin base64 encoded
kind: Secret
metadata:
  name: mysql-pass

mysql-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  ports:
    - port: 3306
  selector:
    app: wordpress
    tier: mysql
  clusterIP: None

wordpress-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - port: 80
  selector:
    app: wordpress
    tier: frontend
  type: LoadBalancer

mysql-deployment-vsphere-pod.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress-mysql
  labels:
    app: wordpress
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: wordpress
      tier: mysql
  template:
    metadata:
      labels:
        app: wordpress
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        #increased resource limits required for this pod vm
        #default pod VM RAM is 512MB; MySQL container needs more 
        #without extra RAM OOM error prevents deployment
        #extra RAM not required for Kuberentes cluster
        resources:
          limits:
            memory: 1024Mi
            cpu: 1
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pvc
      imagePullSecrets:
      - name: regcred  

wordpress-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  selector:
    matchLabels:
      app: wordpress
      tier: frontend
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: wordpress
        tier: frontend
    spec:
      containers:
      - image: wordpress:4.8-apache
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: wordpress-mysql
        - name: WORDPRESS_DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql-pass
              key: password
        ports:
        - containerPort: 80
          name: wordpress
        volumeMounts:
        - name: wordpress-persistent-storage
          mountPath: /var/www/html
      volumes:
      - name: wordpress-persistent-storage
        persistentVolumeClaim:
          claimName: wordpress-pvc
      imagePullSecrets:
      - name: regcred