Alibaba CloudでACKを使ってk8s上でWordpressを運用してみよう(ACRからのコンテナイメージデプロイ）

# はじめに 
みなさん、コンテナイメージレジストリ使っていますか？
コンテナを管理する際に使うマネージドサービスがコンテナイメージレジストリです。
AWSであれば、Amazon ECR(Amazon Elastic Container Registry )がありますね。
もちろんAlibaba Cloudにも同様のサービスがあります。
それが ACR (Alibaba Cloud Container Registry) です。

今回は、前回の記事で作成したACK(Alibaba Cloud Container Service for Kubernetes)クラスター上に、ACRからコンテナイメージをデプロイしてみます。ACKクラスター上のアプリケーションと、データベースを接続する基本的な構成なので、他のアプリケーションを動かす際にも応用ができきます！
[ACK(Alibaba Cloud Container Service for Kubernetes)を使って、Alibaba Cloudでk8sを動かしてみる - Qiita](https://qiita.com/d-engine/items/d187ab1d4a0c3df076bc)

## 今回やること
- ACRを作成し、WordPressのコンテナイメージをPushする
- ACRにPushされたWordPressのコンテナイメージを、ACKクラスター上にデプロイする
- データベースとしてApsaraDB RDSを作成し、ACK上のWordPressと接続する

## ACRの作成
Container Registryのコンソールを開きます。
Enterprise版、Personal版があります。
今回はPersonal版を使いますので、右側のPersonal Editionをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/11d27df1-235c-1fe8-cf25-8e421a5b1705.png)

Enterprise版の場合は、Helmチャート(K8s上でアプリケーションを実行するためのリソースが定義されたパッケージ）が使えたりするみたいですね。本番環境で運用する場合はEnterprise、それ以外の場合はPersonal Editionでよさそうです。
それぞれのEditionの違いが説明されます。
Alibaba Cloudはこういった部分のUI/UXがかなり洗練されていますね。
`Create ACR Personal Edition`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/181b2450-8dba-518b-4cd0-378f93605ad3.png)

本当にいいんだな？と聞かれるので、チェックを入れて`Confirm`をクリックします。
大規模かどうかに関わらず、本番ならEnterprise Editionがおすすめのようですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/b2064c1d-8de0-9424-a731-304e15fd8d15.png)

次に、Dockerのパスワードを設定します。
`Reset Docker Login Password`をクリックし、パスワードを設定しましょう。
ここで入力したパスワードはACRの操作に必要なので、どこかに控えておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/00e1ce0c-4392-8774-24e3-5f7177a1eb47.png)

## Namespaceの作成
では、ACRに設定をしていきます。
まずは、Namespaceの作成です。
ここでいうNamespace(=名前空間）は、リポジトリのnamespaceのことです。
例えば、`web-app`といったコンテナイメージを社内の複数のチームで利用することを考えてみます。
`app-a-dev-team`、`app-b-dev-team`のような形のnamespaceを切って、それぞれのチームごとにリポジトリを持つことで、チームごとに同じ名前のイメージを管理することができます。
`app-a-dev-team/web-app`、`app-b-dev-team/web-app`といったように、相互に干渉することなくイメージの管理を行うことができるため、非常に便利です。

画面左のNamespaceをクリックし`Create Namespace`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/0867316f-fee0-27b2-b1d8-6059752097bd.png)

Namespace欄に名前を入力して、`Confirm`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/495866a0-cff3-5f14-5d92-a0546f57796f.png)

Namespaceが作成されたことを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/abc300d2-0c79-7c3b-af24-420bed227d5a.png)

## リポジトリの作成
次はリポジトリの作成です。
画面左から`Repositories`を選択し、`Create Repositry`を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/08c35c0a-ae6c-49a0-6395-2ba3ab585f77.png)

`Repository Name`に任意の名前を入力します。
Summaryも必須なので、何に使うか簡単に入力しておきましょう。
入力できたら`Next`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/7c90a751-73f3-b95e-cb01-f20b4c57c756.png)

外部のリポジトリと連携ができるようですね。
今回は、簡単のために`Local Repositry`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/544ea2d2-29f9-a983-3c31-005d0ecfe43b.png)

