まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

IBM Cloud から提供されている 30 日間無料 Kubernetes サービスIBM Kubernetes Service 、以下 "IKS")環境を使って利用することのできるコンテナイメージを1日に1個ずつ 30 日間連続で紹介していきます。

環境のセットアップや制約事項については Day0 のこちらの記事を参照してください。

Day 3 は高速な HTTP サーバーであると同時にリバースプロキシーとしても使われる Nginx イメージをデプロイする例を紹介します。
Nginx-Logo-02


【イメージの概要】
このイメージは Day2 で紹介した Apache HTTP サーバーに対して高速性を売りにシェアを伸ばしてきた HTTP サーバーです。「エンジンエックス」と発音します。私個人的には1台のサーバーを複数のサーバーがあるかのように動かすバーチャルサーバー機能を実現する手段として、Nginx のリバースプロキシー機能をよく使っています。


【イメージのデプロイ】
Nginx イメージのデプロイ用 YAML ファイルを公開したので、このファイルを指定してデプロイします。以下のコマンドを実行する前に Day 0 の内容を参照して ibmcloud CLI ツールで IBM Cloud にログインし、クラスタに接続するまでを済ませておいてください。

そして以下のコマンドを実行します:
$ kubectl apply -f https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/nginx.yaml

以下のコマンドで Nginx 関連の Deployment, Service, Pod, Replicaset が1つずつ生成されたことと、サービスが 30080 番ポートで公開されていることを確認します:
$ kubectl get all

NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-7848d4b86f-k6rlf   1/1     Running   0          12s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   172.21.0.1       <none>        443/TCP        26d
service/nginx        NodePort    172.21.253.209   <none>        80:30080/TCP   13s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           13s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-7848d4b86f   1         1         1       13s

この後に実際にサービスを利用するため、以下のコマンドでワーカーノードのパブリック IP アドレスを確認します(以下の例であれば 161.51.204.190):
$ ibmcloud ks worker ls --cluster=mycluster-free
OK
ID                                                       パブリック IP    プライベート IP   フレーバー   状態     状況    ゾーン   バージョン
kube-c3biujbf074rs3rl76t0-myclusterfr-default-000000df   169.51.204.190   10.144.185.144    free         normal   Ready   mil01    1.20.7_1543*

つまりこの時点で(上述の結果であれば)アプリケーションは http://169.51.204.190:30080/ で稼働している、ということになります。早速実行してみます。ウェブブラウザか curl コマンドを使って、アプリケーションの URL(上述の方法で確認した URL)にアクセスしてみます:
20210723_nginx01


"Welcome to nginx!" というお馴染みのトップ画面が表示されました。Nginx が IKS 環境へデプロイされて動くようになりました。


【YAML ファイルの解説】
YAML ファイルはこちらを使っています:
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

Deployment 1つと、Service 1つのごくごくシンプルな YAML ファイルですが、一応解説を加えておきます。アプリケーションそのものは 80 番ポートで動作するように作られているため、NodePort 30080 番を指定して、外部からは 30080 番ポートでアクセスできるようにしています(NodePort として指定可能な番号の範囲は 30000 ~ 32767 です、指定しない場合は空いている番号がランダムに割り振られます)。また ReplicaSet は1つだけで作りました。


デプロイしたコンテナイメージを削除する場合はデプロイ時に使った YAML ファイルを再度使って、以下のコマンドを実行します。不要であれば削除しておきましょう:
$ kubectl delete -f https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/nginx.yaml


【紹介したイメージ】
https://hub.docker.com/_/nginx


【紹介記録】
※この表は Day 30 まで紹介した後に全リンクを更新予定です。

Dayカテゴリーデプロイ内容
0準備準備作業
1ウェブサーバーhostname
2Apache HTTP
3Nginx
4?
5?
6データベース?
7?
8?
9?
10?
11?
12?
13?
14?
15?
16?
17?
18?
19プログラミング?
20?
21?
22?
23?
24?
25アプリケーション?
26?
27?
28?
29?
30?

IBM Cloud から提供されている 30 日間無料 Kubernetes サービスIBM Kubernetes Service 、以下 "IKS")環境を使って利用することのできるコンテナイメージを1日に1個ずつ 30 日間連続で紹介していきます。

環境のセットアップや制約事項については Day0 のこちらの記事を参照してください。

Day 2 は超有名な Apache HTTP イメージをデプロイする例を紹介します。
eyecatch-apache


【イメージの概要】
このイメージは昔から HTTP サーバーとして広く使われてきた Apache HTTP サーバーです。静的なコンテンツの公開だけでなく、CGI などの仕組みと組み合わせてアプリケーション・サーバーとして利用されることが多いという印象です。


【イメージのデプロイ】
Apache HTTP イメージのデプロイ用 YAML ファイルを公開したので、このファイルを指定してデプロイします。以下のコマンドを実行する前に Day 0 の内容を参照して ibmcloud CLI ツールで IBM Cloud にログインし、クラスタに接続するまでを済ませておいてください。

