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

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

2021/08

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

最終日というかおまけとして、31 日目は実際にこれらのイメージをデプロイしてきたの感想を含めたあとがきを記していきます。


【率直な感想】
改めてこの 30 日間を振り返ります。これだけの環境を作ってきました:

Dayカテゴリーデプロイ内容
0準備準備作業
1ウェブサーバーhostname
2Apache HTTP
3Nginx
4Tomcat
5Websphere Liberty
6データベースMySQL
7phpMyAdmin
8PostgreSQL
9pgAdmin4
10MongoDB
11Mongo-Express
12Redis
13RedisCommander
14ElasticSearch
15Kibana
16CouchDB
17CouchBase
18HATOYA
19プログラミングNode-RED
20Scratch
21Eclipse Orion
22Swagger Editor
23R Studio
24Jenkins
25アプリケーションFX
262048
27DOS Box
28VNC Server(Lubuntu)
29Drupal
30WordPress



自分はプログラマーなので、プログラマー視点というか開発者視点で客観的にこの表を見てまず思うのは、自分が開発環境として使いそうなデータベースやツール、ミドルウェア類は一通り揃っているという事実です。もちろん自分の PC にこの環境を用意することはできるし、ローカルだけで開発環境が整うのはそれはそれでメリットもあるわけですが、一方で無料のリモート環境にこれだけのツール類を揃えて使うことができるというのは充分すぎるというか、「使う予定はないかもしれないけど、この環境を使うならおまけに R Studio も入れちゃおうかな」とか、「念の為 IaaS 的な環境も」とか、「ちょっと気分転換にゲームを」とか余裕で考えるくらいの環境が用意できる、そんな太っ腹な無料サービスだと改めて感じました。

また単なる開発環境である以上に、コンテナや k8s の運用を勉強するための環境としてもかなり使えると感じています。Day 1 で紹介したようなレプリカセットを変更した上で挙動の変化を確認したり、Day 24 では k8s の管理ダッシュボードを使ってポッドの中でシェルを動かしたり、Day 29Day 30 では複数のコンテナを通信させて動く環境を作る、といったことも体験できました。普段データベースは使っているけど、データの解析はしたことがない人でも解析環境まで入手できるようになる、このような、実際に外部から利用可能な形で公開して体験できる形の環境が無料で提供されているという点を改めて素晴らしいと感じています。


【この環境の制約事項について】
もちろん制約事項を感じることもありました。この契約では k8s の Ingress が使えないためサービスは NodePort 公開しかできない(ワーカーノードの IP アドレスでしか公開できない)、そのためコンテナ側に SSL を使った公開方法が考慮されていてもこの環境では使えない、、といった制約を何度か経験することになりました。まあここは開発環境と割り切って使う中ではあまり気にならないとも言えますけど、外部連携時に SSL 接続を前提としているケースがあったり、(IP アドレスではなく)ドメイン名やホスト名を使う前提のサービスと連携するケースがあったりすると、そこで制約を受けることになる点が注意が必要だと思いました。

加えて、今回は 30 日間で紹介するサービスを上述の 30 種類にしていますが、実はこの中に含めたくて諦めたサービスもいくつかあります。それらの多くはこの無料環境でデプロイして使うのは難しい※と判断したものばかりでした。

※自分の誤解に基づくものや、うまく回避する方法を知らなかっただけというものも含まれているかもしれません。ただ今回の企画の時間的な意味も含めた制約の中では「難しい」と諦めざるを得なかった、という意味です。

理由としてもったいなかったのは「デプロイはできたようだが、確認する方法(専用クライアント)がない」というケースでした。超軽量データベースである Apache Derby などはその例で、IKS へのデプロイ自体は成功していたように見えているのですが、動作を確認するにはアプリケーションを作る必要があって、そこまで作業するのが時間制約的に困難だったというケースです。curl やウェブブラウザで動作確認ができず、動作確認用クライアントを作る必要がある、というパターンのは今回は諦めました。