## ACRにログインする
ACRを操作するためのコマンドが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/7d1f4a65-401d-6f2c-8142-8233e79600dd.png)

ではローカルから Alibaba Cloud Docker Registry にログインしてみましょう。
↑の赤枠のコマンドを、ローカルのTerminalなどで実行します。
（メールアドレス部分は、自身のメールアドレスに修正してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/74167c51-7a92-d4f2-8846-8077bc39d3d0.png)

上記コマンド実行後パスワードの入力が求められるので、ACRの作成時に設定したDockerのパスワードを入力しましょう。
`Login Succeeded`と表示されれば、ログインは完了です。

## WordPressのイメージを取得し、ACRにPushする
今回は、ブログソフトウェアのWordPressをACK上にデプロイしていきます。
以下のコマンドで、WordPressの公式Dockerイメージを取得しましょう。
```
$ docker pull WordPress
```

次に`docker images`で、取得済みのDocker Imageの一覧にWordPressがあることを確認しましょう。
```
$ docker images
$ REPOSITORY   TAG         IMAGE ID       CREATED       SIZE
$ WordPress    latest      8b105c533d0c   10 days ago   615MB
```

以下のコマンドを入力し、取得したイメージにタグをつけて、ACRにPushします。
この作業を行うことで、公式から取得したDocker Imageを自分のプライベートなリポジトリに保存することができます。
```
$ docker tag WordPress registry-intl.ap-northeast-1.aliyuncs.com/acr-sample/acr-sample-repo:WordPress
$ docker push registry-intl.ap-northeast-1.aliyuncs.com/acr-sample/acr-sample-repo:WordPress
```

では、Pushしたイメージを確認しましょう。
ダッシュボードの左側から`Tags`を選択します。
すると、Push済みのイメージの一覧が確認できます。

## Pushしたイメージの脆弱性スキャンをしてみる
また、右のほうには`Security Scan`という項目がありますね。
AWSでいうInspectorのような、脆弱性スキャン機能のようです。
試しにクリックしてみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/c781d4db-5740-b806-17ad-6d0d89879993.png)

`Scan`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/44e218ef-cb16-07cf-5cf8-486e85bad219.png)

結果が表示されました、`No vulnerability`ということで脆弱性は無いようです。
AWSのECRでも同じようなことができますが、Alibaba CloudはUIが綺麗ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/9487bdaa-6e84-cd9e-618d-0eef057a229c.png)

## WordPressをデプロイする
すでに作成済みのACKクラスターに対して、デプロイしてみましょう。
ACKのダッシュボード画面を開き、既存のクラスターを選択します。
そして、画面左の`Deployment`をクリックし、`Create from Image`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/c4bf2939-f4b9-e286-daa8-f014df74c13c.png)

Name欄に`ack-WordPress`と入力し、`Next`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/6c924ba0-4df6-57d7-f706-b232b4d0baab.png)

まずは、デプロイするWordPressイメージを選択します。
`Select Image`をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/ea1eafb9-c0e0-baa3-4b17-51c3c4b63f33.png)


`Alibaba Cloud Container Registry`を選択。
先ほど作成したリポジトリをクリックすると、左上にチェックが入ります。
そのうえで、`OK`ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/93161b81-64ad-d563-b5cf-9fd3af889483.png)

`Image Name`が設定されたことを確認します。
`Image Version`は空欄のままで大丈夫です（自動的に最新のバージョンが選択されます）
そして、`Set Image Pull Secret`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/f02d0d21-9719-5a5e-304b-fc4e8894c48b.png)

ここでは、ACRからイメージをPullするための認証情報を登録します。
Nameは任意の名前を入力。
Usernameは`Dockerの認証を行ったメールアドレス`、Passwordは`ACRを作成時にセットしたパスワード`です。
設定できたら右下の`OK`をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/42d0ec8a-52e5-79a1-013e-d7782d467565.png)


`Resource Limit`は、アプリケーションのリソース制限です。
CPUは`0.5`Core、Memoryは`512MiB`を選択します。
反対に、Requiredは、最低限確保するリソースの量です。
リソース不足でアプリケーションが起動しないといった自体を避けることができます。
CPUは`0.25` Core、Memoryは`256`MiBを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/bd684ce2-d26e-fdf3-a02b-df7dfde6f6b4.png)

