作者选择了 Electronic Frontier Foundation作为 写给捐款计划的一部分,以获得捐款。
介绍
Kubernetes 是一个开源集装箱管制系统,允许您创建、更新和扩展集装箱,而不必担心停机时间。
要运行一个 PHP 应用程序,Nginx 将作为代理代理服务作为 PHP-FPM。在单个容器中集装此设置可能是一个繁琐的过程,但Kubernetes 将有助于在单独的容器中管理这两个服务。使用Kubernetes 将允许您保持容器可重复使用和可交换,并且您不必每次有新的版本的 Nginx 或 PHP 重建您的容器图像。
在此教程中, 您将会在 Kubernetes 集群上部署 PHP 7 应用程序, 其中 Nginx 和 PHP- FPM 在单独的容器中运行 。 您还将学习如何使用 [数字海洋块存储] (https://www.digitalocean.com/products/block-storage/] 系统在容器图像外保存您的配置文件和应用程序代码 。 这种方法将允许您重新使用Nginx图像用于任何需要网络/代理服务器的应用程序,方法是通过配置音量,而不是重建图像.
<$>[注] 注: 本教程已在使用Kubeadm(https://kubernetes.io/docs/reference/setup-tools/kubeadm/)制作的Kubernetes集群上进行测试,这与DigitalOcean Managed Kubernetes(DOKS)产品显著不同。 如果您正在使用DOKS,请查看我们的官方 DigitalOcean Kubernetes产品文档以获得最新的信息和教程。 <$>
前提条件
- 对Kubernetes物体的基本理解。 请查看我们的Kubernetes入门文章以了解更多信息。
- Ubuntu 18.04上运行的Kubernetes集群。 您可以在 Ubuntu 18. 04 (https://andsky.com/tech/tutorials/how-to-create-a-kubernetes-cluster-using-kubeadm-on-ubuntu-18-04) 上遵循 [如何创建 Kubernetes 1. 14 集群 使用 Kubeadm 设置此功能。
- DigitalOcean账户和API访问令牌,有读写权限创建我们的存储量. 如果您没有您的 API 访问符, 您可以 [从这里创建] ([ LINK2] ) 。
- 联合国 您的应用程序代码托管在一个可公开访问的 URL 上, 例如 [Github] (https://github.com ) 。 .
步骤1:创建 PHP-FPM 和 Nginx 服务
在此步骤中,您将创建 PHP-FPM 和 Nginx 服务. 一项服务允许从集群内部访问一组 pods. 集群内的服务可以通过其名称直接通信,而无需 IP 地址。
由于 Nginx pods 会代理 PHP-FPM pods,您将需要告诉服务如何找到它们,而不是使用 IP 地址,您将利用 Kubernetes 的自动服务发现来使用可人读的名称将请求路由到相应的服务。
要创建该服务,您将创建一个对象定义文件. 每个 Kubernetes 对象定义都是包含至少以下内容的 YAML 文件:
apiVersion
:定义所属的 Kubernetes API 的版本. *type
: 此文件代表了 Kubernetes 对象. 例如,一个pod
或服务
. *metadata
: 此包含对象的名称
以及您可能想要应用的 `标签。
首先,您将创建一个目录,以保留您的 Kubernetes 对象定义。
SSH到您的 主节点 ,并创建定义
目录,该目录将包含您的Kubernetes对象定义。
1mkdir definitions
导航到新创建的定义
目录:
1cd definitions
通过创建一个 php_service.yaml
文件来创建您的 PHP-FPM 服务:
1nano php_service.yaml
将类型
设置为服务
,以指定该对象是服务:
1[label php_service.yaml]
2apiVersion: v1
3kind: Service
命名服务php
,因为它将提供访问PHP-FPM:
1[label php_service.yaml]
2...
3metadata:
4 name: php
在本教程中,您将使用标签将对象分为层
,如前端或后端。
1[label php_service.yaml]
2...
3 labels:
4 tier: backend
一个服务通过使用选择器
标签来确定哪些Pod可以访问。将提供匹配这些标签的Pod,无论该Pod是否在服务之前或之后被创建,您将在教程中稍后添加您的Pod标签。
使用tier: backend
标签将pod分配到后端层中,您还会添加app:php
标签来指定这个pod运行PHP。
1[label php_service.yaml]
2...
3spec:
4 selector:
5 app: php
6 tier: backend
接下来,指定用于访问此服务的端口. 在本教程中,您将使用端口 9000
. 在 spec
下将其添加到 php_service.yaml
文件中:
1[label php_service.yaml]
2...
3 ports:
4 - protocol: TCP
5 port: 9000
完成的php_service.yaml文件将看起来像这样:
1[label php_service.yaml]
2apiVersion: v1
3kind: Service
4metadata:
5 name: php
6 labels:
7 tier: backend
8spec:
9 selector:
10 app: php
11 tier: backend
12 ports:
13 - protocol: TCP
14 port: 9000
点击CTRL + O
来保存文件,然后点击CTRL + X
来退出nano
。
现在你已经为你的服务创建了对象定义,要运行该服务,你将使用kubectl应用
命令以及-f
参数,并指定你的php_service.yaml
文件。
创建您的服务:
1kubectl apply -f php_service.yaml
此输出证实了服务的创建:
1[secondary_label Output]
2service/php created
检查您的服务是否正在运行:
1kubectl get svc
您将看到您的 PHP-FPM 服务运行:
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 10m
4php ClusterIP 10.100.59.238 <none> 9000/TCP 5m
Kubernetes 支持的各种 服务类型 您的 php
服务使用默认服务类型, ClusterIP
. 此服务类型分配一个内部 IP,并使服务只能从集群中访问。
现在 PHP-FPM 服务已经准备好了,您将创建 Nginx 服务. 使用编辑器创建并打开名为 'nginx_service.yaml' 的新文件:
1nano nginx_service.yaml
此服务将针对 Nginx pods,所以你会命名它为nginx
。你还会添加一个tier: backend
标签,因为它属于后端层:
1[label nginx_service.yaml]
2apiVersion: v1
3kind: Service
4metadata:
5 name: nginx
6 labels:
7 tier: backend
与php
服务类似,以选择标签app:nginx
和tier: backend
来瞄准 pods。
1[label nginx_service.yaml]
2...
3spec:
4 selector:
5 app: nginx
6 tier: backend
7 ports:
8 - protocol: TCP
9 port: 80
Nginx 服务将从您的 Droplet 的公共 IP 地址向互联网公开访问。 your_public_ip
可从您的 DigitalOcean 控制面板找到。 在 spec.externalIPs
下方,添加:
1[label nginx_service.yaml]
2...
3spec:
4 externalIPs:
5 - your_public_ip
你的「nginx_service.yaml」檔案會看起來像這樣:
1[label nginx_service.yaml]
2apiVersion: v1
3kind: Service
4metadata:
5 name: nginx
6 labels:
7 tier: backend
8spec:
9 selector:
10 app: nginx
11 tier: backend
12 ports:
13 - protocol: TCP
14 port: 80
15 externalIPs:
16 - your_public_ip
保存并关闭文件 创建 Nginx 服务:
1kubectl apply -f nginx_service.yaml
当服务运行时,您将看到以下输出:
1[secondary_label Output]
2service/nginx created
您可以通过执行以下方式查看所有正在运行的服务:
1kubectl get svc
您将看到输出中列出的 PHP-FPM 和 Nginx 服务:
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
3kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m
4nginx ClusterIP 10.102.160.47 your_public_ip 80/TCP 50s
5php ClusterIP 10.100.59.238 <none> 9000/TCP 8m
请注意,如果你想删除一个服务,你可以运行:
1kubectl delete svc/service_name
现在您已经创建了 PHP-FPM 和 Nginx 服务,您需要指定存储应用程序代码和配置文件的位置。
步骤 2 — 安装 DigitalOcean 存储插件
Kubernetes 提供不同的存储插件,可为您的环境创建存储空间. 在此步骤中,您将安装 DigitalOcean 存储插件 以创建 区块存储 在 DigitalOcean. 安装完成后,它将添加一个名为 do-block-storage
的存储类,您将使用它来创建您的区块存储。
您首先将配置一个 Kubernetes 秘密对象来存储您的 DigitalOcean API 代币。 秘密对象用于与相同名称空间内的其他 Kubernetes 对象共享敏感信息,例如 SSH 密钥和密码。
使用编辑器打开名为'secret.yaml' 的文件:
1nano secret.yaml
您将命名您的秘密对象digitalocean
,并将其添加到cube-system
的名称空间中。
1[label secret.yaml]
2apiVersion: v1
3kind: Secret
4metadata:
5 name: digitalocean
6 namespace: kube-system
代替spec
密钥,秘密使用data
或stringData
密钥来保留所需的信息。data
参数持有基于64编码的数据,在检索时自动解密。stringData
参数持有在创建或更新过程中自动编码的非编码数据,而在检索 Secrets时不会输出数据。
将访问符号
添加为stringData
:
1[label secret.yaml]
2...
3stringData:
4 access-token: your-api-token
保存和退出文件。
你的「secret.yaml」檔案會看起來像這樣:
1[label secret.yaml]
2apiVersion: v1
3kind: Secret
4metadata:
5 name: digitalocean
6 namespace: kube-system
7stringData:
8 access-token: your-api-token
创造秘密:
1kubectl apply -f secret.yaml
你會看到這個結果在秘密創造:
1[secondary_label Output]
2secret/digitalocean created
您可以使用以下命令查看秘密:
1kubectl -n kube-system get secret digitalocean
结果将看起来像这样:
1[secondary_label Output]
2NAME TYPE DATA AGE
3digitalocean Opaque 1 41s
)。 DATA
字段显示了这个秘密中存储的项目数量。 在这种情况下,它显示了 1
因为您存储了单个密钥。
现在你的秘密已经到位,安装 DigitalOcean区块存储插件:
1kubectl apply -f https://raw.githubusercontent.com/digitalocean/csi-digitalocean/master/deploy/kubernetes/releases/csi-digitalocean-v1.1.0.yaml
您将看到类似于以下的输出:
1[secondary_label Output]
2csidriver.storage.k8s.io/dobs.csi.digitalocean.com created
3customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io created
4customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io created
5customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io created
6storageclass.storage.k8s.io/do-block-storage created
7statefulset.apps/csi-do-controller created
8serviceaccount/csi-do-controller-sa created
9clusterrole.rbac.authorization.k8s.io/csi-do-provisioner-role created
10clusterrolebinding.rbac.authorization.k8s.io/csi-do-provisioner-binding created
11clusterrole.rbac.authorization.k8s.io/csi-do-attacher-role created
12clusterrolebinding.rbac.authorization.k8s.io/csi-do-attacher-binding created
13clusterrole.rbac.authorization.k8s.io/csi-do-snapshotter-role created
14clusterrolebinding.rbac.authorization.k8s.io/csi-do-snapshotter-binding created
15daemonset.apps/csi-do-node created
16serviceaccount/csi-do-node-sa created
17clusterrole.rbac.authorization.k8s.io/csi-do-node-driver-registrar-role created
18clusterrolebinding.rbac.authorization.k8s.io/csi-do-node-driver-registrar-binding created
19error: unable to recognize "https://raw.githubusercontent.com/digitalocean/csi-digitalocean/master/deploy/kubernetes/releases/csi-digitalocean-v1.1.0.yaml": no matches for kind "VolumeSnapshotClass" in version "snapshot.storage.k8s.io/v1alpha1"
对于本教程,无视错误是安全的。
现在你已经安装了DigitalOcean存储插件,你可以创建区块存储来存储你的应用程序代码和配置文件。
步骤 3 – 创建持久卷
有了您的秘密,并安装了区块存储插件,您现在已经准备好创建您的 Persistent Volume。 Persistent Volume,或PV,是指定的尺寸的区块存储,独立于pod的生命周期。使用 Persistent Volume将允许您管理或更新您的pods,而不必担心失去您的应用程序代码。
使用您的编辑器打开名为 code_volume.yaml
的文件:
1nano code_volume.yaml
通过将以下参数和值添加到您的文件来命名PVC代码
:
1[label code_volume.yaml]
2apiVersion: v1
3kind: PersistentVolumeClaim
4metadata:
5 name: code
对于PVC的品种
包含以下物品:
这些是: - 'ReadWriteOnce' - 按单个节点按读写编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑
DigitalOcean区块存储仅安装到单个节点,所以你会将accessModes
设置为ReadWriteOnce
。本教程将引导你通过添加少量的应用程序代码,所以1GB在这种用例中将是足够的。如果你计划存储大量的代码或数据在体积上,你可以修改存储
参数以满足你的要求。你可以增加体积创建后的存储量,但缩小磁盘不受支持。
1[label code_volume.yaml]
2...
3spec:
4 accessModes:
5 - ReadWriteOnce
6 resources:
7 requests:
8 storage: 1Gi
接下来,指定 Kubernetes 将用来提供卷的存储类别,您将使用由 DigitalOcean 区块存储插件创建的 do-block-storage
类别。
1[label code_volume.yaml]
2...
3 storageClassName: do-block-storage
您的code_volume.yaml
文件将看起来如下:
1[label code_volume.yaml]
2apiVersion: v1
3kind: PersistentVolumeClaim
4metadata:
5 name: code
6spec:
7 accessModes:
8 - ReadWriteOnce
9 resources:
10 requests:
11 storage: 1Gi
12 storageClassName: do-block-storage
保存和退出文件。
使用kubectl
创建 PVC 的代码
:
1kubectl apply -f code_volume.yaml
下面的输出告诉你,该对象已成功创建,你已经准备好将你的1GBPVC作为一个体积。
1[secondary_label Output]
2persistentvolumeclaim/code created
查看可用的持久量(PV):
1kubectl get pv
您将看到您的PV列表:
1[secondary_label Output]
2NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
3pvc-ca4df10f-ab8c-11e8-b89d-12331aa95b13 1Gi RWO Delete Bound default/code do-block-storage 2m
上面的字段是您配置文件的概述,除)获取有关回收政策
和状态
的更多信息。
您使用 DigitalOcean 区块存储插件成功创建了持久量,现在您的持久量已经准备好了,您将使用部署创建您的 pods。
第4步:创建一个PHP-FPM部署
在此步骤中,您将学习如何使用部署来创建您的 PHP-FPM pod. 部署提供了使用 ReplicaSets创建,更新和管理 pods 的统一方式。
部署spec.selector
键将列出它将管理的 pods 的标签,还将使用模板
键创建所需的 pods。
此步骤还将介绍使用Init集装箱。 _Init集装箱_在pod的)中采集一个样本 index.php
文件,使用 wget
。这是样本文件的内容:
1[label index.php]
2<?php
3echo phpinfo();
要创建你的部署,打开一个名为php_deployment.yaml
的新文件与你的编辑器:
1nano php_deployment.yaml
此部署将管理您的 PHP-FPM 子组件,因此您将命名部署对象 php
. 子组件属于后端层,因此您将使用 tier: backend
标签将部署组合到此组中:
1[label php_deployment.yaml]
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: php
6 labels:
7 tier: backend
对于spec
的部署,您将指定使用replicas
参数来创建多少副本的pod。replicas
的数量将取决于您的需求和可用的资源。
1[label php_deployment.yaml]
2...
3spec:
4 replicas: 1
此部署将管理与app: php
和tier: backend
标签相匹配的 pods。
1[label php_deployment.yaml]
2...
3 selector:
4 matchLabels:
5 app: php
6 tier: backend
接下来,部署spec
需要你的pod对象定义的模板
。这个模板将定义创建pod的规格。 首先,你会添加用于php
服务selectors
和部署的matchLabels
的标签。 在template.metadata.labels
下添加app:php
和tier: backend
:
1[label php_deployment.yaml]
2...
3 template:
4 metadata:
5 labels:
6 app: php
7 tier: backend
一个Pod可以有多个容器和卷,但每个卷都需要一个名称. 您可以通过为每个卷指定一个安装路径来选择性地将卷集到一个容器中。
首先,指定您的容器将访问的卷。你创建了一个名为代码
的PVC代码,以保留你的应用程序代码,所以这个卷也命名为代码
。
1[label php_deployment.yaml]
2...
3 spec:
4 volumes:
5 - name: code
6 persistentVolumeClaim:
7 claimName: code
您可以在 Docker 商店,但在本教程中,您将使用 php:7-fpm
图像。
在spec.template.spec.containers
下方,添加以下内容:
1[label php_deployment.yaml]
2...
3 containers:
4 - name: php
5 image: php:7-fpm
接下来,您将安装容器需要访问的卷,此容器将运行您的PHP代码,因此需要访问代码
卷,您还将使用mountPath
来指定/code
作为安装点。
在spec.template.spec.containers.volumeMounts
下方,添加:
1[label php_deployment.yaml]
2...
3 volumeMounts:
4 - name: code
5 mountPath: /code
您可能以前使用了 FTP/SFTP 或克隆了代码通过 SSH 连接来实现这一点,但本步骤将向您展示如何使用 Init 容器复制代码。
根据安装过程的复杂性,您可以使用单个initContainer
来运行构建应用程序的脚本,或者您可以使用每个命令一个initContainer
。
在本教程中,您将使用单个busybox
的Init容器来下载代码。
在spec.template.spec
下,添加您的initContainer
,并指定busybox
图像:
1[label php_deployment.yaml]
2...
3 initContainers:
4 - name: install
5 image: busybox
您的 Init 容器将需要访问代码
卷,以便在该位置下载代码。
1[label php_deployment.yaml]
2...
3 volumeMounts:
4 - name: code
5 mountPath: /code
您的 Init 集装箱将使用 wget
来下载 代码从 Github到 /code
工作目录。 -O
选项给下载的文件一个名字,你将这个文件命名 index.php
。
<$>[注] 注: 请确保您信任您正在拖动的代码. 在将其拖到您的服务器之前,请检查源代码,以确保您对代码的使用感到满意。
在spec.template.spec.initContainers
中的安装
容器下,添加这些行:
1[label php_deployment.yaml]
2...
3 command:
4 - wget
5 - "-O"
6 - "/code/index.php"
7 - https://raw.githubusercontent.com/do-community/php-kubernetes/master/index.php
完成的php_deployment.yaml文件将看起来像这样:
1[label php_deployment.yaml]
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: php
6 labels:
7 tier: backend
8spec:
9 replicas: 1
10 selector:
11 matchLabels:
12 app: php
13 tier: backend
14 template:
15 metadata:
16 labels:
17 app: php
18 tier: backend
19 spec:
20 volumes:
21 - name: code
22 persistentVolumeClaim:
23 claimName: code
24 containers:
25 - name: php
26 image: php:7-fpm
27 volumeMounts:
28 - name: code
29 mountPath: /code
30 initContainers:
31 - name: install
32 image: busybox
33 volumeMounts:
34 - name: code
35 mountPath: /code
36 command:
37 - wget
38 - "-O"
39 - "/code/index.php"
40 - https://raw.githubusercontent.com/do-community/php-kubernetes/master/index.php
保存文件并离开编辑器。
使用kubectl
创建 PHP-FPM 部署:
1kubectl apply -f php_deployment.yaml
您将在部署创建时看到以下输出:
1[secondary_label Output]
2deployment.apps/php created
要总结一下,这个部署将从下载指定的图像开始,然后从你的PersistentVolumeClaim
中请求PersistentVolume
并连续运行你的initContainers
。完成后,容器将运行并将volumes
安装到指定的安装点。
您可以通过运行查看您的部署:
1kubectl get deployments
你会看到结果:
1[secondary_label Output]
2NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
3php 1 1 1 0 19s
此输出可以帮助您了解部署的现状. 部署 ' 是保持理想状态的[控制器之一]https://kubernetes.io/docs/concepts/workloads/controllers/deployment/。 你创建的 " 超时 " 规定,
DESIRED ' 状态将有一个被取名 " php " 的 " 复制 " 。 CURRENT ' 字段显示有多少复制品正在运行,因此这应与
DESIRED ' 状态相匹配。 您可以在 [库伯涅茨部署文件] (https://kubernetes.io/docs/concepts/workloads/controllers/deployment/) 中读取所剩的字段.
您可以查看这个部署以以下命令开始的 pods:
1kubectl get pods
此命令的输出取决于自创建部署以来花费了多少时间. 如果您在创建后不久运行该命令,输出可能会看起来如下:
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3php-86d59fd666-bf8zd 0/1 Init:0/1 0 9s
列代表了以下信息:
Ready
: 运行此 pod 的复制品
数量. *Status
: Pod 的状态.Init
表示 Init 容器正在运行. 在此输出中,0 个 Init 容器已完成运行. *Restarts
: 这个过程重新启动了多少次,以便启动 Pod. 如果您的任何 Init 容器失败,这个数字将增加。
根据您的启动脚本的复杂性,将需要几分钟才能将状态更改为podInitializing
:
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3php-86d59fd666-lkwgn 0/1 podInitializing 0 39s
这意味着Init集装箱已经完成,集装箱正在初始化. 如果在所有集装箱运行时运行命令,您将看到pod状态更改为运行
。
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3php-86d59fd666-lkwgn 1/1 Running 0 1m
现在你可以看到你的 Pod 正在成功运行. 如果你的 Pod 无法启动,你可以使用以下命令来调试:
- 查看一个pod的详细信息:
1kubectl describe pods pod-name
- 查看由 pod 生成的日志:
1kubectl logs pod-name
- 在 pod 中查看特定容器的日志:
1kubectl logs pod-name container-name
您的应用程序代码已安装,PHP-FPM 服务已准备好处理连接,您现在可以创建您的 Nginx 部署。
第5步:创建 Nginx 部署
在此步骤中,您将使用 ConfigMap 来配置 Nginx. 一个 ConfigMap 将您的配置保存在一个关键值格式中,您可以在其他 Kubernetes 对象定义中参考。
使用您的编辑器为 ConfigMap 创建一个 nginx_configMap.yaml
文件:
1nano nginx_configMap.yaml
将 ConfigMap 命名为nginx-config
,并将其组合为tier: backend
微服务:
1[label nginx_configMap.yaml]
2apiVersion: v1
3kind: ConfigMap
4metadata:
5 name: nginx-config
6 labels:
7 tier: backend
接下来,您将为 ConfigMap 添加)。
由于Kubernetes 可以将请求路由到适当的服务主机,因此您可以在fastcgi_pass
参数中输入您的 PHP-FPM 服务的名称,而不是其 IP 地址。
1[label nginx_configMap.yaml]
2...
3data:
4 config : |
5 server {
6 index index.php index.html;
7 error_log /var/log/nginx/error.log;
8 access_log /var/log/nginx/access.log;
9 root /code;
10
11 location / {
12 try_files $uri $uri/ /index.php?$query_string;
13 }
14
15 location ~ \.php$ {
16 try_files $uri =404;
17 fastcgi_split_path_info ^(.+\.php)(/.+)$;
18 fastcgi_pass php:9000;
19 fastcgi_index index.php;
20 include fastcgi_params;
21 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
22 fastcgi_param PATH_INFO $fastcgi_path_info;
23 }
24 }
您的「nginx_configMap.yaml」文件将看起来如下:
1[label nginx_configMap.yaml]
2apiVersion: v1
3kind: ConfigMap
4metadata:
5 name: nginx-config
6 labels:
7 tier: backend
8data:
9 config : |
10 server {
11 index index.php index.html;
12 error_log /var/log/nginx/error.log;
13 access_log /var/log/nginx/access.log;
14 root /code;
15
16 location / {
17 try_files $uri $uri/ /index.php?$query_string;
18 }
19
20 location ~ \.php$ {
21 try_files $uri =404;
22 fastcgi_split_path_info ^(.+\.php)(/.+)$;
23 fastcgi_pass php:9000;
24 fastcgi_index index.php;
25 include fastcgi_params;
26 fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
27 fastcgi_param PATH_INFO $fastcgi_path_info;
28 }
29 }
保存文件并离开编辑器。
创建 ConfigMap:
1kubectl apply -f nginx_configMap.yaml
您将看到以下结果:
1[secondary_label Output]
2configmap/nginx-config created
您已完成创建 ConfigMap,现在可以构建您的 Nginx 部署。
首先,在编辑器中打开一个新的 nginx_deployment.yaml
文件:
1nano nginx_deployment.yaml
命名部署nginx
,并添加标签tier: backend
:
1[label nginx_deployment.yaml]
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: nginx
6 labels:
7 tier: backend
指定您希望在部署spec
中有一个复印件
。这个部署将管理带有标签app:nginx
和tier: backend
的 pods。
1[label nginx_deployment.yaml]
2...
3spec:
4 replicas: 1
5 selector:
6 matchLabels:
7 app: nginx
8 tier: backend
接下来,添加模板
。你需要使用你为部署添加的相同标签selector.matchLabels
。
1[label nginx_deployment.yaml]
2...
3 template:
4 metadata:
5 labels:
6 app: nginx
7 tier: backend
向 Nginx 提供您之前创建的代码
PVC。 在spec.template.spec.volumes
下,添加:
1[label nginx_deployment.yaml]
2...
3 spec:
4 volumes:
5 - name: code
6 persistentVolumeClaim:
7 claimName: code
Pods 可以将 ConfigMap 设置为卷。指定文件名和密钥将创建一个具有其内容值的文件。 若要使用 ConfigMap,请将‘path’设置为将包含‘key’内容的文件名称。 您希望从‘config’键创建一个‘site.conf’文件。 在‘spec.template.spec.volumes’下,添加以下内容:
1[label nginx_deployment.yaml]
2...
3 - name: config
4 configMap:
5 name: nginx-config
6 items:
7 - key: config
8 path: site.conf
<$>[警告] 警告 :如果没有指定文件,则密钥
的内容将取代卷的mountPath
。
此教程将使用)找到其他 Nginx 图像。
1[label nginx_deployment.yaml]
2...
3 containers:
4 - name: nginx
5 image: nginx:1.7.9
6 ports:
7 - containerPort: 80
Nginx 和 PHP-FPM 需要在相同的路径上访问该文件,所以将代码
卷定位为/code
:
1[label nginx_deployment.yaml]
2...
3 volumeMounts:
4 - name: code
5 mountPath: /code
nginx:1.7.9
图像将自动在/etc/nginx/conf.d
目录下加载任何配置文件。将config
卷集到此目录中,将创建/etc/nginx/conf.d/site.conf
文件。
1[label nginx_deployment.yaml]
2...
3 - name: config
4 mountPath: /etc/nginx/conf.d
您的「nginx_deployment.yaml」檔案會看起來像這樣:
1[label nginx_deployment.yaml]
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: nginx
6 labels:
7 tier: backend
8spec:
9 replicas: 1
10 selector:
11 matchLabels:
12 app: nginx
13 tier: backend
14 template:
15 metadata:
16 labels:
17 app: nginx
18 tier: backend
19 spec:
20 volumes:
21 - name: code
22 persistentVolumeClaim:
23 claimName: code
24 - name: config
25 configMap:
26 name: nginx-config
27 items:
28 - key: config
29 path: site.conf
30 containers:
31 - name: nginx
32 image: nginx:1.7.9
33 ports:
34 - containerPort: 80
35 volumeMounts:
36 - name: code
37 mountPath: /code
38 - name: config
39 mountPath: /etc/nginx/conf.d
保存文件并离开编辑器。
创建 Nginx 部署:
1kubectl apply -f nginx_deployment.yaml
以下输出表示您的部署现在已创建:
1[secondary_label Output]
2deployment.apps/nginx created
用这个命令列出你的部署:
1kubectl get deployments
您将看到 Nginx 和 PHP-FPM 部署:
1[secondary_label Output]
2NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
3nginx 1 1 1 0 16s
4php 1 1 1 1 7m
列出由两个部署管理的 pods:
1kubectl get pods
你会看到那些正在运行的子:
1[secondary_label Output]
2NAME READY STATUS RESTARTS AGE
3nginx-7bf5476b6f-zppml 1/1 Running 0 32s
4php-86d59fd666-lkwgn 1/1 Running 0 7m
现在所有Kubernetes对象都活跃,您可以在浏览器上访问Nginx服务。
列出正在运行的服务:
1kubectl get services -o wide
获取您的 Nginx 服务的外部 IP:
1[secondary_label Output]
2NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
3kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 39m <none>
4nginx ClusterIP 10.102.160.47 your_public_ip 80/TCP 27m app=nginx,tier=backend
5php ClusterIP 10.100.59.238 <none> 9000/TCP 34m app=php,tier=backend
在您的浏览器中,请通过键入)`的输出,并确认您的 Kubernetes 服务正在运行。
结论
在本指南中,您已集装了 PHP-FPM 和 Nginx 服务,以便您可以独立管理它们. 这种方法不仅会提高您项目的可扩展性,而且还将允许您高效地使用资源。