1. AWS ECS Fargate から OCI OKE への移行ガイド
1.1. はじめに
この記事は、AWS ECS Fargateで稼働しているアプリケーションを Oracle Cloud Infrastructure (OCI) Container Engine for Kubernetes (OKE) へ移行するプロセスについて説明します。前半ではAWS側の環境準備と ECS Fargateへのサンプル・アプリケーションのデプロイの流れを説明し、後半では同サンプル・アプリケーションをOCI OKEへデプロイする流れを説明します。
AWS ECS Fargateの構成図:
OCI OKEの構成図:
「Hello World!」のコンテンツと表示する単純なApache2アプリケーションを利用しています。データベースやストレージなどは使用していません。インタネットからアクセスできるように、コンテナ上公開されたポートはロードバランサーを経由して公開し、さらに、DNSレコードを追加し、自分のドメインからサンプル・アプリケーションへRedirectします。
Oracle Cloud Infrastructure Container Engine for Kubernetesは、完全に管理されたスケーラブルで可用性の高いサービスで、コンテナ化されたアプリケーションをクラウドにデプロイする際に使用できます。詳細は、OCI OKE ドキュメントを参照してください。
1.2. 前提条件
AWS および Oracle Cloud Infrastructureテナンシへのアクセス権が必要です。各リソースを作成および/または管理するには、次のいずれかに属している必要があります:
- テナンシの管理者グループ
- ポリシーが適切な権限を付与するグループ
1.3. ローカル開発環境の準備
ローカル開発環境は、主に、次の目的として利用されます。
- コンテナー・イメージの作成
- aws-cliの実行
- oci-cliの実行
- kubectlの実行
この記事では、ローカル開発環境は、Oracle Linux 8を利用しています。ほかのOSをご利用の場合、ご利用のOSに応じて適当に手順を読み替えてください。
1.3.1. Podmanのインストール
コンテナー・イメージを作成するため、ローカル開発環境にコンテナー実行環境が必要です。この記事では、Podmanを利用します。ほかのコンテナー実行環境を利用している場合、適当にガイドを変更してください。
Podmanは、Red Hat社を中心とするコミュニティが開発している、Docker互換のコンテナエンジンです。RHEL、CentOS、Fedora などの Linuxディストリビューションに標準で付属しています。
Podmanがインストールされていない場合、Podmanドキュメントを参照してPodmanをインストールします。
インストールが完了したら、次のコマンドを実行して確認します。
[opc@containerdemo ~]$ docker --version
Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
podman version 4.6.1
1.4. AWS ECS Fargateにアプリケーションをデプロイする
1.4.1. AWS CLI のインストール
AWS ドキュメントを参照して、ローカル開発環境にAWS CLIをインストールします。
インストールが完了したら、次のコマンドを実行して確認します。
[opc@containerdemo ~]$ aws --version
aws-cli/2.15.9 Python/3.11.6 Linux/5.15.0-100.96.32.el8uek.x86_64 exe/x86_64.oracle.8 prompt/off
1.4.2. AWS IAM ユーザーの作成
AWS CLIを設定する前に、先にIAMユーザーの作成が必要です。IAMユーザーが未作成の場合は、「IAM ユーザーガイド」の「IAM ユーザーの作成 (コンソール)」の手順に従ってIAMユーザーを作成します。
許可のオプション
で、このユーザーにアクセス許可を割り当てる方法として ポリシーを直接アタッチする
を選択します。簡単のために、このユーザーにアタッチする AdministratorAccess
ポリシーを選択します。
1.4.3. AWS IAM ユーザーのアクセスキーの取得
-
AWS IAMユーザーの詳細ページで、
セキュリティ認証情報
ページを選択します。次に、アクセスキー
でアクセスキーの作成
を選択します。 -
アクセスキーの作成ステップ 1
で、コマンドラインインターフェイス (CLI)
を選択します。 -
アクセスキーの作成ステップ 2
で、オプションのタグを入力して次へ
を選択します。 -
アクセスキーの作成ステップ 3
で、.csv ファイルをダウンロード
を選択し、IAM ユーザーのアクセスキーとシークレットアクセスキーを含む.csv
ファイルを保存します。この情報は後で必要になります。 -
完了
を選択します。
1.4.4. AWS CLI の設定
-
AWS CLI を設定する次のコマンドを実行します。
[opc@containerdemo hello-world]$ aws configure AWS Access Key ID [None]: IAM ユーザーのアクセスキー AWS Secret Access Key [None]: IAM ユーザーのシークレットアクセスキー Default region name [None]: ap-northeast-1 Default output format [None]: json
AWS リージョンと出力形式は必要に応じて変更してください。
-
AWS CLIを確認します。
[opc@containerdemo ~]$ aws s3 ls 2023-01-05 07:07:45 aws-cloudtrail-logs-281288470701-7f0f8f9e
1.4.5. Amazon ECS で使用するコンテナイメージの作成
参考資料:
-
Dockerfile という名前のファイルを作成します。
touch Dockerfile
-
前の手順で作成した Dockerfile を編集し、以下のコンテンツを追加します。
FROM ubuntu:18.04 # Install dependencies RUN apt-get update && \ apt-get -y install apache2 # Install apache and write hello world message RUN echo 'Hello World!' > /var/www/html/index.html # Configure apache RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \ echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \ echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \ echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \ chmod 755 /root/run_apache.sh EXPOSE 80 CMD /root/run_apache.sh
この Dockerfile は Ubuntu 18.04 イメージを使用します。RUN の手順により、パッケージキャッシュが更新され、ウェブ サーバー用のいくつかのソフトウェアがインストールされてから、「Hello World!」 のコンテンツがウェブサーバーのドキュメントルートに書き込みされます。EXPOSE の命令はコンテナ上のポート 80 を公開し、CMD の命令はウェブサーバーを起動します。
-
Dockerfile から Docker イメージを作成します。
docker build -t hello-world .
-
新しく構築されたイメージを実行します。
-p 8080:80
オプションは、コンテナ上の公開されたポート80
をホストシステム上のポート8080
にマッピングします。docker run -dp 8080:80 hello-world
-
コンテナーが起動したことを確認します。
[opc@containerdemo ~]$ docker ps Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 459e1e65afe2 localhost/hello-world:latest /bin/sh -c /root/... 7 seconds ago Up 8 seconds 0.0.0.0:8080->80/tcp affectionate_gates
-
Dockerを実行している、コンテナのホストサーバーを参照します。「Hello, World!」が確認できます。これでコンテナー・イメージの作成が完了です。
[opc@containerdemo ~]$ curl localhost:8080 Hello World!
1.4.6. Amazon Elastic Container Registry にイメージをプッシュする
Amazon ECR はマネージド型 AWS Docker レジストリサービスです。Docker CLI を使用して、Amazon ECR リポジトリ内のイメージをプッシュ、プル、および管理できます。
-
hello-world イメージを保存する Amazon ECR リポジトリを作成します。region を、AWS リージョン に置き換えます (例えば ap-northeast-1)。
aws ecr create-repository --repository-name hello-repository --region <region>
出力:
{ "repository": { "registryId": "aws_account_id", "repositoryName": "hello-repository", "repositoryArn": "arn:aws:ecr:region:aws_account_id:repository/hello-repository", "createdAt": 1505337806.0, "repositoryUri": "aws_account_id.dkr.ecr.region.amazonaws.com/hello-repository" } }
-
前のステップの
repositoryUri
の値で hello-world イメージにタグを付けます。docker tag hello-world <aws_account_id>.dkr.ecr.<region>.amazonaws.com/hello-repository
イメージタグを省略した場合、タグは latest と見なされます。イメージタグを指定する場合、次の様に設定します。
docker tag hello-world <aws_account_id>.dkr.ecr.<region>.amazonaws.com/hello-repository:tag
-
aws ecr get-login-password
コマンドを実行します。認証先のレジストリ URI を指定します。aws ecr get-login-password --region <region> | docker login --username AWS --password-stdin <aws_account_id>.dkr.ecr.<region>.amazonaws.com
出力:
Login Succeeded
-
前のステップのrepositoryUri値を使用して、Amazon ECR にイメージをプッシュします。
docker push <aws_account_id>.dkr.ecr.<region>.amazonaws.com/hello-repository
1.4.7. AWS ECS クラスターの作成
参考資料:
AWS Fargate の Linux コンテナによるコンソールの使用開始
-
AWS コンソール (https://console.aws.amazon.com/ecs/v2) を開きます。
-
ナビゲーションペインで
クラスター
を選択します。 -
クラスター
ページで、クラスターの作成
を選択します。-
クラスター設定
で、クラスター名
に一意の名前を入力します。 -
インフラストラクチャを
AWS Fargate
を指定、ほかのオプションはデフォルト値を受け入れ、作成
を選択します。
-
1.4.8. Amazon ECS タスク実行IAM ロールの作成
参考資料:
タスク実行 (ecsTaskExecutionRole) ロールの作成
タスク実行ロールは、ユーザーに代わって AWS API コールを実行するためのアクセス許可を Amazon ECS コンテナと Fargate エージェントに付与します。タスク実行 IAM ロールは、タスクの要件に応じて必要です。
-
AWS IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。
-
ナビゲーションペインで
ロール
、ロールの作成
の順に選択します。 -
信頼されたエンティティタイプ
セクションで、AWSのサービス
、Elastic Container Service
の順に選択します。ユースケース
で、Elastic Container Service Task
を選択した後、次へ
を選択します。 -
許可ポリシー
セクションで、AmazonECSTaskExecutionRolePolicy
を検索し、ポリシーを選択します。次へ
をクリックします。 -
ロール詳細
で、ロール名
にecsTaskExecutionRole
を入力し、ロールを作成
を選択します。
1.4.9. Fargate タスク定義の作成
-
AWS コンソール (https://console.aws.amazon.com/ecs/v2) を開きます。
-
ナビゲーションペインで
タスク定義
を選択します。 -
新しいタスク定義の作成
、JSONを使用した新しいタスク定義の作成
の順に選択します。 -
以下のタスク定義の例をコピーしてボックスに貼り付け、
作成
を選択します。{ "family": "hello-world-fargate", "executionRoleArn": "ecsTaskExecutionRole", "networkMode": "awsvpc", "containerDefinitions": [ { "name": "hello-world-app", "image": "<aws_account_id>.dkr.ecr.<region>.amazonaws.com/hello-repository:latest", "portMappings": [ { "containerPort": 80, "hostPort": 80, "protocol": "tcp" } ], "essential": true } ], "requiresCompatibilities": [ "FARGATE" ], "cpu": "256", "memory": "512" }
上記cpu、メモリが最低限です。また、タスク定義時に、必ず
"executionRoleArn": "ecsTaskExecutionRole",
で作成したロールを指定します。"image": "<aws_account_id>.dkr.ecr.<region>.amazonaws.com/hello-repository:latest",
でECRへプッシュしたイメージのURLを指定します。
1.4.10. Fargate サービスの作成
作成したECSクラスターの配下でサービスを作成します。
-
ナビゲーションペインで、
クラスター
を選択してから、作成したクラスターを選択します。 -
ECSクラスターの詳細画面で、
サービス
タブから、作成
を選択します。 -
コンピューティング設定 ((アドバンスト))は、
起動タイプ
を指定、起動タイプは、Fargate
を指定します。デプロイ設定は、サービス
を指定します。 -
タスク定義は、作成したタスク定義を選択します。サービス名を入力し、必要なタスク数は、デフォルトの1とします。
-
「ネットワーキング」は、デフォルトでは、vpc存在しない場合新しく作成してくれます。(デフォルト値を受け入れる)
-
ロードバランシングは、Application Load Balancerを指定し、「新しいロードバランサーの作成」を選択します。
- ロードバランサー名:
hello-world-alb
- ロードバランス用のコンテナの選択:
hello-world-app 80:80
- 新しいリスナーを作成:
80
/HTTP
- ターゲットグループ:
alb-target-gp
/HTTP
/HTTP
//
awsvpc ネットワークモードではプライベートサブネットだけがサポートされます。タスクはパブリック IP アドレスを受信しません。したがって、アウトバウンドのインターネットアクセスには NAT ゲートウェイが必要であり、またインバウンドのインターネットトラフィックは、ロードバランサーを経由します。
- ロードバランサー名:
1.4.11. セキュリティグループの設定
タスク定義を使用してサービスを作成するときに選択するセキュリティグループには、インバウンドトラフィック用にポート 80 が開いている必要があります。
-
作成した Fargate サービスの詳細画面から、「設定とネットワーク」を選択し、セキュリティグループを選択します。
-
セキュリティグループに次のインバウンドルールを追加します。
[Type]: HTTP [Protocol]: TCP ポート範囲: 80 ソース: 任意の場所 (0.0.0.0/0)
1.4.12. サービスの表示
-
作成した Fargate サービスの詳細画面から、「設定とネットワーク」を選択し、ロードバランサーを選択します。
-
ロードバランサーの詳細画面からDNS名をコピーします。
-
ブラウザーでALBのDNS名(例えば、alb-for-fargate-1042693750.ap-northeast-1.elb.amazonaws.com)をアクスタします。「Hello World!」と表示されたら、Fargateのデプロイが成功しました。
1.4.13. DNS レコードの更新
-
ALBへRedirectするため、DNSレコードにCNAMEを追加します。今回は、CloudFlareのDNSサービスを利用しています。ほかのDNSプロバイダーを利用している場合、DNSプロバイダーのドキュメントを参照してください。
-
ブラウザーで DNSドメインをアクスタします。「Hello World!」と表示されたら、Fargate側の構築が完了です。
1.5. OCI Container Engine for Kubernetes (OKE) への移行
1.5.1. OKE クラスタの作成
参考資料:
コンソールを使用した、クイック作成ワークフローでのデフォルト設定によるクラスタの作成
-
コンソールでナビゲーション・メニューを開き、「開発者サービス」をクリックします。「コンテナとアーティファクト」で、「Kubernetesクラスタ(OKE)」をクリックします。
-
作業する権限があるコンパートメントを選択します。
-
「Cluster List」ページで、「クラスタの作成」をクリックします。
-
「クラスタの作成」ダイアログで、「クイック作成」を選択して「送信」をクリックします。
-
「クラスタの作成」ページで、新しいクラスタのデフォルトの構成の詳細を次のように指定します:
- 名前:新しいクラスタの名前、例えば、oke-demo-cluster
- ノード・タイプ:管理対象
- ノード・シェイプ:VM.Standard.E4.Flex
- ノード数:1
ノード数は、ノード・プールに作成するワーカー・ノードの数です。この記事では、1ノードとしましたが、高可用性が求める本番環境では、最小構成3ノードがおすすめです。
-
「次」をクリックして、新しいクラスタ用に入力した詳細を確認します。「確認」ページで「基本クラスタの作成」オプションを選択し、「クラスタの作成」をクリックします。
拡張クラスタおよび基本クラスタの違いは、OCI ドキュメントをご参照ください。この記事では、無料の基本クラスタを選択しましたが、基本クラスタでサポートされない機能が必要な場合、拡張クラスタを選択してください。
-
最初に、新しいクラスタが、「作成中」ステータスでコンソールに表示されます。クラスタが作成されると、そのステータスは「アクティブ」になります。
1.5.2. oci cli の設定
作成したクラスタへアクセスするには、クライアントツールをインストールする必要になります。OKE クラスターの詳細画面から、「クラスタへのアクセス」をクリックして、「ローカル・アクセス」を選択して、oci-cli/kubectlの設定手順を確認できます。
参考資料:
次は、ローカル開発環境(Oracle Linux)での流れです。
-
oci cliをインストールします。
sudo dnf -y install oraclelinux-developer-release-el8 sudo dnf install python36-oci-cli
-
次のコマンドを使用し、構成ファイルを設定します。
oci setup config
このコマンドを使用すると、構成ファイルの作成に必要な情報とAPI公開キーおよび秘密キーの入力が求められます。
APIキーを自動生成するか、既存のキーを指定するかが選択可能です。
終わったら、コンソールを使用して公開キーをアップロードしてください。
-
次のコマンドを実行し、構成ファイルを検証します。
oci os ns get
1.5.3. kubectl のインストール
Kubernetesドキュメントを参照して、kubectlをローカルにインストールします。Oracle Linuxは、yumでインストールできます。
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.29/rpm/repodata/repomd.xml.key
EOF
sudo yum install -y kubectl
1.5.4. kubectl の設定
oci cli の設定
と同じように、OKE クラスターの詳細画面から、kubectlの設定する流れを参照して、コマンドをローカル環境で実行します。
-
次のコマンドを実行し、kubeconfigファイルを格納するディレクトリを作成します。
mkdir -p $HOME/.kube
-
kubeconfigファイルを作成します。パブリック・エンドポイント/プライベート・エンドポイントによって、コマンドを選択して実行します。今回は、パブリック・エンドポイントからアクセスするコマンドを実行します。
[opc@containerdemo ~]$ oci ce cluster create-kubeconfig --cluster-id ocid1.cluster.oc1.ap-tokyo-1.aaaaaaaaij6wmfhusesaqkqxoe5rbrjoglvuw4h3njsyb3rnncqt2i7wdwza --file $HOME/.kube/config --region ap-tokyo-1 --token-version 2.0.0 --kube-endpoint PUBLIC_ENDPOINT New config written to the Kubeconfig file /home/opc/.kube/config
-
KUBECONFIG環境変数をこのクラスタのファイルに設定するには、次を使用します:
export KUBECONFIG=$HOME/.kube/config
-
kubectl get nodes
を実行して、kubectlを確認します。ノードが表示されたら、kubectlの設定が成功でした。[opc@containerdemo ~]$ kubectl get nodes NAME STATUS ROLES AGE VERSION 10.0.10.250 Ready node 35m v1.28.2
1.5.5. OCIR を利用するための事前準備
OCIR は Oracle が提供するコンテナレジストリのマネージドサービスです。ここでは、作成したコンテナイメージを OCIR にプッシュ(アップロード)します。
OCIR に docker コマンドからアクセスするため、OCI のユーザーアカウントに必要な設定をしていきます。
- OCIコンソール画面右上の人型のアイコンをクリックし、展開したプロファイルからユーザ名(oracleidentitycloudservice/<ユーザ名>)をクリックします。
- 下にスクロールした左側にある認証トークンをクリックして、トークンの作成画面に遷移します。
- トークンの生成ボタンをクリックします。
- [Geterate Token]ダイアログで、トークンの用途を説明する情報(任意の文字列)を入力し、トークンの生成ボタンをクリックします。
- ダイアログに生成したトークンが表示されます。Copyという文字列をクリックするとクリップボードにこのトークンがコピーされます。そして閉じるをクリックします。
- このトークンはあとの手順で利用するため、テキストエディタ等にペーストするなどして控えておいてください
1.5.6. OCIR にリポジトリの作成
OCIRにビルドしたコンテナイメージを格納するリポジトリを作成します。
-
OCI コンソールの左上のハンバーガーメニューから、「開発者サービス」-「コンテナ・レジストリ」を選択します。
-
左メニューにあるコンパートメントのプルダウンメニューから対象のコンパートメントを選択します。
-
「リポジトリの作成」ボタンをクリックします。
-
以下の設定を行い、「作成」ボタンをクリックします。
- コンパートメント:対象のコンパートメント
- リポジトリ名:hello-repository
- アクセス:プライベート
リポジトリのアクセス(パブリック・リポジトリかプライベート・リポジトリか)について、テナンシの管理者グループに属しているか、REPOSITORY_MANAGE権限を付与されている場合のみ、リポジトリを公開できます。リポジトリを公開する場合、インターネット・アクセス権と適切なURLの知識があるユーザーは、リポジトリからイメージをプルできます。リポジトリをプライベートにすると、(テナンシの管理者グループに属するユーザーとともに)リポジトリに対する操作を実行できます。
1.5.7. OCIR にコンテナイメージをプッシュする
-
ローカルのイメージ一覧を確認します(イメージがない場合、ECRからイメージをPullしてください)。
[opc@containerdemo ~]$ docker image ls Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg. REPOSITORY TAG IMAGE ID CREATED SIZE localhost/hello-world latest 9bf33989ed36 6 days ago 210 MB 281288470701.dkr.ecr.ap-northeast-1.amazonaws.com/hello-repository latest 9bf33989ed36 6 days ago 210 MB
-
OCIR へ Pushするためイメージにタグをつけます。
docker tag hello-world [リージョンコード].ocir.io/オブジェクト・ストレージ・ネームスペース]/[リポジトリ名]/hello-world
[opc@containerdemo ~]$ docker tag hello-world nrt.ocir.io/testtenancy/hello-repository/hello-world Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg.
イメージタグを省略した場合、タグは latest と見なされます。イメージタグを指定する場合、次の様に設定します。
docker tag hello-world [リージョンコード].ocir.io/オブジェクト・ストレージ・ネームスペース]/[リポジトリ名]/hello-world:tag
ご自身の環境に合わせて、ドキュメントから適切なリージョンコードを見つけてください。
オブジェクト・ストレージ・ネームスペースは、OCIコンソール画面右上の人型のアイコンをクリックし、展開したプロファイルからテナンシ:<テナンシ名>から確認します。
-
イメージのタグを確認します。
[opc@containerdemo ~]$ docker image ls Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg. REPOSITORY TAG IMAGE ID CREATED SIZE localhost/hello-world latest 9bf33989ed36 7 days ago 210 MB 281288470701.dkr.ecr.ap-northeast-1.amazonaws.com/hello-repository latest 9bf33989ed36 7 days ago 210 MB nrt.ocir.io/testtenancy/hello-repository/hello-world latest 9bf33989ed36 7 days ago 210 MB
-
以下のコマンドでOCIRにログインします。Login Succeededというメッセージが表示されれば、ログイン成功です。
docker login [リージョンコード].ocir.io
例えば、東京リージョン(nrt)をご利用の場合は、以下のコマンドでログインします。
docker login nrt.ocir.io
ユーザー名、パスワードの入力を求めるメッセージが表示されますので、以下のように入力してください。
-
ユーザー名:
[オブジェクト・ストレージ・ネームスペース]/[ユーザー名]
(例:testtenancy/oracleidentitycloudservice/xxxxx.yyy@oracle.com
) -
パスワード:
[OCIR を利用するための事前準備で 作成したトークン文字列]
ユーザー名は、OCIコンソール画面右上の人型のアイコンをクリックし、展開したプロファイルからユーザーから確認します。取得したユーザー名を
[オブジェクト・ストレージ・ネームスペース]/[ユーザー名]
の形で連結してログインユーザーとして使います。
-
-
これで準備が整いましたので、実際にOCIRにイメージをプッシュします。以下のコマンドを実行してください。
docker image push [リージョンコード].ocir.io/[オブジェクト・ストレージ・ネームスペース]/[リポジトリ名]/hello-world
例えば、以下のように指定します。
docker image push hello-world nrt.ocir.io/testtenancy/hello-repository/hello-world
以下のような実行結果となれば、プッシュが成功しています。
[opc@containerdemo ~]$ docker image push hello-world nrt.ocir.io/testtenancy/hello-repository/hello-world Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg. Getting image source signatures Copying blob d2e23825b905 done Copying blob 548a79621a42 done Copying blob 475b33db679c done Copying blob 8607ef4f2ff2 done Copying config 9bf33989ed done Writing manifest to image destination
-
OCIRにコンテナが保存されていることを確認してみましょう。OCIコンソールの画面で左上のメニューを展開し、開発者サービス-コンテナ・レジストリをクリックします。リポジトリの一覧が表示されます。この中に、指定した名前のコンテナがあることを確認してください。(デフォルトでは、イメージがルートコンパートメントにプッシュされますので、ルートコンパートメントの配下で確認してください)
1.5.8. OKEへのデプロイ
-
kubectlを使用してDockerレジストリ・シークレットを作成する必要があります。シークレットには、イメージをプルするときに使用するOracle Cloud Infrastructureの資格証明が含まれます。
kubectl create secret docker-registry ocisecret --docker-server=[リージョンコード].ocir.io --docker-username=[オブジェクト・ストレージ・ネームスペース]/[ユーザー名] --docker-password='[OCIR を利用するための事前準備で 作成したトークン文字列]' --docker-email=<email-address>
例えば、
[opc@containerdemo hello-world]$ kubectl create secret docker-registry ocisecret --docker-server=nrt.ocir.io --docker-username=testtenancy/oracleidentitycloudservice/xxxxx.yyy@oracle.com --docker-password='ds)}d}yv79Ks<+BT5<:[' --docker-email=xxxxx.yyy@oracle.com secret/ocisecret created
-
OKEを始めとして、Kubernetesのクラスターにコンテナをデプロイするには、クラスター上の配置情報をmanifestと呼ばれるファイルに記述しておく必要があります。まずは、Deploymentを定義するファイル
hello-world.yaml
を作成します。apiVersion: apps/v1 kind: Deployment metadata: name: hello-world-deployment labels: app: hello-world spec: replicas: 3 selector: matchLabels: app: hello-world template: metadata: labels: app: hello-world spec: containers: - name: hello-world image: nrt.ocir.io/testtenancy/hello-repository/hello-world:latest ports: - containerPort: 80 imagePullSecrets: - name: ocisecret
このファイルによって、サンプルアプリケーションのコンテナが、クラスター上にどのように配置されるかが定義されています。例えば、
replicas:3
という記述は、このコンテナが、3つ立ち上げられて冗長構成を取るということを意味しています。containers:
という記述は、実際にクラスター上で動かすコンテナイメージが指定されています。imagePullSecrets:
は、作成したレジストリ・シークレットを指定します。Deploymentの詳細については、Kubernetesドキュメントを参照してください。 -
次に、
hello-world-service.yaml
というmanifestファイルの内容を作成します。apiVersion: v1 kind: Service metadata: name: hello-world-service labels: app: hello-world annotations: oci.oraclecloud.com/load-balancer-type: "lb" service.beta.kubernetes.io/oci-load-balancer-shape: "flexible" service.beta.kubernetes.io/oci-load-balancer-shape-flex-min: "10" service.beta.kubernetes.io/oci-load-balancer-shape-flex-max: "30" spec: type: LoadBalancer selector: app: hello-world ports: - port: 80
このmanifestファイルは、クラスターに対するリクエストのトラフィックを受け付ける際のルールを定義しています。
type: LoadBalancer
という記述は、クラスターがホストされているクラウドサービスのロードバランサーを自動プロビジョニングし、そのLBに来たトラフィックをコンテナに届けるという意味です。LoadBalancerタイプのKubernetesサービスのOCIロード・バランサをプロビジョニングする方法についてはOKEドキュメントを参照してください。 -
それでは、Kubernetes上でサンプルアプリケーションのコンテナを動かしてみます。まずは、クラスターを区画に分けて管理するための領域である、namespaceを作成します。以下のコマンドで、namespace名は任意の文字列を指定できます。今回は”hello-world-demo”というnamespace名で作成します。
kubectl create namespace hello-world-demo
-
デフォルトのNamespaceを上記で作成したものに変更しておきます。これを行うと、以降、kubectlの実行の度にNamespaceを指定する必要がなくなります。
kubectl config set-context $(kubectl config current-context) --namespace=hello-world-demo
-
次に、manifestファイルをクラスターに適用し、PodやServiceをクラスター内に作成します。
[opc@containerdemo hello-world]$ kubectl apply -f hello-world.yaml deployment.apps/hello-world-deployment created [opc@containerdemo hello-world]$ kubectl apply -f hello-world-service.yaml service/hello-world-service created
-
以下のコマンドを実行して、リソースの構成が完了しているかどうかを確認することができます。
[opc@containerdemo hello-world]$ kubectl get pod,service NAME READY STATUS RESTARTS AGE pod/hello-world-deployment-795fbc7f8c-f4k6n 1/1 Running 0 6m58s pod/hello-world-deployment-795fbc7f8c-jg72m 1/1 Running 0 7m2s pod/hello-world-deployment-795fbc7f8c-wrvq4 1/1 Running 0 12m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/hello-world-service LoadBalancer 10.96.70.121 155.248.171.21 80:30947/TCP 3d21h
すべてのPodのSTATUSがRunnigであることと、
hello-world-service
という名前のServiceがあることが確認できれば、リソースの作成は完了です(ServiceのEXTERNAL-IPは、ロードバランサーが実際に作成されるまで表示されません。その場合は少し時間を置いて上記コマンドを再実行してください)。上の例では、IPアドレス155...***の80番ポートでロードバランサーが公開されておりここにリクエストを送信すると、アプリケーションにアクセスできることを意味しています。このIPアドレスをテキストエディタ等に控えておいてください。
1.5.9. DNS 更新
トラフィックをECS FargateからOKE に切り替えるため、DNS側の設定を修正します。
-
AWS ECS FargateのALBへRedirectするCNAMEレコードをAレコードに変更し、IPv4のアドレスをOKEのロードバランサーのIPに変更します。
-
nslookupなどコマンドを実行し、DNSレコードの変更が反映されたことを確認します。OKEのLBのIPと表示されたら、DNSレコードの変更が反映されています。
[opc@containerdemo hello-world]$ nslookup hello-world.xxxxxx.top Name: hello-world.xxxxxx.top Address: 155.248.171.21 → OCI LBのIP
-
ブラウザーで DNSドメインをアクスタします。「Hello World!」と表示されたら、OKE への移行が完了です。