在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