この動作確認用クライアントが存在しない以外の理由が原因となったケースもあります。その1つを紹介すると IBM Db2 コンテナがあります。本環境で IBM Db2 コンテナを使うのが難しそうだと判断した理由は少し特殊な環境設定にありました。

IBM Db2 はデフォルトで 50000 番ポートを使って通信します。ポート番号自体はコンテナ公開時にポートフォワーディングで変更することもできるのですが、IBM Db2 の場合は /etc/services ファイル内にこのポート番号を指定するための設定を加える必要がありました。コンテナで動かす場合は、コンテナイメージ内のこの設定を変更して(かつこの変更が消えないようにして)再起動するか、設定を変更せず 50000 番ポートで公開するか、いずれかの方法が必要となります。

コンテナの紹介ページでは docker コマンドによるデプロイ方法が紹介されていました。docker であれば EXPOSE するポート番号を自由に指定できるのですが、今回は NodePort を使った公開しかできない k8s 環境、という制約があります。また今回は無料の範囲内で(ボリュームを使わずに)紹介するという目的もありました。この制約の中で色々な方法を試したのですが、結局うまく公開することができず、今回は 30 個の中から除外する、という判断をするに至った、という背景を記載しておきます。

ここに記載するのもどうかと思ったのですが、もしかすると詳しい人が引き継いでくれることを期待して、自分が(ちょっと)試してみた限りでは難しそうだと判断して諦めたコンテナイメージのリストを掲載しておきます。本当はこれらを 30 個に加えたかったのだけど、そもそも自分が普段使っているわけではないものもあったりして、設定そのものにあまり詳しくなかったりするものが大半です。もし 30 日無料版 IKS 環境で動かすことができたら教えてください(笑):

コンテナイメージあきらめた理由
Cassandra デプロイはできたが、稼働中にポッドが Pending 状態になる
CockroachDB デプロイ時に CrashLoopBackOff エラー
Apache Derby デプロイはできているっぽいが、動作確認ができていない
GitLab デプロイはできたが、稼働中にポッドが Pending 状態になる(HTTPS 必須で HTTP 接続不可?)
IBM Db2 50000 番ポートでのサービス公開が NodePort の範囲外だった
MediaWiki デプロイはできたが、稼働中に大量の deprecated メッセージ
Memcached デプロイはできたように見えたが、接続時にエラー
Minix デプロイはできたが、Minix のシェルにログインできない・・・と思っていたが、後から方法がわかりました(k8s のポッドにコンソールログインしてから "# ssh localhost")。これを 30 個に含めてもよかったかも。
Mosquitto デプロイはできているっぽいが、動作確認ができていない
phpMoAdmin デプロイはできているっぽいが、MongoDB に接続できない(docker 環境でしか動かないコンテナイメージ?)
Container Registry デプロイはできているっぽいが、動作確認ができていない(HTTPS 必須で HTTP 接続不可?)
SAMBA デプロイはできたように見えたが、接続時にエラー
Ubuntu デプロイ時に CrashLoopBackOff エラー


Minix イメージについては幻の 31 日目のイメージとして加えさせていただきます(笑)。


上述の IBM Db2 もそうだったのですが、コンテナ内のファイルを編集して再起動、を前提とするようなコンテナイメージや、そもそも動作に必要なスペックが高すぎるものは諦めました。自分の場合はあくまで開発環境という意味での「とりあえず動いて外部から利用できることが重要」という視点で見ていたので、上記 30 個のリストの中にもしかすると使っているうちに別の制約を受けることになる可能性は否定できません。


【最後に】
改めて書きますが、これだけの開発環境が連続して 30 日間無料で使えるというのはやはり魅力です。自分が業務や個人で作っているアプリケーションを作る際の環境と比較しても、ほぼ支障を感じることがありませんし、制約事項で挙げたサービスについても他の方法で無料で入手することができるものばかりと考えると、アプリケーション開発者にとっては無料で勉強も利用もできる環境がかなり広くなったと改めて感慨にふけることができるようになりました。

