Fusic Tech Blog

Fusion of Society, IT and Culture

Knativeで始めるServerlessPHP
2019/09/22

Knativeで始めるServerlessPHP

Serverlessしてますか?

今日はKnativeを利用したServerless PHPをしてみます。

そもそもKnativeとは

公式サイトの言葉を借りると、最新のサーバーレス ワークロードをビルド、デプロイ、管理できる Kubernetes ベースのプラットフォームです。

以下のコンポーネントを提供します。

  • Build
  • Serving
  • Eventing

KubernetesベースのpodsをゼロスケールでDeploy出来て、イベントベースでスケールさせることが出来ます。

まずはHello World - PHPをGKE上にて実行してみようと思います。

PHPファイル

まずは普通にPHPファイル(index.php)を作成

<?php
$target = getenv('TARGET', true) ?: 'World';
echo sprintf("Hello %s!", $target);

Dockerfile

Knativeで利用するPHPコンテナ用のDockerfileを作成します

# Use the official PHP 7.3 image.
# https://hub.docker.com/_/php
FROM php:7.3-apache

# Copy local code to the container image.
COPY index.php /var/www/html/

# Use the PORT environment variable in Apache configuration files.
RUN sed -i 's/80/${PORT}/g' /etc/apache2/sites-available/000-default.conf /etc/apache2/ports.conf

# Configure PHP for development.
# Switch to the production php.ini for production operations.
# RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
# https://hub.docker.com/_/php#configuration
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

DockerHub

コンテナをビルド後、Knativeが利用出来るリポジトリにコンテナをPushします。
今回はDocker Hubを利用します。

$ docker build -t seike460/helloworld-php .
$ docker push seike460/helloworld-php

GKE上にクラスターを作成

Knative用のクラスターを作成します。
--machine-type オプションで適切なマシンタイプを設定しましょう。

seike460@cloudshell:~ (knative-php)$ gcloud container clusters create seike460 --zone=asia-northeast2

Knativeの設定

istioインストール

seike460@cloudshell:~ (knative-php)$ kubectl apply -f https://github.com/knative/serving/releases/download/v0.9.0/serving-v1-crds.yaml
seike460@cloudshell:~ (knative-php)$ kubectl apply -f https://github.com/knative/serving/releases/download/v0.9.0/serving-istio.yaml

istio を有効化

default ネームスペースでistio を有効化します

seike460@cloudshell:~ (knative-php)$ kubectl label namespace default istio-injection=enabled

Knativeインストール

seike460@cloudshell:~ (knative-php)$ kubectl apply -f https://github.com/knative/serving/releases/download/v0.9.0/serving.yaml
seike460@cloudshell:~ (knative-php)$ kubectl apply -f https://github.com/knative/eventing/releases/download/v0.9.0/release.yaml
seike460@cloudshell:~ (knative-php)$ kubectl apply -f https://github.com/knative/serving/releases/download/v0.9.0/monitoring.yaml

service.yamlを作成

service用のyamlを作成して適用します

apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: helloworld-php
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: docker.io/seike460/helloworld-php
          env:
            - name: TARGET
              value: "PHP Sample v1"

Deployします。

seike460@cloudshell:~ (knative-php)$ kubectl apply -f service.yaml

動作確認

公開IPを取得

istioのingressgatewayが公開しているIPを取得します。

seike460@cloudshell:~ (knative-php)$ kubectl get svc istio-ingressgateway --namespace istio-system

Serviceに紐付けられたドメインを取得

VirtualHostで公開している為、公開されているドメインを取得します。

seike460@cloudshell:~ (knative-php)$ kubectl get ksvc helloworld-php
NAME             DOMAIN                               LATESTCREATED          LATESTREADY            READY   REASON
helloworld-php   helloworld-php.default.example.com   helloworld-php-z8k6r   helloworld-php-z8k6r   True

接続

curlでHostヘッダーつける、もしくは「/etc/hosts」に設定を書いてアクセスします。

$ curl -H "Host: helloworld-php.default.example.com" http://xxx.xxx.xxx.xxx
$ Hello PHP Sample v1!

GKE上のKnativeでHello Worldすることが出来ました。
Serverlessの利用環境として注目されるKnativeですがもっと本格的に触ってみようと思います

Shiro Seike

Shiro Seike

Company:Fusic CO., LTD. Slides:slide.seike460.com blog:blog.seike460.com Program Language:PHP , Go , Elixir infrastructure:Server , Network , infrastructure as code Frontend:Vue.js Interest:Full Serverless Architecture