【IBM Cloud】IBM Cloud Kubernetes Service上にnginxを立ち上げてみた

## はじめに
本日はIBM Cloud Kubernetes Service（IKS）にnginxを立ち上げるハンズオンを行ってみたので、その流れを整理したいと思います。
今回の内容にはIBM Cloudの[アカウント](https://cloud.ibm.com/docs/account?topic=account-accounts)（無料利用可能）が前提となっています。
## nginx立ち上げの準備
#### IKSのクラスター作成
IKSのクラスターを作成します。ナビゲーションメニューをクリックして`Kubernetes`→`クラスター`にアクセスします。
![スクリーンショット 2023-08-09 17.05.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/da351ab1-b9f2-5d4b-3f07-42eb4a5de1d1.png)
![スクリーンショット 2023-08-09 17.05.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/ec3968fb-6eb5-b119-5896-e93817c325d9.png)

右上の`クラスターの作成`をクリックします。
![スクリーンショット 2023-08-09 17.05.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/f32db8c7-99bd-9450-9ad0-6917defd5536.png)

クラスターの設定を行います。クラスターはVPCとClassicを選択できますが、今回はClassicで作成しています。その他リソースグループの設定やリージョンの設定を行います。
![スクリーンショット 2023-08-09 17.07.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/608317f4-b44f-a70b-501f-3b83e81b1619.png)

また、クラスターのプロファイル（フレーバー）も変更可能です。今回は最小構成+ゾーンあたりのworker nodeも１つに減らして作成しています。そのほかAdd onなどを設定し、`作成`ボタンをクリックします。
![スクリーンショット 2023-08-09 17.07.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/b2c06dcd-e5ac-888b-0751-fa2a7c24a2c5.png)

クラスター作成が完了されたら以下の画面が表示されるかと思います。詳細の部分にクラスターIDが記載されているので、コピーしておきます。
![スクリーンショット 2023-08-09 17.07.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/b21d2f5f-74f0-40c2-f3e9-278bc26b04b9.png)

#### IBM Cloudへのログイン
ターミナルにて、IBM Cloudにログインします。ログインはCLIを使用したワンタイム・パスコードを利用すると便利です。
右上のプロフィールアイコンをクリックし、`CLIとAPIにログイン`をクリックしますと、以下のログインCLIが表示されます。
IBM Cloud CLIをコピーしコマンド入力にてログインを行います。
![スクリーンショット 2023-01-27 14.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/85389613-4b70-eda8-43d4-a0da1211064c.png)
![スクリーンショット 2023-01-27 14.52.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/04c3ad3e-31da-6abc-804c-506a5536429d.png)

その後、以下のコマンドを使ってクラスターを指定します。
Kubernetesの環境を設定するには、exportコマンドが必要です。exportコマンドは、`ibmcloud ks cluster config`コマンドを入力して取得します。
クラスター画面で取得してクラスターIDに差し替えてターミナルに入力します。
なお、クラスターIDの代わりに、クラスター名を入れても指定は可能です。
```shell:クラスター環境指定
ibmcloud ks cluster config --cluster <cluster-id>
```
```shell:クラスター環境指定の結果
<cluster-id> のコンテキストを現在の kubeconfig ファイルに追加しました。
これで、クラスターに対して「kubectl」コマンドを実行できます。 例えば、「kubectl get nodes」を実行します。
クラスターに初めてアクセスする場合、RBAC の同期中に「kubectl」コマンドが数秒間失敗することがあります。
```

## Dockerイメージの準備
#### Dockerfileの作成
nginxをデプロイするにDockerイメージを使用します。
以下のコードでDockerfileを作成します。
```shell:Dockerfile作成
# ベースイメージを指定
FROM nginx

# ローカルの index.html をコンテナのデフォルトパスにコピー
COPY index.html /usr/share/nginx/html/

# ポートを80に変更（nginx デフォルトポート）
EXPOSE 80

# Nginx を起動
CMD ["nginx", "-g", "daemon off;"]
```
#### Dockerイメージのビルド
ターミナルでdockerイメージが置いてあるディレクトリーに移動し、dockerイメージをビルドします。
```shell:Dockerイメージのビルド
docker build .
```

#### IBM Cloud Container Registryに格納
作成したDockerイメージをContainer Registryに格納します。
以下コマンドを使ってContainer Registryにログインします。
```shell:Container Registryログイン
ibmcloud cr login
```
次にイメージをタグづけしてプッシュします。
```shell:イメージタグ付け、プッシュ
docker tag <local_image> jp.icr.io/<my_namespace>/<my_repo>
docker push jp.icr.io/<my_namespace>/<my_repo>
```

## Kubernetesの準備
#### Kubernetesマニフェストの作成
Kubernetes上に何かを立ち上げるためには、yamlファイルを使ってデプロイする必要があります。作成yamlは「deployment.yaml」と「service.yaml」です。この二つのyamlファイルの作成により、IKS上にnginxがデプロイされ、serviceで外部からアクセスできるようになります。

今回私は以下のように作成しました。

```shell:deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: iks-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: iks
  template:
    metadata:
      labels:
        app: iks
    spec:
      containers:
      - name: iks-container
        image: jp.icr.io/moon-test/nginx:latest
        ports:
        - containerPort: 80
```

```shell:service.yaml
apiVersion: v1
kind: Service
metadata:
  name: iks-service
spec:
  selector:
    app: iks
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: NodePort
```

#### Kubernetes　マニフェストの適用
作成したマニフェストを以下のコマンドを使ってKubernetesクラスターに適用します。
```shell:マニフェストの適用
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
```

## 結果の確認
公開されたIPアドレスを確認します。
まず、以下のコマンドにてKubernetes上に適用されたか確認します。
```shell:デプロイの確認
kubectl get all
```
```shell:結果例
NAME                                  READY   STATUS    RESTARTS   AGE
pod/iks-deployment-6584775c6f-qwz2q   1/1     Running   0          5s

NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/iks-service   NodePort    172.21.193.230   <none>        80:31108/TCP   4s
service/kubernetes    ClusterIP   172.21.0.1       <none>        443/TCP        37s

NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/iks-deployment   1/1     1            1           5s

NAME                                        DESIRED   CURRENT   READY   AGE
replicaset.apps/iks-deployment-6584775c6f   1         1         1       5s
```

その後、現在実行されているworker nodeの情報を得るために、以下のコマンドを入力します。
クラスターの指定と同様に、<cluster-id>にはクラスター名を入力しても構いません。
```shell:worker nodeの確認
ibmcloud ks worker ls --cluster <cluster-id>
```
```shell:結果例
OK
ID                                                    パブリック IP   プライベート IP   フレーバー          状態     状況    ゾーン   バージョン   
kube-cj84sg2t05u16hk6drig-moontest-default-000001ca   161.202.97.14   10.133.175.181    u3c.2x4.encrypted   normal   Ready   tok02    1.26.7_1546  
```

上記結果で取得して<パブリックIP>:<ノードポート>を入力するとnginx画面が表示されるようになります。今回の場合は、`161.202.97.14:31108`ですので、こちらのIPでアクセスすると、問題なくnginxがデプロイされていることがわかります。
![スクリーンショット 2023-08-09 17.40.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2626032/37d60d2f-ddd6-43dc-a4ba-689aac7eafea.png)

## 最後に
今回はDockerfileやyamlを作成し、それをもってIBM Cloud Kubernetes Serviceのクラスター上にnginxを立ち上げる流れを整理しました。次回にはこちらのnginxを実際いじってみたり、アプリケーションを載せてみることに挑戦してみたいと思います。