そして以下のコマンドを実行します:
$ kubectl apply -f https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/apache.yaml

以下のコマンドで Apache HTTP 関連の Deployment, Service, Pod, Replicaset が1つずつ生成されたことと、サービスが 30080 番ポートで公開されていることを確認します:
$ kubectl get all

NAME                          READY   STATUS    RESTARTS   AGE
pod/apache-76695bf577-pj9w5   1/1     Running   0          4m2s

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/apache       NodePort    172.21.151.226   <none>        80:30080/TCP   4m4s
service/kubernetes   ClusterIP   172.21.0.1       <none>        443/TCP        26d

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/apache   1/1     1            1           4m4s

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/apache-76695bf577   1         1         1       4m4s

この後に実際にサービスを利用するため、以下のコマンドでワーカーノードのパブリック IP アドレスを確認します(以下の例であれば 161.51.204.190):
$ ibmcloud ks worker ls --cluster=mycluster-free
OK
ID                                                       パブリック IP    プライベート IP   フレーバー   状態     状況    ゾーン   バージョン
kube-c3biujbf074rs3rl76t0-myclusterfr-default-000000df   169.51.204.190   10.144.185.144    free         normal   Ready   mil01    1.20.7_1543*

つまりこの時点で(上述の結果であれば)アプリケーションは http://169.51.204.190:30080/ で稼働している、ということになります。早速実行してみます。ウェブブラウザか curl コマンドを使って、アプリケーションの URL(上述の方法で確認した URL)にアクセスしてみます:
20210723_apache01


分かる人にはおなじみの(笑)Apache HTTP サーバーの初期起動メッセージ "It works!" が表示されました。無事にデプロイできて、IKS 環境で動いている状態が作れました。



【YAML ファイルの解説】
YAML ファイルはこちらを使っています:
apiVersion: v1
kind: Service
metadata:
  name: apache
spec:
  selector:
    app: apache
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: apache
spec:
  replicas: 1
  selector:
    matchLabels:
      app: apache
  template:
    metadata:
      labels:
        app: apache
    spec:
      containers:
      - name: apache
        image: httpd
        ports:
        - containerPort: 80

Deployment 1つと、Service 1つのごくごくシンプルな YAML ファイルですが、一応解説を加えておきます。アプリケーションそのものは 80 番ポートで動作するように作られているため、NodePort 30080 番を指定して、外部からは 30080 番ポートでアクセスできるようにしています(NodePort として指定可能な番号の範囲は 30000 ~ 32767 です、指定しない場合は空いている番号がランダムに割り振られます)。また ReplicaSet は1つだけで作りました。


デプロイしたコンテナイメージを削除する場合はデプロイ時に使った YAML ファイルを再度使って、以下のコマンドを実行します。不要であれば削除しておきましょう:
$ kubectl delete -f https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/apache.yaml


【紹介したイメージ】
https://hub.docker.com/_/httpd


【紹介記録】
※この表は Day 30 まで紹介した後に全リンクを更新予定です。

Dayカテゴリーデプロイ内容
0準備準備作業
1ウェブサーバーhostname
2Apache HTTP
3?
4?
5?
6データベース?
7?
8?
9?
10?
11?
12?
13?
14?
15?
16?
17?
18?
19プログラミング?
20?
21?
22?
23?
24?
25アプリケーション?
26?
27?
28?
29?
30?

IBM Cloud から提供されている 30 日間無料 Kubernetes サービスIBM Kubernetes Service 、以下 "IKS")環境を使って利用することのできるコンテナイメージを1日に1個ずつ 30 日間連続で紹介していきます。

環境のセットアップや制約事項については Day0 のこちらの記事を参照してください。

記念すべき Day 1 は k8s としての特徴がわかりやすいものとして hostname イメージをデプロイする例を紹介します。

【イメージの概要】
このイメージは Docker や k8s などのコンテナ環境の動作特徴を確認する上で便利なウェブアプリケーションです。ウェブのドキュメントルートにアクセスすると、動作しているサーバーの /etc/hostname ファイルの中身をそのままテキスト表示する、というだけの機能を持っています。ちなみに私が作ったコンテナイメージです(笑)。

/etc/hostname ファイルは(多くの場合で)サーバーのホスト名が記述されているファイルです。特に Docker や k8s などのコンテナ環境や複数インスタンス環境においてはコンテナごと/インスタンスごとに内部ホスト名が変わるので、「現在、このアプリケーションがどのコンテナ/インスタンスで動いているのか?」を簡単に確認するためのアプリケーション、という側面も持っていることになります。

後述しますが、今回は k8s クラスタ上で5台程度スケールアウトさせた状態を作ってデプロイします。そしてこのアプリケーションにウェブアクセスすることで(アクセス先のインスタンスが変わって)表示内容が毎回変わる、ということが確認でき、自作ツールながらよくコンテナの動作確認時に便利に使っているものです。Day 1 では k8s の理解を含める意味も含めて、この hostname コンテナを動かしてみることにします。


