まえがき
パブリッククラウドの知識は多少あるけど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クラスタを作成したい人
システム構成イメージ&前提
上記がクイック作成で構築するOKEクラスタのシステム構成イメージです。
OKEのクラスタ クイック作成で、CloudShell、LoadBalancer以外のリソースが作成されます。
クラスタ作成完了後、NginxコンテナイメージのPodを2つ、Podをインターネットに公開するServiceオブジェクトを1つ作成します。
今回は、クイック作成、アプリデプロイ後、速やかにこの環境を削除します。
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アイコンをクリック
1-3. OCIコンソールの下部にCloud Shellが起動
少し待つと、ターミナルが表示されます。
このターミナルを用いて、クラスタに接続します。
CloudShellには、Kubernetes操作に必要なKubectlやhelmがあらかじめインストールされており、構築の手間が省けます。
また、ホームディレクトリ用に5GBの永続ストレージが付属しているため、ホームディレクトリにローカルな変更を加えて、CloudShellに戻ったときにプロジェクトで作業を続けることが可能です。使いやすくてお財布に優しい。(AWSだと1GB、Azureは有料のAzure Files共有が必須)
CloudShellに含まれるもの
また、月額テナンシー制限内に限り、無料で利用できます。(※契約形態、ユーザ数と利用時間によって規定。)
CloudShell 利用料
2. Kubernetes クラスタの作成
2-1. 「メニュー」から「開発者サービス」の「Kubernetes クラスタ(OKE)」をクリック。
2-3. 「クイック作成」を選択し、「ワークフローの起動」をクリック
この画面で、新規リソースとして下記リソースが作成されると記載があります。
・仮想クラウド・ネットワーク(VCN)
・インターネット・ゲートウェイ(IG)
・NATゲートウェイ(NAT)
・サービス・ゲートウェイ(SGW)
・Kubernetesクラスタ
・Kubernetesワーカー・ノードおよびノード・プール
このあと設定するプロパティ値によって作成されるリソースが変わります。
クイック作成において、どのプロパティ値を選択しても、この中から、作成されるリソースは以下の4つです。
・仮想クラウド・ネットワーク(VCN)
・インターネット・ゲートウェイ(IG)
・Kubernetesクラスタ
・Kubernetesワーカー・ノードおよびノード・プール
デフォルト値から変更するプロパティは以下の3つです。
・名前:任意の値を入力(デフォルト値:cluster1)
・Kubernetesワーカー・ノード:パブリックワーカー
・ノードの数:1
前提で申し上げた通り、今回は全てパブリックサブネットで作成していきます。
クラスタ作成後、アプリケーションコンテナやDBコンテナをPodとしてデプロイするワーカー・ノードは、プライベートサブネットにいたほうがいいでしょというセキュリティ思想から、デフォルトではプライベートになっています。
プライベートを選択すると、・NATゲートウェイ(NAT)及びサービス・ゲートウェイ(SGW)が作成されますが、パブリックでは作成されません。
また、AD内でワーカーノードを冗長化する方針から、デフォルト値が3になっています。
ワーカーノード=Computeインスタンスと考えていただいて結構です。
今回は、冗長化する目的がございませんし、クラスタを起動している最中は3つのComputeが課金対象となるため、ワーカーノードを1つにします。
2-5. 「次」ボタンと「クラスタの作成」ボタンをクリック
「次」ボタンで確認画面が表示されます。内容がOKであれば、「クラスタの作成」を押下してください。
すると、作成されるリソースがバーッと出てきます。
しばらくして、待機中のステータスが完了となれば、成功です。
ここでエラーとなる場合は、VCNのサービス制限にひっかかっている可能性が高いです。
サービス制限の引上げを申請するか、不要なVCNリソースを削除してください。
5~10分くらいでクラスタが作成されます。
この時間が本手順の中で最も時間がかかるプロセスです。コーヒーを淹れるか、一服する時間に最適です。
自席に戻って、ステータスが「アクティブ」になったらクラスタ作成完了です。
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 」ウィンドウを表示
3-6. ②のコマンドをコピー
3-7. コピーしたコマンドを Cloud Shell に貼り付け
OCI CLI コマンドを実行して kubeconfig ファイルを設定し、kubectl がアクセスできる場所に保存します。
コマンドは下記の通りです。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クラスタへの接続、及びクイック作成でワーカーノードが1つ作成されたことが確認できました。次に、このワーカーノードの中にPodを作成していきましょう。
4. kubectl を使用したサンプルの Nginx アプリのデプロイ
4-1. NginxコンテナイメージのPodの作成
Cloud Shell 上で、下記のコマンドを実行します。
kubectl create -f https://k8s.io/examples/application/deployment.yaml
今回は詳しく触れませんが、このコマンドで、Kubernetes公式のコンテナリポジトリ上にある"deployment.yaml"を実行し、2つのNginxコンテナを1つの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が2つデプロイされていることが確認できました。
4-2. アプリケーションを公開するサービスの作成
このクラスタは、OCI Cloud Controller Manager(CCM)と統合されています。
CCM(oci-cloud-controller-manager)
よって、--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が作成されたことになります。
メニュー>ネットワーキング>ロード・バランサ に遷移し、画面を確認してみましょう。
本画像は黒塗りしているのですが、このパブリックIPアドレスが、さきほどコマンドで表示したEXTERNAL-IPと同じ値であることがご確認いただけるかと思います。
Nginxのウェルカムページを確認
先ほど実行したコマンドの中で、nginx-deploymentのEXTERNAL-IPをコピーして、ブラウザで以下の通りアクセスします。
http://【nginx-deploymentのEXTERNAL-IP】
このページが出てきたら成功です!お疲れ様でした!
15分くらいでOKEクラスタの作成、Nginxをデプロイすることができましたね!
お片付け
Compute, LoadBalancerで課金が発生してしまうので、削除しましょう。
VCNの削除はお任せします。
LoadBalancer
画面右の・・・が縦に並んでいるアイコンを押下し、「終了」を選択してください。
OKEクラスタ
画面右の・・・が縦に並んでいるアイコンを押下し、「削除」を選択してください。
まとめ
OKE クラスタ クイック作成から、Kubernetesクラスタを構築し、ワーカーノードの中にNginxのPodとtype=Loadbalancerをデプロイしました。次回、本ハンズオンで構築したリソースをご説明いたします。Kubernetes, OCI 学習の一助となりましたら幸いです。