如何在Kuberbetes中运行WordPress

时间:2020-01-09 10:34:20  来源:igfitidea点击:

说明

在本教程中,将指导我们完成在Kubernetes上运行WordPress的过程。

我们将学习如何将WordPress Docker容器部署为Kubernetes Pod,添加持久性存储以存储主题,插件和上传的内容,以及将其连接到MySQL数据库。

本实验将引导我们完成Google GKE上的整个过程。

密码

秘密就是我们标记的所有不应该以明文形式显示的敏感信息。这包括到后端服务(例如数据库)的凭据。

由于WordPress必须连接到数据库(在我们的情况下为MySQL),因此我们必须创建一个Kubernetes Secret来存储我们的连接密码。

Kubernetes将秘密信息存储为Base64编码,因此我们需要做的第一件事就是将MySQL用户密码编码为Base64.

echo “my-super-secret-password | base64
c3VwZXItc2VjcmV0LXBhc3N3b3JkCg==

该命令的输出将类似于上面的示例。记下此输出,因为我们需要将其添加到秘密YAML文件中。

现在创建一个名为secrets.yml的新文件。

touch secrets.yml

将以下内容添加到secrets.yml中,将wordpress_db_password的值替换为base64编码的字符串。

---
apiVersion: v1
kind: Secret
metadata:
  name: myblog-secrets
type: Opaque
data:
  wordpress_db_password: c3VwZXItc2VjcmV0LXBhc3N3b3JkCg==

使用kubectl apply命令,我们会将数据库密码作为秘密存储在Kubernetes中。

Kubectl apply -f secrets.yml

创建Pod部署

吊舱是Kuberbetes的最小原子部分,每个吊舱内部至少有一个容器。 Pod拥有自己独立的命名空间,文件系统和网络堆栈,由封装在其中的所有容器共享。

部署是声明应如何部署Pod,包括应创建的副本数。尽管可以单独部署Pod资源,但可以使用部署来提高可用性。

为WordPress网站创建一个新的YAML文件。

touch myblog-deployment.yml

将以下内容添加到文件中。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: site1-deployment
  labels:
    app: site1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: site1
  template:
    metadata:
      labels:
        app: site1
    spec:
      containers:
        - name: app1
          image: wordpress:5.2
          ports:
            - containerPort: 80
          env:
            - name: WORDPRESS_DB_HOST
              value: 10.0.0.25:3306
            - name: WORDPRESS_DB_USER
              value: root
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: myblog-secrets
                  key: wordpress_db_password

运行kubectl create命令来创建WordPress容器及其部署资源。

kubectl apply -f myblog-deployment.yml

kubectl get deploys命令可用于列出所有已声明的部署以及每个状态。

kubectl get deployments

我们还需要检查Pod的状态,因为Pod的运行状况与部署的运行状况无关。要检查窗格的状态,请运行kubectl get pods命令。

kubectl get pods

创建服务资源

Pod是临时的,这意味着分配给它们的IP地址也是如此。在Kubernetes集群之外,pod的IP地址也无法路由,这是我创建的服务资源。

服务资源是静态的,并通过标签松散地耦合到它服务的容器。服务资源通过多种类型暴露在集群外部,每种类型都有其自身的特征。

提供以下服务类型:

  • 集群IP
  • 节点端口
  • 负载均衡器

ClusterIP仅可在Kubernetes群集内路由,并且对于应保留在内部的服务(例如,Web应用程序使用的应用程序的后端服务)的理想选择。

NodePort类型将服务绑定到群集中所有节点共享的特定端口。

最后,还有LoadBalancer类型,它将为服务分配其自己的公共可路由IP地址。 LoadBalancer类型是云功能,除MetalLB之外,其可用性取决于云网络。

当我们运行托管的Kubernetes集群(例如GKE,AKS或者DigitalOceans Kubernetes)时,LoadBalancer类型将触发与服务绑定的计算负载均衡器的设置。

我们将创建一个LoadBalancer类型的服务,因为这是将服务公开给公共Internet的最常见方法。

创建一个新文件以配置WordPress网站的服务资源。

touch myblog-service.yml

向其中添加以下内容。

---
apiVersion: v1
kind: Service
metadata:
  name: site1-service
spec:
  type: LoadBalancer
  selector:
    app: site1
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80

使用kubectl apply命令为myblog网站创建服务。

kubectl apply -f myblog-service.yml

我们可以使用kubectl get svc命令监视服务的状态。使用LoadBalancer类型时,会为其分配一个公共IP地址,此过程可能需要一两分钟才能完成。

kubectl get svc

添加持久性存储

默认情况下,容器是临时的,这意味着当Pod停止时,添加到我们博客中的所有插件,主题或者上载都将消失。为了在Pod生命周期之间保留数据,我们将需要在其上添加存储卷。

在Kubernetes中,添加存储是一个两步过程。我们必须首先创建一个存储声明,在其中定义存储本身,然后配置Pod以将存储声明挂载为卷。

创建永久存储声明

在云环境中运行时,我们可以单独创建存储声明。该声明通常会创建一个与Kubernetes存储声明资源中声明的状态匹配的计算磁盘卷。

我们将为所有博客内容(包括主题,插件和上传)创建一个持久卷。这是确保在重新创建我们的广告连播时这些项目仍然存在的要求。

创建一个名为myblog-wpcontent-storage.yml的新文件。

touch mybog-wpcontent-storage.yml

并添加以下内容以创建1 GiB存储卷。

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: site1-disk
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

在Pod中挂载存储空间声明

要装入由声明产生的存储量,我们需要将零件添加到部署YAML文件中。第一个指示容器在何处安装卷,第二个指示将存储声明绑定到容器。

在部署模板部分的容器部分下添加以下行。

volumeMounts:
   - mountPath: "/var/www/wp-content"
     name: wpcontent

现在,在spec键下,添加以下内容以将存储声明分配给部署。

volumes:
  - name: wpcontent
    persistentVolumeClaim:
      claimName: site1-disk

现在,更新后的myblog-deployment.yml文件应类似于以下示例。

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: site1-deployment
  labels:
    app: site1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: site1
  template:
    metadata:
      labels:
        app: site1
    spec:
      containers:
        - name: app1
          image: wordpress:5.2
          ports:
            - containerPort: 80
          volumeMounts:
            - mountPath: "/var/www/wp-content"
              name: wpcontent
          env:
            - name: WORDPRESS_DB_HOST
              value: 10.0.0.25:3306
            - name: WORDPRESS_DB_USER
              value: root
            - name: WORDPRESS_DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: myblog-secrets
                  key: wordpress_db_password
      volumes:
        - name: wpcontent
          persistentVolumeClaim:
            claimName: site1-disk

使用kubectl apply命令将更改应用于部署。

kubectl apply -f myblog-deployment.yml

Kubernetes将自动检测更改并更新部署的声明状态。