余談ですが、IBM Cloud にはこの 30 日無料版 k8s クラスタ環境以外にも、無料枠内で(期間制限なしで)使える多くのサービスが用意されています。この k8s 環境を通じて、興味が湧いたらぜひこちらも試していただきたいです。これは私自身の感想ですが、マネージドサービスで使えるデータベースは本当に便利です。

本 k8s 環境をできるだけ多くの人に知ってもらって、使ってみていただければと思っています。


最後に 30 日間の利用環境が残り1時間になった時の記念写真。1か月ありがとうございました。
mycluster1

mycluster2




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

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

Day 25 からはアプリケーション系コンテナとその GUI ツールを中心に紹介してます。最終日である Day 30 は集大成として世の中の大半のウェブコンテンツを管理していると思われる WordPress イメージをデプロイする例を紹介します。
wp0


【イメージの概要】
ブログなどのウェブコンテンツを管理・編集・公開するシステムです。

個人的にも WordPress には思い入れがあります。業務とは関係のないところで WordPress を知って、勉強して、そこから自分のキャリアが変わるきっかけにもなりました。今の自分が今の立場でいるのは WordPress との関わりがあったからだと思っています。そんな背景もあって 30 日間連続ブログの最終日に紹介するコンテンツとさせていただきました。

WordPress の動作時にはデータベースが必要なのですが、今回は MySQL を使う方法を紹介します。MySQL 単体のデプロイについては Day 6 でも紹介しているので、必要に応じて参照してください。


【イメージのデプロイ】
まずはこれら2つのファイルを自分の PC にダウンロードしてください:
https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/mysql.yaml
https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/wordpress.yaml

前者が MySQL 用、後者が WordPress 用のデプロイファイルです(両方使います)。
前者の MySQL 用デプロイファイルは Day 6 で行ったものと同様の編集が必要です。mysql.yaml ファイルをテキストエディタで開いて、 "MYSQL_" で始まる4箇所の env.name の value 値を変更してください。それぞれの具体的な意味は以下の通りです(初期値として指定されている値のまま動かすことも可能ですが、安全のためなるべく変更してください):
・MYSQL_ROOT_PASSWORD : 管理者パスワード(初期値 P@ssw0rd)
・MYSQL_DATABASE : デプロイと同時に作成するデータベースの名前(初期値 mydb)
・MYSQL_USER : デプロイと同時に作成するデータベースを利用するユーザー名(初期値 user1)
・MYSQL_PASSWORD : デプロイと同時に作成するデータベースを利用するパスワード(初期値 password1)

また後者の WordPress 用デプロイファイルには4箇所の変種が必要です。wordpress.yaml ファイルをテキストエディタで開いて、 "WORDPRESS_" で始まる4箇所の env.name の value 値を変更してください。それぞれの具体的な意味は以下の通りです。特に WORDPRESS_DB_HOST の値は後述する IP アドレスと上述の MySQL に設定した値を両方参照して入力する必要がある点に注意ください:
・WORDPRESS_DB_HOST : MySQL のホスト名とポート番号(初期値 xxx.xxx.xxx.xxx:30306)
・WORDPRESS_DB_USER : MySQL に接続するユーザー名(初期値 user1)
・WORDPRESS_DB_PASSWORD : MySQL に接続するパスワード(初期値 password1)
・WORDPRESS_DB_NAME : MySQL の DB 名(初期値 mydb)

ではこのダウンロード&編集した2つの yaml ファイルを指定してデプロイします。以下のコマンドを実行する前に Day 0 の内容を参照して ibmcloud CLI ツールで IBM Cloud にログインし、クラスタに接続するまでを済ませておいてください。

