如何在Kuberbetes中运行WordPress
说明
在本教程中,将指导我们完成在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将自动检测更改并更新部署的声明状态。