在Kubernetes集群上部署WordPress
说明
在本教程中,将指导我们如何在Kubernetes平台上部署WordPress。该指令可用于任何Kubernetes集群,无论是本地集群,GKE(Google Kubernetes引擎),AKS(Azure Kubernetes服务)还是EKS(弹性Kubernetes服务)。
本教程的第一部分将向我们展示如何在Kubernetes中启动第一个WordPress实例。
Kubernetes豆荚
Kubernetes在称为Pod的结构中运行容器,这是Kubernetes集群的最小原子单元。所有容器都在Kubernetes容器内运行,但是容器不等于容器。
每个Pod为网络和存储提供一个共享的命名空间。多个容器可以在单个容器中运行,其中每个容器都可以访问相同的网络名称空间和存储。尽管可以在单个Pod中运行多个容器,但是最佳实践是将每个应用程序部署到Kubernetes都有自己的Pod。
我们可能会问自己,如果不是最佳实践,为什么为什么要允许在单个容器中运行多个容器。问题的答案是,这使我们可以将实用程序容器添加到我们的pod上,例如日志聚合器。
为了使Pod成功启动,其中的所有容器必须成功执行。如果应用程序容器启动,但是日志记录或者应用程序监视容器失败,则容器将不会转换为运行状态。
创建一个WordPress Pod
要创建我们的第一个WordPress吊舱,我们需要在YAML中创建声明性配置。该配置为声明式,因为我们正在指示Kubernetes为Pod设置所需的状态。
创建一个名为wordpress-blog.yml的YAML文件
--- apiVersion: v1 kind: Pod metadata: name: wordpress-blog spec: containers: - name: wordpress-blog image: wordpress:5.2 env: - name: WORDPRESS_DB_HOST value: database.host.name:3306 - name: WORDPRESS_DB_NAME value: wordpress - name: WORDPRESS_DB_PREFIX value: myblog_
在Kubernetes中创建配置
kubectl create -f wordpress-blog.yml
create命令的输出将显示请求状态,因此将立即知道是否成功创建了容器。要列出正在运行的吊舱,我们将使用kubectl get命令。
kubectl get pods
输出将类似于以下内容,具体取决于集群中正在运行的Pod数量以及要查询的Kubernetes命名空间。
NAME READY STATUS RESTARTS AGE wordpress-blog 1/1 Running 0 65s
获取Pod详细信息
kubectl get命令只会向我们显示有关Pod的基本信息。要详细了解pod的配置和状态,我们将使用kubectl describe命令。
kubectl describe pods wordpress-blog
Name: wordpress-blog Namespace: default Priority: 0 PriorityClassName: Node: worker/192.168.1.131 Start Time: Sat, 18 May 2019 06:38:16 -0400 Labels: Annotations: cni.projectcalico.org/podIP: 172.20.1.56/32 Status: Running IP: 172.20.1.56 Containers: wordpress-blog: Container ID: docker://f9b860f167fb990992cc4c0d57e51f7934bb58cd377848e0cbf90dfc4d0fc42b Image: wordpress:5.2 Image ID: docker-pullable://Hyman@localhost:8eb650ebbc8ea8bf743e046967c06a789c43c4baa46252013faf3c6f5ddd0d58 Port: Host Port: State: Running Started: Sat, 18 May 2019 06:38:18 -0400 Ready: True Restart Count: 0 Environment: WORDPRESS_DB_HOST: database.host.name:3306 WORDPRESS_DB_NAME: wordpress WORDPRESS_DB_PREFIX: myblog_ Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-x8jnp (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-x8jnp: Type: Secret (a volume populated by a Secret) SecretName: default-token-x8jnp Optional: false QoS Class: BestEffort Node-Selectors: Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m40s default-scheduler Successfully assigned default/wordpress-blog to worker Normal Pulling 7m40s kubelet, worker pulling image "wordpress:5.2" Normal Pulled 7m38s kubelet, worker Successfully pulled image "wordpress:5.2" Normal Created 7m38s kubelet, worker Created container Normal Started 7m38s kubelet, worker Started container
对Pod使用describe命令对于解决问题很有用。 "事件"部分位于输出的底部,提供了一个窗口,该窗口显示了为运行Pod中的容器而执行的活动,如果在容器执行期间发生任何错误,则将在此处输出。
更新Pod
广告连播的状态在其整个生命周期中都不太可能保持静态。我们可能需要在某个时候进行更新,例如更新WordPress版本。
要更新广告连播,我们首先需要更新用于创建广告连播的wordpress-blog.yml文件。然后,使用kubectl apply应用新配置。
kubectl apply -f wordpress-blog.yml
创建WordPress Pod部署
Kubernetes部署用于为Pod设置所需的部署状态。例如,我们可以设置要运行的Pod的副本数。
创建一个WordPress服务
Pod在设计上是临时的,因此它们不是暴露于其他服务或者公共Internet的良好选择。相反,当我们要公开运行在Pod中的应用程序时,必须创建服务定义。
服务定义设置如何在网络上公开服务。有多个选项可供选择,而我们选择的一个将用于服务的特定用例。
负载均衡器
负载均衡器服务类型将为服务分配一个可路由的公共IP地址。设置的负载均衡器将由Kubernetes网络设置确定。例如,如果集群在GKE或者Digital Ocean中运行,则将配置一个计算负载平衡器。
节点端口
节点级别的服务类型将使用节点本地的端口公开服务。要访问服务,将使用运行Pod的Kubernetes节点的IP地址。
集群IP
集群服务类型会将服务公开给整个Kubernetes集群。此类型对于将内部服务公开给其他服务和Pod很有用。例如,如果我们在集群中运行数据库服务,则不太可能需要暴露给Internet。相反,我们可以将公开范围限制为仅在集群中运行的资源。
创建服务
创建名为wordpress-blog-service.yml的新文件,并将以下内容添加到文件中。
--- apiVersion: v1 kind: Service metadata: name: wordpress-blog-service spec: type: LoadBalancer selector: application: wordpress-blog ports: - port: 80 targetPort: - port: 80
要将服务定义添加到应用程序,请使用选择器。选择器的应用程序密钥中指定的值是pod或者部署yaml文件中的名称密钥值。
使用kubectl apply命令创建服务。
kubectl apply -f wordpress-blog-service.yml