そして以下のコマンドを実行します:
$ kubectl apply -f mysql.yaml

$ kubectl apply -f wordpress.yaml

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

NAME                            READY   STATUS    RESTARTS   AGE
pod/mysql-5bd77967b-z9lcl       1/1     Running   0          104s
pod/wordpress-67848cd6b-296kh   1/1     Running   0          62s

NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/kubernetes    ClusterIP   172.21.0.1       <none>        443/TCP          27d
service/mysqlserver   NodePort    172.21.89.71     <none>        3306:30306/TCP   105s
service/wordpress     NodePort    172.21.140.192   <none>        80:30080/TCP     63s

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/mysql       1/1     1            1           106s
deployment.apps/wordpress   1/1     1            1           64s

NAME                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/mysql-5bd77967b       1         1         1       106s
replicaset.apps/wordpress-67848cd6b   1         1         1       64s

この後に実際にサービスを利用するため、以下のコマンドでワーカーノードのパブリック 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/ で稼働している、ということになります。ウェブブラウザを使って、アプリケーションの URL(上述の方法で確認した URL)にアクセスしてみます:
wp1


WordPress をインストールしたことがある人にはお馴染みの初期セットアップ画面が表示されます。とりあえず無事に IKS 内で WordPress が稼働できているようです。

Drupal の時とは異なり、データベース接続情報などはデプロイ時に既に指定しているので、サイトの情報を入力するだけで使えるようになります:
wp2


セットアップが無事に成功しました。あとはセットアップ時に指定したユーザー&パスワードでログインすれば管理画面にアクセスできるようになります:
wp3


WordPress のコンテンツ管理画面にアクセスできました。IKS 内で WordPress を起動できました:
wp4


 Drupal の時と同様ですが、コンテンツフォルダを共有していないので、インスタンス数を2以上に増やして使うことはできませんが、とりあえず WordPress が動く環境を作ることができました。


【YAML ファイルの解説】
WordPress の YAML ファイルはこちらを使っています(MySQL の YAML ファイルについては Day 6 参照):
apiVersion: v1
kind: Service
metadata:
  name: wordpress
spec:
  selector:
    app: wordpress
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
    nodePort: 30080
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 1
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - name: wordpress
        image: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: "xxx.xxx.xxx.xxx:30306"
        - name: WORDPRESS_DB_USER
          value: "user1"
        - name: WORDPRESS_DB_PASSWORD
          value: "password1"
        - name: WORDPRESS_DB_NAME
          value: "mydb"
        ports:
        - containerPort: 80

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


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

$ kubectl delete -f mysql.yaml


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


【紹介記録】
ついに 30 日間 30 イメージ紹介を達成しました!

Dayカテゴリーデプロイ内容
0準備準備作業
1ウェブサーバーhostname
2Apache HTTP
3Nginx
4Tomcat
5Websphere Liberty
6データベースMySQL
7phpMyAdmin
8PostgreSQL
9pgAdmin4
10MongoDB
11Mongo-Express
12Redis
13RedisCommander
14ElasticSearch
15Kibana
16CouchDB
17CouchBase
18HATOYA
19プログラミングNode-RED
20Scratch
21Eclipse Orion
22Swagger Editor
23R Studio
24Jenkins
25アプリケーションFX
262048
27DOS Box
28VNC Server(Lubuntu)
29Drupal
30WordPress

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

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

Day 25 からはアプリケーション系コンテナとその GUI ツールを中心に紹介してます。残り2日となった Day 29 はウェブコンテンツ管理システムの1つ Drupal イメージをデプロイする例を紹介します。


【イメージの概要】
ブログなどのウェブコンテンツを管理・編集・公開するシステムです。

Drupal の動作時にはデータベースが必要なのですが、今回は MySQL を使う方法を紹介します。MySQL 単体のデプロイについては Day 6 でも紹介しているので、必要に応じて参照してください。


