OKEクラスターでコンテナを動かしてみる

このエントリーはOracle Cloudアドベントカレンダー その2の2日目です。

2日目も引き続き、Oracle Contianer Engine for Kubernetes(以下「OKE」。Oracleが提供するKubernetesのマネージドサービス)の話題です。このエントリーでは、1日目に作成したOKEでクラスターにkubectlでアクセスし、サンプルのコンテナをデプロイしてみます。

0 . 前提条件

  • 1日目の手順を終えるなどして、OKEクラスターが利用できること
  • Unix/Linux互換のターミナル環境が利用できること

手順の流れ

大雑把に言って、以下のような手順になります。

  1. kubectl等のコマンドラインツールをインストールする
  2. OKEにアクセスするためのkubectlの設定ファイルを取得する
  3. コンテナをデプロイする

それではやってみましょう。

1 . kubectl等のコマンドラインツールをインストールする

OKEクラスターの利用のためには、以下のコマンドラインツールが必要です。

  • Python 2.7.5+ or 3.5+
  • OCI CLIOracle Cloud Infrastructure、以下OCIのCLI
  • kubectl

kubectlでOKEクラスターにアクセスするためには、接続情報などが書かれたkubectlの設定ファイルを入手する必要があります。これを行うために、OCI CLIが必要です。

また、OCI CLIの利用のためにPythonを必要とします。

1.1. Pythonのインストール

現在のPythonのバージョンを確認するには、ターミナルで以下のコマンドを実行します。

Python 2.x 系の場合

python --version

Python 3.x 系の場合

python3 --version

もし上述の条件を満たしていない場合は、ここでPythonのインストール/アップデートを行ってください。

1.2. OCI CLIをインストールをする

OCI CLIのインストールを行っていきます。

1.2.1. OCIDの確認

OCIネイティブのアカウントでコンソールにログインし、画面右上の人型のアイコンをクリックします。さらに、展開されたメニューの"User Settings"をクリックします。

ユーザーの詳細情報の画面で”User Information"タブ内にユーザーのOCIDが表示されている箇所があります。OCIDの値の右にある"Copy"をクリックすると、クリップボードにOCIDがコピーされるので、これを手元のテキストエディタなどにペーストしておきます。

次に、同じく画面右上の人型のアイコンをクリックし、展開されたメニューにあるTenant名をクリックします。

Tenantの詳細情報の画面で”Tenancy Information"タブ内にOCIDが表示されている箇所があります。OCIDの値の右にある"Copy"をクリックすると、クリップボードにOCIDがコピーされるので、これを手元のテキストエディタなどにペーストしておきます。

1.2.2. OCI CLIのインストール

OCI CLIをインストールするには、以下のコマンドを実行します。

bash -c "$(curl -L https://raw.githubusercontent.com/oracle/oci-cli/master/scripts/install/install.sh)"

CLIのバイナリの配置先などを設定するインタラクションがあります。自身の環境に合わせて、好みの設定を行ってください(全てデフォルトのままで進めても問題ありません)。

インストールが完了したら、OCI CLIの初期セットアップを行います。以下のコマンドを実行してください。

oci setup config

ここでも設定をおこなうためのインタラクションがあります。ここでは、下表のように入力してください。

質問 応答操作
Enter a location for your config [/home/<ユーザー名>/.oci/config] なにも入力せず[Return]
Enter a user OCID 先の手順で確認したユーザーのOCIDを入力
Enter a tenancy OCID 先の手順で確認したテナントのOCIDを入力
Enter a region (e.g. eu-frankfurt-1, us-ashburn-1, us-phoenix-1) アクセスしたいリージョンを例に従って入力
Do you want to generate a new RSA key pair? (If you decline you will be asked to supply the path to an existing key.) [Y/n] Y + [Return]
Enter a directory for your keys to be created [/home/<ユーザー名>/.oci] なにも入力せず[Return]
Enter a name for your key [oci_api_key] なにも入力せず[Return]
Enter a passphrase for your private key (empty for no passphrase) なにも入力せず[Return]

CLIからOCIに対してアクセスを行う際には、OCIのAPIの認証が行われます。このため予め認証をパスするのに必要なAPIキーを、ユーザー毎にOCIにアップロードしておく必要があります。

OCI CLIの初期セットアップの際に作成した鍵ペアのうち、公開鍵の方を、管理コンソールからアップロードします。

まず、以下のターミナルで以下のコマンドを実行し、公開鍵を表示しておきます。

cat ~/.oci/oci_api_key_public.pem

