引言
Kubernetes是一个开源的容器编排系统。它允许你创建、更新和扩展容器,而无需担心停机。
要运行一个PHP应用程序,Nginx充当PHP-FPM的代理。将此设置打包到单个容器中可能是一个繁琐的过程,但Kubernetes将帮助在不同的容器中管理这两个服务。使用Kubernetes将允许你保持容器的可重用性和可交换性,并且不必在每次有新版本的Nginx或PHP时重新构建容器镜像。
在本教程中,你将在Kubernetes集群上部署一个PHP7应用程序,其中Nginx和PHP-FPM运行在不同的容器中。你还将学习如何使用CSDN 开发云的对象存储系统将配置文件和应用程序代码保存在容器映像之外。这种方法将允许你通过传递配置卷,为任何需要Web的应用程序重用Nginx镜像,而不是重新构建镜像。
先决条件
对 Kubernetes 有初步了解。如果你没有接触过 k8s,也完全可以按照教程完成php程序部署,在通过学习k8s官方文档 了解 k8s 的各个组件
整个教程大概用时 10 分钟 至 20 分钟。
步骤1 - 创建k8s环境
本教程采用CSDN 开发云提供了k8s学习环境,一键创建了k8s环境。CSDN 开发云k8s 学习环境按小时付费使用,每小时仅 0.1元。学习完毕后可以释放主机资源即会停止计费。
点这里一键拥有 k8s 环境。
你也可以使用其他方法创建自己的k8s集群。
点击【立即购买】后,几分钟后你可以拥有自己的k8s集群。
使用 ssh 终端工具登录云主机,接下来的步骤都在终端中进行
步骤2- 创建PHP-fpm和Nginx服务
在本步骤中,你将创建PHP-FPM和Nginx服务。服务允许从集群内访问一组Pod。集群内的服务可以通过它们的名称直接访问,而不需要IP地址。PHP-FPM服务将允许访问PHP-FPM pod,而nginx服务将允许访问nginx pod。
由于Nginx Pod将代理PHP-FPM Pod,因此你需要告诉服务如何找到它们。与使用IP地址不同,你将利用Kubernetes的自动服务发现功能,使用名称将请求路由到对应的服务。
要创建服务,你需要创建一个对象定义文件。每个Kubernetes对象定义都是一个至少包含以下项的YAML文件:
apiVersion
: 定义所属的Kubernetes接口版本kind
: 该文件所代表的Kubernetes对象,例如:pod 或 servicemetadata
: 它包含对象的名称
以及你可能想要应用到它的任何Labels
spec
: 它包含一个特定的配置,具体取决于你创建的对象的类型,例如容器镜像或容器将从其上访问的端口。
首先,你将创建一个目录来保存你的Kubernetes对象定义。
通过SSH连接到你的主节点,并创建存放你的Kubernetes对象定义的definitions
目录。
mkdir definitions
导航到新创建的definitions
目录:
cd definitions
创建php_service.yaml
文件来创建你的PHP-fpm服务:
vi php_service.yaml
设置kind
为Service
,表示该对象为服务:
apiVersion: v1
kind: Service
将服务命名为php
,因为它将提供对PHP-fpm的访问:
php_service.yaml
...
metadata:
name: php
你将使用标签对不同的对象进行逻辑分组。在本教程中,你将使用标签将对象分组为“层”,如前端或后端。PHP实例将运行在该服务的后面,因此你需要将其标记为tier:backend
。
...
labels:
tier: backend
服务使用`选择器‘标签来确定要访问哪些实例。无论Pod是在服务之前还是之后创建的,都将服务与这些标签匹配的Pod。在本教程的后面部分,你将为Pod添加标签。
使用tier:backend
标签将实例分配到后端层。你还需要添加app:php
标签,以指定该实例运行PHP。将这两个标签添加到metadata
部分之后。
...
spec:
selector:
app: php
tier: backend
接下来,指定用于访问此服务的端口。在本教程中,你将使用端口9000
。添加到spec
下的php_service.yaml
文件中:
...
ports:
- protocol: TCP
port: 9000
完成的php_service.yaml
文件将如下所示:
apiVersion: v1
kind: Service
metadata:
name: php
labels:
tier: backend
spec:
selector:
app: php
tier: backend
ports:
- protocol: TCP
port: 9000
点击CTRL+O
保存文件,点击CTRL+X
退出nano
。
现在你已经为你的服务创建了对象定义,要运行服务,你将使用kubectl apply
命令和-f
参数,并指定你的php_service.yaml
文件。
用以下命令创建你的服务:
kubectl apply -f php_service.yaml
命令输出如下:
service/php created
验证你的服务是否正在运行:
kubectl get svc
你将看到你的PHP-fpm服务正在运行:
Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 10m
php ClusterIP 10.43.76.123 <none> 9000/TCP 5m
Kubernetes支持多种服务类型。你的php
服务使用默认服务类型ClusterIP
。此服务类型分配一个内部IP,并使该服务只能从群集中访问。
现在已经准备好了PHP-fpm服务,你将创建nginx服务。使用编辑器创建并打开一个名为nginx_service.yaml
的新文件:
nano nginx_service.yaml
此服务针对的是Nginx实例,因此你将其命名为nginx
。你还需要添加一个tier:backend
标签,因为它属于后端层:
nginx_service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
tier: backend
与php
服务类似,使用选择器标签app:nginx
和tier:backend
来定位实例。使此服务可以在默认的HTTP端口80
上访问。
nginx_service.yaml
...
spec:
selector:
app: nginx
tier: backend
ports:
- protocol: TCP
port: 80
你的nginx_service.yaml
文件将如下所示:
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
tier: backend
spec:
selector:
app: nginx
tier: backend
ports:
- protocol: TCP
port: 80
保存并关闭该文件。创建nginx服务:
kubectl apply -f nginx_service.yaml
当服务运行时,你将看到以下输出:
service/nginx created
你可以通过执行以下命令来查看所有正在运行的服务:
kubectl get svc
你将在输出中看到列出的PHP-fpm和nginx服务:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.43.0.1 <none>