【イメージのデプロイ】
まずはこれら2つのファイルを自分の PC にダウンロードしてください:
https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/mysql.yaml
https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/drupal.yaml

前者が MySQL 用、後者が Drupal 用のデプロイファイルです(両方使います)。後者の Drupal 用デプロイファイルは編集不要ですが、前者の MySQL 用デプロイファイルは Day 6 で行ったものと同様の編集が必要です。mysql.yaml ファイルをテキストエディタで開いて、 "MYSQL_" で始まる4箇所の env.name の value 値を変更してください。それぞれの具体的な意味は以下の通りです(初期値として指定されている値のまま動かすことも可能ですが、安全のためなるべく変更してください):
・MYSQL_ROOT_PASSWORD : 管理者パスワード(初期値 P@ssw0rd)
・MYSQL_DATABASE : デプロイと同時に作成するデータベースの名前(初期値 mydb)
・MYSQL_USER : デプロイと同時に作成するデータベースを利用するユーザー名(初期値 user1)
・MYSQL_PASSWORD : デプロイと同時に作成するデータベースを利用するパスワード(初期値 password1)

ではこのダウンロード&編集した2つの yaml ファイルを指定してデプロイします。以下のコマンドを実行する前に Day 0 の内容を参照して ibmcloud CLI ツールで IBM Cloud にログインし、クラスタに接続するまでを済ませておいてください。

そして以下のコマンドを実行します:
$ kubectl apply -f mysql.yaml

$ kubectl apply -f drupal.yaml

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

NAME                          READY   STATUS    RESTARTS   AGE
pod/drupal-5dcb945df7-rwqxc   1/1     Running   0          57s
pod/mysql-5bd77967b-2mhxl     1/1     Running   0          74s

NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
service/drupal        NodePort    172.21.92.228   <none>        80:30080/TCP     58s
service/kubernetes    ClusterIP   172.21.0.1      <none>        443/TCP          27d
service/mysqlserver   NodePort    172.21.111.48   <none>        3306:30306/TCP   75s

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/drupal   1/1     1            1           59s
deployment.apps/mysql    1/1     1            1           76s

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/drupal-5dcb945df7   1         1         1       59s
replicaset.apps/mysql-5bd77967b     1         1         1       76s

この後に実際にサービスを利用するため、以下のコマンドでワーカーノードのパブリック 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/ で稼働している、ということになります。ウェブブラウザを使って、アプリケーションの URL(上述の方法で確認した URL)にアクセスしてみます:
drupal1


無事に Drupal の初期設定画面が表示されました。とりあえず IKS 上で(MySQL と)Drupal が起動できているようです。あとは今回の環境向けの設定をするだけです。

基本は普通に進めていけばいいのですが注意点はデータベース構成部分です。今回の環境用に用意した MySQL に接続するので mysql.yaml で設定した内容を入力する必要がある点に注意してください。高度なオプションを有効にして、ポート番号も 30306 を指定する必要があります:
drupal2


あとはそのまま進めていって・・・
drupal3


最後にサイトの環境情報を入力して保存すれば準備完了です:
drupal4


無事に IKS 内に MySQL + Drupal 環境を作ることができました:
drupal5


コンテンツフォルダを共有していないので、インスタンス数を2以上に増やして使うことはできませんが、とりあえず Drupal が動く環境を作ることができました。

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

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


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

$ kubectl delete -f mysql.yaml


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


【紹介記録】

Dayカテゴリーデプロイ内容
0準備準備作業
1ウェブサーバーhostname
2Apache HTTP
3Nginx
4Tomcat
5Websphere Liberty
6データベースMySQL
7phpMyAdmin
8PostgreSQL
9pgAdmin4
10MongoDB
11Mongo-Express
12Redis
13RedisCommander
14ElasticSearch
15Kibana
16CouchDB
17CouchBase
18HATOYA
19プログラミングNode-RED
20Scratch
21Eclipse Orion
22Swagger Editor
23R Studio
24Jenkins
25アプリケーションFX
262048
27DOS Box
28VNC Server(Lubuntu)
29Drupal
30WordPress

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

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

