はじめに
本日はIBM Cloud Kubernetes Service(IKS)にnginxを立ち上げるハンズオンを行ってみたので、その流れを整理したいと思います。
今回の内容にはIBM Cloudのアカウント(無料利用可能)が前提となっています。
nginx立ち上げの準備
IKSのクラスター作成
IKSのクラスターを作成します。ナビゲーションメニューをクリックしてKubernetes
→クラスター
にアクセスします。
クラスターの設定を行います。クラスターはVPCとClassicを選択できますが、今回はClassicで作成しています。その他リソースグループの設定やリージョンの設定を行います。
また、クラスターのプロファイル(フレーバー)も変更可能です。今回は最小構成+ゾーンあたりのworker nodeも1つに減らして作成しています。そのほかAdd onなどを設定し、作成
ボタンをクリックします。
クラスター作成が完了されたら以下の画面が表示されるかと思います。詳細の部分にクラスターIDが記載されているので、コピーしておきます。
IBM Cloudへのログイン
ターミナルにて、IBM Cloudにログインします。ログインはCLIを使用したワンタイム・パスコードを利用すると便利です。
右上のプロフィールアイコンをクリックし、CLIとAPIにログイン
をクリックしますと、以下のログインCLIが表示されます。
IBM Cloud CLIをコピーしコマンド入力にてログインを行います。
その後、以下のコマンドを使ってクラスターを指定します。
Kubernetesの環境を設定するには、exportコマンドが必要です。exportコマンドは、ibmcloud ks cluster config
コマンドを入力して取得します。
クラスター画面で取得してクラスターIDに差し替えてターミナルに入力します。
なお、クラスターIDの代わりに、クラスター名を入れても指定は可能です。
ibmcloud ks cluster config --cluster <cluster-id>
<cluster-id> のコンテキストを現在の kubeconfig ファイルに追加しました。
これで、クラスターに対して「kubectl」コマンドを実行できます。 例えば、「kubectl get nodes」を実行します。
クラスターに初めてアクセスする場合、RBAC の同期中に「kubectl」コマンドが数秒間失敗することがあります。
Dockerイメージの準備
Dockerfileの作成
nginxをデプロイするにDockerイメージを使用します。
以下のコードで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イメージをビルドします。
docker build .
IBM Cloud Container Registryに格納
作成したDockerイメージをContainer Registryに格納します。
以下コマンドを使ってContainer Registryにログインします。
ibmcloud cr login
次にイメージをタグづけしてプッシュします。
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で外部からアクセスできるようになります。
今回私は以下のように作成しました。
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
apiVersion: v1
kind: Service
metadata:
name: iks-service
spec:
selector:
app: iks
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
Kubernetes マニフェストの適用
作成したマニフェストを以下のコマンドを使ってKubernetesクラスターに適用します。
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
結果の確認
公開されたIPアドレスを確認します。
まず、以下のコマンドにてKubernetes上に適用されたか確認します。
kubectl get all
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の情報を得るために、以下のコマンドを入力します。
クラスターの指定と同様に、にはクラスター名を入力しても構いません。
ibmcloud ks worker ls --cluster <cluster-id>
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がデプロイされていることがわかります。
最後に
今回はDockerfileやyamlを作成し、それをもってIBM Cloud Kubernetes Serviceのクラスター上にnginxを立ち上げる流れを整理しました。次回にはこちらのnginxを実際いじってみたり、アプリケーションを載せてみることに挑戦してみたいと思います。