次にポートの設定を行います。
Nameは`WordPress`、Container Portは`80`を入力します。
設定ができたら、画面右上のNextをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/3c0fc9c3-68f6-74c9-8b01-37b8d9ca9c42.png)

Advanced設定ページに遷移するので、Servicesの隣の`Create`をクリックします。
（画面一番下のCreateではないので注意してください）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/7ec5ca4b-ac52-ac9b-bca5-aae196c436c4.png)

`Type` で `Server Load Balancer` - `Public Access` - `Create SLB Instance` を選択します。
`Modify`をクリックすることで、SLB Instanceのタイプを変更することができます。今回はデフォルトの`slb.s1.small`を選択します。

`Port Mapping`では、以下のように設定します。
|設定項目|値|
|----|----|
|Name|WordPress-svc-port|
|Service Port|80|
|Container Port|80|
設定ができたら、右下の`Create`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/cfddc95c-48e4-20fd-f2fb-c241ef5e609e.png)

Serviceの作成ウインドウが閉じるので、再度画面右下の`Create`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/cb173576-e0e9-d323-a67f-57ae27830978.png)

以下の画面が表示されれば、正常にデプロイが完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/0730adb4-79f4-9fd8-e173-9a7f8829d98b.png)

## アクセスしてみる
では、WordPressにアクセスしてみましょう。
画面左の`Network`をクリックし、Servicesの一覧を表示します。
先ほど作成した`ack-WordPress-svc`のレコードがあることが確認できますね。
`External Endpoint`欄のIPアドレスが、WordPressのIPアドレスです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/bd3cbb06-1839-2be1-e082-a5133fc54f63.png)

WordPressの初期設定画面が開きました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/3fe1e764-781f-1461-525f-63fc76c1014f.png)

# ApsaraDB RDSでWordPress用のデータベースを作成する
ただ、WordPressはデータベースが無いと動きません。
もちろん、コンテナの中にデータベースを立てて動かすこともできるのですが、データの永続性という観点ではデータベースは外出ししたほうが無難です。
そのため、今回は`ApsaraDB RDS`を利用してDBインスタンスを構築し、ACKと連携させてみましょう。
(※ ずっと アスパラ だと勘違いしていた時期があったのですが、 アプサラ ですので皆様はお間違えなきよう…）

## DBインスタンスを作成する
まずは、ApsaraDB RDSのコンソールを開きます。
左側の`Instances`を選択し、`Create Instance`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/d7043805-366e-7ca2-23d7-8d07029c0d7a.png)

ApsaraDB RDSの設定画面です。
Billing Methodは`Pay-as-You-Go`、つまり従量課金を選択します。

DB EngineはMySQLの8.0にしました。
Editionは`Basic`です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/09d45555-71a9-1b39-bf5b-6fd5843c0cf0.png)

Zoneはコンテナが稼働している`Tokyo Zone A`を選択します。
（※ 右上に青く②とバッジが表示されていますが、これは2個のコンテナが動いているよ、と教えてくれているようです。Zoneを選択する際に非常に便利だな〜と驚きました）
Instance Typeは一番小さいものを選択しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/02570e71-a1a2-4577-9c98-3aa488c777f4.png)

設定できたら、画面右下の`Next:Instance Configuration`をクリックします。
時間当たりの料金がここで確認できる仕様は本当に便利ですよね。
Google CloudやAWSも実装してくれたらいいのに…。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/adf29061-af3e-f7a9-bcd3-0ddd5c7710ed.png)

次は確認画面なので、問題なければ右下の`Next:Confirm Order`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/fe0b00a3-d455-306b-1176-22d7dc0a1e7f.png)

この画面が表示されれば完了です。
ApsaraDB RDSが起動するまで数分待ちましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/fc0334a0-df5a-2953-8913-4ce296573bb5.png)

## DBの初期設定を行う
では、データベースの初期設定をしていきます。
ApsaraDB RDSのコンソール画面を開きます。
`Instance Status`が`Running`になっていれば作成が完了しています。
`Instance ID`をクリックして設定画面に入りましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/5d5e7998-3f8d-1853-10c8-33c445072b99.png)