Day 25 からはアプリケーション系コンテナとその GUI ツールを中心に紹介してます。ゴールも近づいてきた Day 28 はこの 30 日間で紹介するイメージの中でも最も自由度の高い Linux(Lubuntu) のデスクトップ環境を VNC 経由で利用する VNC Server(Lubuntu) イメージをデプロイする例を紹介します。
lubuntu0



【イメージの概要】
ずばり「Linux そのもの」です。Ubuntu 派生ディストーションの中でも比較的軽量な Lubuntu のデスクトップを VNC 経由で利用できるようにしたものです。コンテナの特性上、再起動をかけたり、VNC を再接続したりすると構築した環境がリセットされてしまいますが、Ubuntu のデスクトップ環境が使えると考えれば、アプリケーションの動作確認環境として、かなり自由度高くなんでもできてしまうコンテナイメージだと思っています。これが無料の k8s 環境で動くのは超魅力!


【イメージのデプロイ】
まずはこちらのファイルを自分の PC にダウンロードしてください:
https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/vncserver.yaml

今回の Lubuntu + VNC Server も特にパラメータ指定不要で、そのままデプロイすることができます。以下のコマンドを実行する前に Day 0 の内容を参照して ibmcloud CLI ツールで IBM Cloud にログインし、クラスタに接続するまでを済ませておいてください。

そして以下のコマンドを実行します:
$ kubectl apply -f vncserver.yaml

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

NAME                             READY   STATUS    RESTARTS   AGE
pod/vncserver-665b49d744-tsmms   1/1     Running   0          22s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/kubernetes   ClusterIP   172.21.0.1     <none>        443/TCP          27d
service/vncserver    NodePort    172.21.129.4   <none>        5901:30901/TCP   22s

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/vncserver   1/1     1            1           23s

NAME                                   DESIRED   CURRENT   READY   AGE
replicaset.apps/vncserver-665b49d744   1         1         1       23s

この後に実際にサービスを利用するため、以下のコマンドでワーカーノードのパブリック 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*

つまりこの時点で(上述の結果であれば)アプリケーションは vnc://169.51.204.190:30901 で稼働している、ということになります。VNC クライアントを使って、アプリケーションの URL(上述の方法で確認した URL)にアクセスしてみます(ちなみにイメージ提供サイトによると VNC パスワードは vncpasswd のようです):
lubuntu1


Lubuntu のデスクトップが表示されました。IKS というコンテナ環境下で IaaS に近い環境を手に入れることができたことになります。apt コマンドでアプリケーションの追加インストールもできるので、かなり自由度高く使うことができると思われます(コンテナの特性上、再起動すると消えちゃいますけど):
lubuntu2



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

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


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


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


【紹介記録】

Dayカテゴリーデプロイ内容
0準備準備作業
1ウェブサーバーhostname
2Apache HTTP
3Nginx
4Tomcat
5Websphere Liberty
6データベースMySQL
7phpMyAdmin
8PostgreSQL
9pgAdmin4
10MongoDB
11Mongo-Express
12Redis
13RedisCommander
14ElasticSearch
15Kibana
16CouchDB
17CouchBase
18HATOYA
19プログラミングNode-RED
20Scratch
21Eclipse Orion
22Swagger Editor
23R Studio
24Jenkins
25アプリケーションFX
262048
27DOS Box
28VNC Server(Lubuntu)
29Drupal
30WordPress

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

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

Day 25 からはアプリケーション系コンテナとその GUI ツールを中心に紹介してます。Day 27 は PC DOS 環境をエミュレートする DOS Box イメージをデプロイする例を紹介します。
dosbox



【イメージの概要】
今日のイメージについては全く興味がない、という人もいると思います。自分の趣味の世界の話です。