続いてOCIのコンソールに移り、画面右上の現在ログイン中のユーザー名が表示されている箇所をクリックします。さらに、展開されたメニューの"User Settings"をクリックします。

ユーザーの詳細画面の左側のメニューで、"API Keys"をクリックし、さらに"Add Public Key"ボタンをクリックします。

”Add Public Key"ダイアログの入力欄に、先ほとターミナルに表示した公開鍵をペーストし、"Add"ボタンをクリックします("-----BEGIN PUBLIC KEY-----"と"-----END PUBLIC KEY-----"の行も含めてペーストします)。

以上でOCI CLIのインストールは完了です。

1.3. kubectlのインストール

Kubernetesの公式ドキュメントの手順に従って、kubectlをインストールしておきます。

2 . OKEにアクセスするためのkubectlの設定ファイルを取得する

最後にkubectlの設定ファイルを取得し、kubectlで実際にクラスターにアクセスしてみます。 OCIのコンソールで、画面右上のタブから"Developer Services"をクリックします。

あらかじめ作成しておいたOKEクラスターの名前をクリックします。

クラスターの詳細画面で、"Access Kubeconfig"をクリックします。

”How to Access Kubeconfig"ダイアログに、kubetctlの設定ファイルを取得するためのコマンドが表示されますので、これらを順次実行していきます。

1つ目のコマンドは、設定ファイルを格納するためのディレクトリの作成です。

mkdir -p $HOME/.kube

2つ目のコマンドは、OCI CLIの設定ファイル取得用のコマンドを実行しています(実際のコマンドはダイアログからコピーしてください)。

oci ce cluster create-kubeconfig --cluster-id ocid1.cluster.oc1.iad.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --file $HOME/.kube/config

最後に、以下のコマンドを実行して、kubectlの動作確認をしてみます。

kubectl get nodes

以下のような実行結果になれば、正常にクラスターにアクセスできています。

NAME              STATUS    ROLES     AGE       VERSION
129.213.100.157   Ready     node      3d        v1.11.1
129.213.118.118   Ready     node      3d        v1.11.1
129.213.95.69     Ready     node      3d        v1.11.1

3 . コンテナをデプロイする

それではいよいよ、OKEのクラスターにコンテナをデプロイしていきます。

今回は、公式のドキュメントにあるサンプルを利用して、Nginxを動かしてみます。以下のコマンドを実行してください。

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

コマンドで指定されているymalファイルには、クラスターでコンテナを動かすための構成情報が記述されています(URLにアクセスすると、内容を確認できます)。上記のコマンドでは、このファイルの構成に従って、OKEクラスター上にコンテナをデプロイするよう指示しています。

以下のコマンドを実行すると、コンテナ(KubernetesではPodという単位に内包されています)の状態を確認できます。

kubectl get pods -l app=nginx
NAME                                READY     STATUS    RESTARTS   AGE
nginx-deployment-1771418926-7o5ns   1/1       Running   0          16h
nginx-deployment-1771418926-r18az   1/1       Running   0          16h

2つのPodに冗長化してデプロイされてるようでうす。どちらも"Running"のステータスになっていればOKです。

このままでは、クラスターの外からコンテナにトラフィックを届けることができないので、以下のコマンドでクラスター外に公開します。

kubectl expose deployment nginx-deployment --type="LoadBalancer" --port 80

これによって、上の手順で作成したPodのセット(nginx-deployment)に対して、ロードバランサーを通してトラフィックを届けることができます。ここでのロードバランサーは、このコマンドが実行されたときにOCIのロードバランサーを自動プロビジョニングして利用しています。

数十秒程度時間をおいてから以下のコマンドを実行すると、コンテナが公開されているIPアドレスロードバランサー)のIPアドレスを確認できます。

kubectl get services
NAME               TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)        AGE
kubernetes         ClusterIP      10.96.0.1       <none>            443/TCP        4d
nginx-deployment   LoadBalancer   10.96.219.208   129.213.187.123   80:32053/TCP   33s

nginx-deploymentというエントリーのEXTERNAL-IPに表示されているものがそれです。

ブラウザでこのIPアドレスにアクセスすると、おなじみにNginxの画面が表示されます。

http://129.213.187.123/

f:id:charlier_shoe:20181203024728p:plain

コンテナのデプロイは以上で完了です!

お掃除

デプロイしたものを削除するには、以下のコマンドを実行してください。

kubectl delete deployment nginx-deployment

kubectl delete service nginx-deployment