【イメージのデプロイ】
hostname イメージのデプロイ用 YAML ファイルを公開したので、このファイルを指定してデプロイします。以下のコマンドを実行する前に Day 0 の内容を参照して ibmcloud CLI ツールで IBM Cloud にログインし、クラスタに接続するまでを済ませておいてください。

そして以下のコマンドを実行します:
$ kubectl apply -f https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/hostname.yaml

以下のコマンドで hostname 関連の Deployment, Service, Pod, Replicaset が1つずつ生成されたことと、サービスが 30080 番ポートで公開されていることを確認します:
$ kubectl get all

NAME                            READY   STATUS    RESTARTS   AGE
pod/hostname-7b4f76fd59-hsf7d   1/1     Running   0          7s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/hostname     NodePort    172.21.73.164   <none>        8080:30080/TCP   9s
service/kubernetes   ClusterIP   172.21.0.1      <none>        443/TCP          14d

NAME                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/hostname   1/1     1            1           8s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/hostname-7b4f76fd59   1         1         1       8s

この後に実際にサービスを利用するため、以下のコマンドでワーカーノードのパブリック IP アドレスを確認します(以下の例であれば 161.51.204.190):
$ ibmcloud ks worker ls --cluster=mycluster-free
OK
ID                                                       パブリック IP    プライベート IP   フレーバー   状態     状況    ゾーン   バージョン
kube-c3biujbf074rs3rl76t0-myclusterfr-default-000000df   169.51.204.190   10.144.185.144    free         normal   Ready   mil01    1.20.7_1543*

つまりこの時点で(上述の結果であれば)アプリケーションは http://169.51.204.190:30080/ で稼働している、ということになります。早速実行してもいいのですが、この hostname アプリケーションの場合はレプリカセットを変更して稼働インスタンス数を増やしてからの方が特徴が理解しやすいと思うので、先にレプリカ数を5つくらいに変更しておきます:
$ kubectl scale --replicas=5 deployment hostname

$ kubectl get replicaset
NAME                  DESIRED   CURRENT   READY   AGE
hostname-7b4f76fd59   5         5         5       7m29s

改めてこのアプリケーションにアクセスしてみます。ウェブブラウザか curl コマンドを使って、アプリケーションの URL(上述の方法で確認した URL)にアクセスしてみます:
2021071103


そのまま画面をリロードして、表示される内容が変わることを確認します。リロードするたびに内容が変わります:
2021071104


繰り返しますが、このアプリケーションは稼働中のホストの /etc/hostname の内容を表示するものです。アクセスするたびに内容が変わるということは同じ URL で異なるサーバーが稼働していることを意味しており、それらがちゃんとアクセスするたびに振り分けられて(負荷分散されて)稼働できている、ということが確認できました。拙作の hostname はこのようなコンテナ環境の動作確認に適しているツールだと自負しているので、よかったらぜひ皆さんも使ってみてください。


Day 1 はコンテナ環境としての動作確認をするために特殊なアプリケーションを紹介しました。Day 2 以降は一般に公開されているアプリケーションコンテナをデプロイする例を中心に紹介していく予定です。


【YAML ファイルの解説】
YAML ファイルはこちらを使っています:
apiVersion: v1
kind: Service
metadata:
  name: hostname
spec:
  selector:
    app: hostname
  ports:
  - port: 8080
    protocol: TCP
    targetPort: 8080
    nodePort: 30080
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hostname
spec:
  replicas: 1
  selector:
    matchLabels:
      app: hostname
  template:
    metadata:
      labels:
        app: hostname
    spec:
      containers:
      - name: hostname
        image: dotnsf/hostname
        ports:
        - containerPort: 8080

Deployment 1つと、Service 1つのごくごくシンプルな YAML ファイルですが、一応解説を加えておきます。アプリケーションそのものは 8080 番ポートで動作するように作られているため、NodePort 30080 番を指定して、外部からは 30080 番ポートでアクセスできるようにしています(NodePort として指定可能な番号の範囲は 30000 ~ 32767 です、指定しない場合は空いている番号がランダムに割り振られます)。また ReplicaSet は1つだけで作りますが、はじめから5つで作る場合はこの数値を変更しておくことで実現可能です。


なお、デプロイしたコンテナイメージを削除する場合はデプロイ時に使った YAML ファイルを再度使って、以下のコマンドを実行します。このワーカーノード1つで(イメージの内容にもよりますが)コンテナ5~6個は余裕で動くはずです、が、あと 30 日ぶんあるので不要であれば削除しておきましょう:
$ kubectl delete -f https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/hostname.yaml


【紹介したイメージ】
https://hub.docker.com/r/dotnsf/hostname


【紹介記録】
※この表は Day 30 まで紹介した後に全リンクを更新予定です。

Dayカテゴリーデプロイ内容
0準備準備作業
1ウェブサーバーhostname
2?
3?
4?
5?
6データベース?
7?
8?
9?
10?
11?
12?
13?
14?
15?
16?
17?
18?
19プログラミング?
20?
21?
22?
23?
24?
25アプリケーション?
26?
27?
28?
29?
30?


このページのトップヘ