【OKE超入門】OKE クラスタ クイック作成で Nginxを15分で構築する

#まえがき

パブリッククラウドの知識は多少あるけどKubernetesは学習コストが高い、と感じている方も多いのではないでしょうか。
たしかにKubernetesコンポーネントの理解と、マニフェストファイル記述の学習は必要ですが、何かしらのパブリッククラウドでCompute、Storage、Networkまわりの基礎知識があれば、そこまでハードルは高くないと考えています。
しかし、Kubernetesの学習を始めるにあたり、kubectlのインストール等、環境構築に少し手間がかかったりします。

**そこで、コンソールの操作のみでKubernetesクラスタを作成できるOKE（Oracle Cloud Infrastructure Container Engine for Kubernetes）のクイック作成方法をご紹介します。**
後日、クイック作成で構築されたリソースについてご説明します。
AWS、AzureのKubernetesサービスと比較すると、OKEクラスタクイック作成では、自ら明示的に仮想ネットワーク（VPCとかvNet）及びIAMを用意する必要がないので、お手軽にクラスタを作成することができます。

#この記事はこんな人向け
・OKEが気になっている人
・パブリッククラウドは学んだことあるけど、Kubernetes初学者の人
・とりあえず手っ取り早くOKEクラスタを作成したい人

#システム構成イメージ＆前提
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/67f1174b-a2a6-0eea-7f8b-c1b1caf04aaa.png)

上記がクイック作成で構築するOKEクラスタのシステム構成イメージです。
OKEのクラスタ クイック作成で、CloudShell、LoadBalancer以外のリソースが作成されます。
クラスタ作成完了後、NginxコンテナイメージのPodを２つ、Podをインターネットに公開するServiceオブジェクトを１つ作成します。

:::note alert
今回は、クイック作成、アプリデプロイ後、速やかにこの環境を削除します。
OKEのリソース確認を目的として可能な限りシンプルに構築するため、サブネットを全てパブリックにしていますが、本番環境では決して推奨される構成ではございません。あくまで学習、検証目的でご使用ください！
:::

#作成手順＆ゴール

**1. Cloud Shell の起動**
**2. Kubernetes クラスタの作成**
**3. Cloud Shell から Kubernetesクラスタへ接続**
**4. kubectl を使用したサンプルの Nginx アプリのデプロイ**

最後にブラウザから、LoadBalancerのパブリックIPにアクセスして、Nginxのウェルカムページを見てみましょう。
OKEが初めての方でも、15分あればKubernetesでデプロイしたNginxのウェルカムページを確認できるように記事を作成しました。

#1. Cloud Shell の起動

まずは、OKEクラスタに接続するためのターミナルを準備します。
今回は、可能な限りお手軽にクラスタを作成して

**1-1. Oracle Cloud Accountへログイン**
**1-2. OCIコンソールのヘッダーにあるCloud Shellアイコンをクリック**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/3117223d-07a6-0a3c-39df-e3ae121747a4.png)
**1-3. OCIコンソールの下部にCloud Shellが起動**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/6f49feb5-7c06-dce0-5839-f63033e3f82f.png)
少し待つと、ターミナルが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/9359f258-81bc-85ca-912e-9166e6d333d8.png)
このターミナルを用いて、クラスタに接続します。

CloudShellには、Kubernetes操作に必要なKubectlやhelmがあらかじめインストールされており、構築の手間が省けます。
また、ホームディレクトリ用に5GBの永続ストレージが付属しているため、ホームディレクトリにローカルな変更を加えて、CloudShellに戻ったときにプロジェクトで作業を続けることが可能です。使いやすくてお財布に優しい。（AWSだと1GB、Azureは有料のAzure Files共有が必須）
[CloudShellに含まれるもの](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/cloudshellintro.htm "インストール")

また、月額テナンシー制限内に限り、無料で利用できます。（※契約形態、ユーザ数と利用時間によって規定。）
[CloudShell 利用料](https://www.oracle.com/jp/devops/cloud-shell/ "利用料")

#2. Kubernetes クラスタの作成
**2-1. 「メニュー」から「開発者サービス」の「Kubernetes クラスタ(OKE)」をクリック。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/746ad1e5-274b-9119-23aa-fc52d01b6d9d.png)

**2-2. 「クラスタの作成」をクリック**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/8695c66f-51ea-3d9c-c87e-00563f2360f9.png)

**2-3. 「クイック作成」を選択し、「ワークフローの起動」をクリック**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/55512e1b-47e3-16df-73d4-187304faf428.png)
この画面で、新規リソースとして下記リソースが作成されると記載があります。