### DBのアカウント作成
まずはデータベースのアカウント作成です。
画面左から`Account`を選択し、`Create Account`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/41523102-b8f5-ea3d-763a-03949c5e0203.png)

`Database Account`欄には任意のユーザー名を入力します。
パスワードはデータベースに接続するためのパスワードです。
入力ができたら`OK`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/c706a080-945c-b4fd-7e14-701456dc9a3e.png)

先ほど作成したユーザーが表示されればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/d9f2913a-5ddc-f14c-87a2-be4f8ccba2b0.png)

### databaseの作成
次に、データベースを作成していきます。
あまりデータベースを使われない方だと混乱するかもしれないので補足しますと、ApsaraDB RDSのインスタンスはすでに作成が終わっており、マネージドなMySQL環境を使えるようになっています。この環境の中には、1つのデータベースだけではなく、複数のデータベースを混在させることができるので、今回WordPressが操作する対象のデータベースを今から作成する、というイメージです。

AWSのAmazon RDSだと、DB作成後にデータベースの作成を行うためには、EC2やCloud9などを使ってインスタンスに接続し、SQLコマンドを叩く必要があったので、この機能は非常に便利だな〜と感じます。

では、画面左から`Database`をクリックし`Create Database`を選択しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/6c8c2b37-8a9e-bc16-e7be-dc32b249f973.png)

Database Nameに`WordPress`と入力します。
`Supported Character Set`は`utf-8`を選んでください。
そして、右下の`Create`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/7776c088-e61e-1bcd-bf62-bc23a953e08b.png)

### 接続情報の確認
次に、データベースへの接続情報を確認します。
画面左から`Database Connection`をクリックし、`Internal Endpoint`のDNS名を控えます。以上で、ApsaraDB RDS側の設定は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/a2ca51d6-50e9-48d2-9ffa-1fab9783c746.png)

## ACK上のWordPressからApsaraDB RDSへ接続する
WordPressの画面に戻りましょう。
日本語を選択し、`次へ`をクリックすると、初期設定画面に入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/c024320d-abbb-d234-f284-73e8d71857dc.png)

`さぁ、始めましょう！`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/b76c32b7-665d-d79d-b67a-8c3ecf947473.png)

ここで、WordPressにApsaraDB RDSに接続する方法を教えてあげます。
データベース名は`WordPress`
ユーザー名は`wpuser`
パスワードは先ほど作成した任意のパスワード。
データベースのホストは、先ほどコピーしたApsaraDB RDSのDNS名です。
全て入力できたら`送信`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/a724cfcb-15de-4d0d-6551-132d54332954.png)

データベースとの通信が問題なく完了すれば、以下の画面が表示されます。
`インストール実行`をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/655a2181-747e-10aa-a223-f9c7dfc55c98.png)

## WordPressの設定を行う
次に、WordPressの設定を行います。
サイトのタイトルと、管理者ユーザー名を設定します（任意の名前です）
メールアドレスを入力し、`検索エンジンがサイトをインデックスしないようにする`にチェックを入れます。これは、テスト用サイトなのでチェックを入れていますが、本番環境で公開する場合はチェックを外しておきましょう。Googleなどのクローラがサイトをインデックスしてくれます。

設定できたら`WordPressをインストール`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/f394f24b-c05f-6694-2a1b-aefe9c1866a8.png)

無事インストールできたようです。
では、WordPressの管理画面にログインしてみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/73d9c1c9-80fe-21bc-aaef-88131003f010.png)

先ほど設定したユーザー名（またはメールアドレス）と、パスワードを入力し、`ログイン`をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/78d4848d-b280-2bfe-fc38-a17c38f3a25f.png)

WordPressの管理画面が開きました！
あとは通常のWordPressと同じように管理し、ユーザーに公開することが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2964981/9662d06b-3bf2-2635-36dd-31200968d75f.png)

## おわりに
今回はACKのクラスター上にWordPressのアプリケーションをデプロイし、データベースは外出しのApsaraDB RDSを使う環境を作成しました。
クラスター上でアプリケーションを動かし、データベースをApsaraDB RDSで稼働させるという構成は、そのまま他のアプリケーションを使うときも同じです。
ぜひ自作のアプリケーションをAlibaba CloudのACK上で動かしてみてください！