如何在 Ubuntu 18.04 上使用 Kubernetes 部署 PHP 应用程序

作者选择了 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产品文档以获得最新的信息和教程。 <$>

前提条件

步骤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:nginxtier: 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密钥,秘密使用datastringData密钥来保留所需的信息。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: phptier: 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:phptier: 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:nginxtier: 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 服务,以便您可以独立管理它们. 这种方法不仅会提高您项目的可扩展性,而且还将允许您高效地使用资源。

Published At
Categories with 技术
comments powered by Disqus