・仮想クラウド・ネットワーク(VCN)
・インターネット・ゲートウェイ(IG)
・NATゲートウェイ(NAT)
・サービス・ゲートウェイ(SGW)
・Kubernetesクラスタ
・Kubernetesワーカー・ノードおよびノード・プール

このあと設定するプロパティ値によって作成されるリソースが変わります。
クイック作成において、どのプロパティ値を選択しても、この中から、作成されるリソースは以下の４つです。

・仮想クラウド・ネットワーク(VCN)
・インターネット・ゲートウェイ(IG)
・Kubernetesクラスタ
・Kubernetesワーカー・ノードおよびノード・プール

**2-4. クラスタのプロパティ設定**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/6f019c03-7f80-0c5d-e1de-a2421ff6c4f4.png)

デフォルト値から変更するプロパティは以下の３つです。

・名前：任意の値を入力（デフォルト値：cluster1）
・Kubernetesワーカー・ノード：パブリックワーカー
・ノードの数：１

前提で申し上げた通り、今回は全てパブリックサブネットで作成していきます。
クラスタ作成後、アプリケーションコンテナやDBコンテナをPodとしてデプロイするワーカー・ノードは、プライベートサブネットにいたほうがいいでしょというセキュリティ思想から、デフォルトではプライベートになっています。
プライベートを選択すると、・NATゲートウェイ(NAT)及びサービス・ゲートウェイ(SGW)が作成されますが、パブリックでは作成されません。

また、AD内でワーカーノードを冗長化する方針から、デフォルト値が３になっています。
ワーカーノード＝Computeインスタンスと考えていただいて結構です。
今回は、冗長化する目的がございませんし、クラスタを起動している最中は３つのComputeが課金対象となるため、ワーカーノードを１つにします。

**2-5. 「次」ボタンと「クラスタの作成」ボタンをクリック**
「次」ボタンで確認画面が表示されます。内容がOKであれば、「クラスタの作成」を押下してください。
すると、作成されるリソースがバーッと出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/ae8e2284-d7ba-de28-9694-225204cff4bf.png)
しばらくして、待機中のステータスが完了となれば、成功です。

:::note warn
ここでエラーとなる場合は、VCNのサービス制限にひっかかっている可能性が高いです。
サービス制限の引上げを申請するか、不要なVCNリソースを削除してください。
:::

**2-6. 少し待機**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/d1adc671-d658-8025-7381-f4af4a627f95.png)

5～10分くらいでクラスタが作成されます。
この時間が本手順の中で最も時間がかかるプロセスです。コーヒーを淹れるか、一服する時間に最適です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/90f67dfe-5d90-593b-6242-70425a826d39.png)

自席に戻って、ステータスが「アクティブ」になったらクラスタ作成完了です。

#3. Cloud Shell から Kubernetesクラスタへ接続

手順1で起動したCloudShellから、作成したクラスタへ接続を確認してみましょう。
kubectl を使ってクラスタにアクセスするには、「kubeconfig」ファイルを設定する必要があります。
kubeconfig ファイル（デフォルトでは config という名前で、$HOME/.kube ディレクトリに格納）には、クラスタにアクセスするために必要な詳細情報が記載されています。

**3-1. コンソールで、ナビゲーションメニューを開き、「開発者サービス」→「Kubernetes クラスタ(OKE)」をクリック**
**3-2. 一覧ページで、kubectl を使ってアクセスしたいクラスタの名前をクリック**
**3-3. 「クラスタへのアクセス」ボタンをクリックして「自分のクラスタへのアクセス」ダイアログボックスを表示**
**3-4. 「Cloud Shell アクセス」をクリック**
**3-5. 「Cloud Shell の起動」をクリックして、「Cloud Shell 」ウィンドウを表示**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/b6928a70-34ee-c772-e174-062d6b93c08c.png)
**3-6. ②のコマンドをコピー**
**3-7. コピーしたコマンドを Cloud Shell に貼り付け**
OCI CLI コマンドを実行して kubeconfig ファイルを設定し、kubectl がアクセスできる場所に保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/e88275e8-09f6-b51b-8584-3473c7595b28.png)
コマンドは下記の通りです。XXXに一意のクラスターID、YYYにOKEクラスタを作成したリージョンが入ります。

```
oci ce cluster create-kubeconfig --cluster-id ocid1.cluster.oc1.iad.XXX --file $HOME/.kube/config --region YYY --token-version 2.0.0 --kube-endpoint PUBLIC_ENDPOINT
```

