3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Hyper.shのServerless kubernetes Pi を体験しました

Posted at

hyper.sh といたら、VM(runV)でコンテナを実装しよりセキュリティの CaaS を提供するサービスで知られています。Docker と同じの操作で、リモートに Docker のコンテナを起動し、自分はなんのインフラの管理もしなくて、コストも低くて、すごく便利なサービスです。

この hyper.sh 最近、Hyper は Serverless の Kubernetes サービス Pi をラウンチしました。どんなサービスなのか、興味深くて試してみました。

Pi のクライアントをインストールする

まずはクライント(Pi)をインストールするが必要です。

Pi のソースが GitHub にあがっていますので、自分がソースからビルドもできますし、リリースページ からビルド済みのバイナリをダンロードもできます。

Pi バイナリを PATH におけば、インストールは終わりとなります。

次にユーザの情報(認証情報)を設定しておきましょう。

$ pi config set-credentials myuser --access-key="xxx" --secret-key="yyy"

access-keysecret-keyhttps://console.hyper.sh/account/credential から確認してください。もしなれば、あたらしいのを作成してください。

そしたら一つのコマンドを実行しましょう(基本的に kubectl と同じの使い方)。

$ pi get services
No resources found.

Service のリソースがないため、何も返ってきませんでした。

Wordpress サービスを立ち上がります

Pi は K8s の Pod、Service と Secret をサポートする以外に、Volume(今は GCP の Persistent Disk )と FIP(外部からサービスをアクセスためのIPアドレス)もサポートしています。

ここに例として、Wordpress + MySQL の環境を構築し、データの長期保存のために、それぞれに Volume を使ってデータを格納します。Wordpress から MySQL のアクセスは K8s のサービス(Service Discovery)を利用して、外部から Wordpress をアクセスできるために、LoadBalance の Service を作成し、FIPを利用します。

具体の手順は下記となります。

PDを作ります

hyper.sh は昔から Volume という概念がありまして、Pi にもそれを使えます。後ろに GCE の PD が使われています( Pi 自体は今 GCE 上動いています)。

$ pi create volume mysql-data --size=10
volume/mysql-data

$ pi create volume wp-data --size=10
volume/wp-data

$ pi get volumes
NAME        ZONE               SIZE(GB)  CREATEDAT                  POD
mysql-data  gcp-us-central1-c  10        2018-05-26T07:04:14+00:00
wp-data     gcp-us-central1-c  10        2018-05-27T07:43:52+00:00

Wordpress と MySQL 用の PD を一つずつを作成しました。

FIP(Float IP)を作成します

$ pi create fip
fip/35.184.xxx.xxx

$ pi get fip
FIP             NAME  CREATEDAT                  SERVICES
35.184.xxx.xxx        2018-05-25T04:45:56+00:00

外部からはこの 35.184.xxx.xxx という IP を利用し Wordpress サービスをアクセスできます。

K8s の Secret を利用し MySQL のパスワードを設定します

YOUR_REAL_MYSQL_PASSWORD を自分のパスワードを書き換えてください。

# mysql-secret.yaml
kind: Secret
apiVersion: v1
metadata:
  name: mysql-password
data:
  password: <YOUR_REAL_MYSQL_PASSWORD>

あとは Secret を作りましょう。

$ pi create -f mysql-secret.yaml

次は Wordpress の Service を見てみましょう。

MySQL を立上ます

まずは MySQL の Pod です。

これも K8s のそのものが使えます。要注意のは PD(Volume)の使い方です。

Volume には必ず flexVolume を使わなければなりません、そして、Volume の Name をoptions.volumeID に設定することです。

# mysql-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  containers:
  - image: mariadb:10.3.6
    name: mysql
    args:
      - "--ignore-db-dir"
      - "lost+found"
    env:
      - name: MYSQL_ROOT_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysql-password
            key: password
    ports:
      - containerPort: 3306
        name: mysql
    resources:
      limits:
          memory: 1000Mi
      requests:
          memory: 1000Mi
    volumeMounts:
        # name must match the volume name below
      - name: mysql-data
        # mount path within the container
        mountPath: /var/lib/mysql
  volumes:
    - name: mysql-data
      flexVolume:
        options:
          # volumes from `pi get volumes`
          volumeID: mysql-data

MySQL は外部にサービスを提供することはないですから、クラスタ IP のないサービスを使えば十分だと思います。

# mysql-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  clusterIP: None
  selector:
    app: mysql
  ports:
    - name: tcp-3306
      port: 3306
      protocol: TCP
      targetPort: 3306

あとは Pod と Service を作成すます。

$ pi create -f mysql-pod.yaml -f mysql-service.yaml

Wordpress を立上ます

これも基本的に K8s の Service と同じです。気をつけなければならないの二箇所です。

  • typeLoadBalancer に固定すること
  • loadBalancerIP をほんものの YOUR_REAL_FIP を書き換えてください
# wordpress-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  ports:
    - name: tcp-80
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: wordpress
  type: LoadBalancer
  loadBalancerIP: <YOUR_REAL_FIP>

Wordpress の Pod も Volume を利用しています( Theme と Plugin などを格納するため)。

# wordpress-pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  containers:
  - name: wordpress
    image: wordpress:4.9.5-apache
    env:
    - name: WORDPRESS_DB_HOST
      value: mysql
    - name: WORDPRESS_DB_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-password
          key: password
    ports:
    - containerPort: 80
      name: wordpress
    volumeMounts:
      - name: wp-data
        mountPath: /var/www/html
  volumes:
    - name: wp-data
      flexVolume:
        options:
          # volumes from `pi get volumes`
          volumeID: wp-data

Wordpress の Pod と Service を作りましょう。

$ pi create -f wordpress-pod.yaml -f wordpress-service.yaml

全部のリソースをできているため、下記のコマンドを使って確認できます。

$ pi get pods
NAME        READY     STATUS    RESTARTS   AGE
mysql       1/1       Running   1          1d
wordpress   1/1       Running   1          1d

$ pi get services
NAME        TYPE           CLUSTER-IP      LOADBALANCER-IP   PORT(S)    AGE
mysql                      None            <unknown>         3306/TCP   1d
wordpress   LoadBalancer   10.97.136.zzz   35.184.xxx.yyy    80/TCP     1d

$ pi get secrets
NAME             TYPE      DATA      AGE
mysql-password             1         1d

問題がなければ、ブラウザに先作成した FIP をアクセスすれば、 Wordpress の初期化画面が表示されると思います。

終わりに

すべての K8s リソースをサポートしていないですが、基本の Pod と Service があれば、普通のHTTPサービス、CI/CD 処理など十分に利用できると思います。

一番魅力のは、K8s 風の使い方で、インフラの管理入らないというところです。

でも Deployment がいまだにサポートされていないため、Pod のライフサイクルを自部が管理しなければなりません、もし何らかの原因で Pod が落ちったら、自分が手動で回復させない限り、K8s(Pi)も何もしてくれないという点を覚悟しておきましょう。

Cloud Native というのは、ある意味から言うと、なんでも自分がやり通すことをやめ、できるだけ外部のサービスを利用することがおすすめでしょうか。

参考:

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?