昔の PC-DOS 時代のツールやゲームを今でも数多く所有しています。普段は Virtual PC などで DOS 環境を起動できるようにしています。そんな自分にとって、DOS エミュレーター環境はどうしても気になってしまい、ましてや DOS Box の環境をコンテナ環境で実現して、更にコンソールにもアクセスできる、という珍しさからつい動作確認してしまいました。


【イメージのデプロイ】
まずはこちらのファイルを自分の PC にダウンロードしてください:
https://raw.githubusercontent.com/dotnsf/yamls_for_iks/main/dosbox.yaml

今回の DOS Box は内部的には VNC を使ってコンソールにアクセスします。というわけで、VNC の接続パスワードを事前に設定しておく必要があります。このファイルをテキストエディタで開いてパラメータを編集します。具体的には以下1箇所の value 値を変更してください:
・VNCPASSWORD : VNC ログイン時に指定するパスワード(初期値 P@ssw0rd)

ではこのダウンロード&編集した dosbox.yaml ファイルを指定してデプロイします。以下のコマンドを実行する前に Day 0 の内容を参照して ibmcloud CLI ツールで IBM Cloud にログインし、クラスタに接続するまでを済ませておいてください。

そして以下のコマンドを実行します:
$ kubectl apply -f dosbox.yaml

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

NAME                          READY   STATUS    RESTARTS   AGE
pod/dosbox-6db44d7b8f-vx56g   1/1     Running   0          63s

NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
service/dosbox       NodePort    172.21.2.241   <none>        5901:30901/TCP   63s
service/kubernetes   ClusterIP   172.21.0.1     <none>        443/TCP          27d

NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/dosbox   1/1     1            1           64s

NAME                                DESIRED   CURRENT   READY   AGE
replicaset.apps/dosbox-6db44d7b8f   1         1         1       64s

この後に実際にサービスを利用するため、以下のコマンドでワーカーノードのパブリック 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*

つまりこの時点で(上述の結果であれば)アプリケーションは vnc://169.51.204.190:30901 で稼働している、ということになります。VNC クライアントを使って、アプリケーションの URL(上述の方法で確認した URL)にアクセスしてみます。接続時にパスワードを求められるので、yaml ファイルに記載したパスワードを入力します:
vnc0


上図のような画面になりました。(ちょっと xterm が邪魔ですが)裏で DOS コマンドプロンプトが起動していますね。なんとか IKS 内で DOS Box が起動できて、VNC ビューワ経由でアクセスすることができました。



【YAML ファイルの解説】
YAML ファイルはこちらを使っています:
apiVersion: v1
kind: Service
metadata:
  name: dosbox
spec:
  selector:
    app: dosbox
  ports:
  - port: 5901
    protocol: TCP
    targetPort: 5901
    nodePort: 30901
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dosbox
spec:
  replicas: 1
  selector:
    matchLabels:
      app: dosbox
  template:
    metadata:
      labels:
        app: dosbox
    spec:
      containers:
      - name: dosbox
        image: jgoerzen/dosbox
        env:
        - name: VNCPASSWORD
          value: "P@ssw0rd"
        ports:
        - containerPort: 5901

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


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


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


【紹介記録】
Dayカテゴリーデプロイ内容
0準備準備作業
1ウェブサーバーhostname
2Apache HTTP
3Nginx
4Tomcat
5Websphere Liberty
6データベースMySQL
7phpMyAdmin
8PostgreSQL
9pgAdmin4
10MongoDB
11Mongo-Express
12Redis
13RedisCommander
14ElasticSearch
15Kibana
16CouchDB
17CouchBase
18HATOYA
19プログラミングNode-RED
20Scratch
21Eclipse Orion
22Swagger Editor
23R Studio
24Jenkins
25アプリケーションFX
262048
27DOS Box
28VNC Server(Lubuntu)
29Drupal
30WordPress

このページのトップヘ