**3-8. 環境変数 KUBECONFIG の値を設定**
環境変数 KUBECONFIG の値を設定し、kubeconfig ファイルの名前と場所を指すようにします。

```
export KUBECONFIG=$HOME/.kube/config
```

**3-9. kubectl の接続確認**

```
kubectl get nodes
NAME          STATUS   ROLES   AGE     VERSION
10.0.10.XXX   Ready    node    7min18s   v1.21.5
```

これで、Cloud ShellにインストールされていたkubectlコマンドからOKEクラスタへの接続、及びクイック作成でワーカーノードが１つ作成されたことが確認できました。次に、このワーカーノードの中にPodを作成していきましょう。

#4. kubectl を使用したサンプルの Nginx アプリのデプロイ

**4-1. NginxコンテナイメージのPodの作成**

Cloud Shell 上で、下記のコマンドを実行します。

```
kubectl create -f https://k8s.io/examples/application/deployment.yaml
```

今回は詳しく触れませんが、このコマンドで、Kubernetes公式のコンテナリポジトリ上にある"deployment.yaml"を実行し、２つのNginxコンテナを１つのPodでデプロイすることを行っています。
因みに、"deployment.yaml"の中身はこんな感じです。

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 2 # tells deployment to run 2 pods matching the template
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
```
試しにPodがデプロイされているか確認してみましょう。

```
kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE   IP           NODE          NOMINATED NODE   READINESS GATES
nginx-deployment-XXX-XXX   1/1     Running   0          60s   10.XXX.0.X   10.0.10.XXX   <none>           <none>
nginx-deployment-XXX-XXX   1/1     Running   0          60s   10.XXX.0.X   10.0.10.XXX   <none>           <none>
```
NginxのPodが２つデプロイされていることが確認できました。

**4-2.  アプリケーションを公開するサービスの作成**

このクラスタは、OCI Cloud Controller Manager（CCM）と統合されています。
[CCM（oci-cloud-controller-manager）](https://github.com/oracle/oci-cloud-controller-manager "CCM")
よって、--type=LoadBalancer タイプのサービスを作成すると、OCI Load Balancer を使用してポッドをインターネットに公開してくれます。
Cloud Shellで以下のコマンドを実行します。

```
kubectl expose deployment nginx-deployment --port=80 --type=LoadBalancer
service/nginx-deployment exposed
```
サービスが作成されているか確認してみましょう。
以下のコマンドを実行します。

```
kubectl get svc -n default
NAME               TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)        AGE
kubernetes         ClusterIP      XX.XX.XX.XX     <none>         443/TCP        3min21s
nginx-deployment   LoadBalancer   XX.XX.XX.XX   XXX.XXX.XXX.XX   80:30363/TCP   32s
```

nginx-deploymentという名前のLoadBalancerタイプのServiceが作成されていることがわかります。
LoadBalancerタイプのServiceとは、OCI LoadBalancerです。
このコマンドで、kubectlからネイティブにLoadBalancerが作成されたことになります。

メニュー＞ネットワーキング＞ロード・バランサ に遷移し、画面を確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/c22473c9-3d33-cc26-b330-f60d67c1c6c6.png)
本画像は黒塗りしているのですが、このパブリックIPアドレスが、さきほどコマンドで表示したEXTERNAL-IPと同じ値であることがご確認いただけるかと思います。


#Nginxのウェルカムページを確認

先ほど実行したコマンドの中で、nginx-deploymentのEXTERNAL-IPをコピーして、ブラウザで以下の通りアクセスします。

```
http://【nginx-deploymentのEXTERNAL-IP】
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/a7d0eb45-5045-b427-9257-9e19da4107d7.png)

このページが出てきたら成功です！お疲れ様でした！
15分くらいでOKEクラスタの作成、Nginxをデプロイすることができましたね！

#お片付け

Compute, LoadBalancerで課金が発生してしまうので、削除しましょう。
VCNの削除はお任せします。

***LoadBalancer***
画面右の・・・が縦に並んでいるアイコンを押下し、「終了」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/baacc44f-68d8-1813-6190-3eef652dc3f7.png)

***OKEクラスタ***
画面右の・・・が縦に並んでいるアイコンを押下し、「削除」を選択してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2325706/74f9f64d-019b-7993-c896-4512639866a6.png)

#まとめ

OKE クラスタ クイック作成から、Kubernetesクラスタを構築し、ワーカーノードの中にNginxのPodとtype=Loadbalancerをデプロイしました。次回、本ハンズオンで構築したリソースをご説明いたします。Kubernetes, OCI 学習の一助となりましたら幸いです。