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

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

タグ:vnc

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

コンテナオーケストレーション環境である kubernetes(以下 k8s)上で PC-DOS エミュレーターである DOSBOX を動かしてみました。

なお、以下で紹介する k8s の環境としては以前にこのブログで紹介した minikube 環境を使います。minikube の(Windows 10 + WSL 向けの)環境構築手順はこちらです:
Windows 10 に minikube を導入して WSL から利用する


また k8s にデプロイする DOSBOX のイメージは Docker Hub に公開されていたこれを使うことにします:
DOSBox for Docker Server


上記ページによると、このイメージは以下2つの特徴がある模様です:
(1)起動後、5901 番ポートで VNC 接続を待ち受ける(つまり VNC 経由で DOSBOX に接続する)
(2)VNC のパスワードは環境変数 VNCPASSWORD で指定する


ではこのことを理解した上で、まずはイメージを k8s 環境へデプロイします:

環境変数 VNCPASSWORD=P@ssw0rd を指定して jgoerzen/dosbox を k8s に dosbox という名前でデプロイ
$ kubectl run dosbox --image=jgoerzen/dosbox --env=VNCPASSWORD=P@ssw0rd

kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/dosbox created

dosbox のポート 5901 を expose
$ kubectl expose deployment dosbox --type="NodePort" --port=5901

service/dosbox exposed

これでイメージのデプロイは完了し、利用可能になっているはずです。最後に利用するために必要な情報を確認しておきます:

IP アドレスを確認
$ kubectl cluster-info

Kubernetes master is running at https://192.168.99.100:8443
KubeDNS is running at https://192.168.99.100:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.


外部公開ポート番号を確認
$ kubectl get svc

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
dosbox       NodePort    10.105.213.111                 5901:32286/TCP   9s
kubernetes   ClusterIP   10.96.0.1                      443/TCP          103d

上記の結果から 192.168.99.100:32286 で VNC 接続します:
2019122002


接続時にパスワードを聞かれます。デプロイ時に環境変数 VNCPASSWORD で指定した文字列(上記の場合は P@ssw0rd)を入力します:
2019122003


正しく接続できると xterm のターミナルと、DOSBOX アプリが起動した X Window が表示され、DOSBOX が利用できるようになります:
2019122001


これで DOS 環境を共有するハードルを1つ超えた、かも!


IBM LinuxONE(メインフレーム版 Linux)の挑戦シリーズです。今回は RHEL6.x のインスタンス上に X Window のデスクトップ環境を導入してみます。加えてこのデスクトップ環境にリモートアクセスできるよう VNC サーバーも合わせて導入します:
2017012201


まず前提条件として LinuxONE の環境が必要になりますが、今回は「無料で最大 120 日間クラウド上の LinuxONE インスタンスが使える」という IBM LinuxONE コミュニティクラウドの環境を使って RHEL 6.x のサーバーを作り、その上に今回の環境構築を行うことにします。そこまでの環境構築手順についてはこちらを参照ください:
IBM LinuxONE コミュニティクラウドを使う(2017年1月版)


さて、LinuxONE と言っても RHEL(RedHat Enterprise Linux) であることには変わりありません。ということは普通は以下のコマンドで X Window のデスクトップ環境が導入できることをご存知の人も少なくないと思います:
# yum groupinstall "Desktop"

ということは LinuxONE でも同じコマンドを実行するだけでよいのでは・・・と思うかもしれませんが、残念ながら LinuxONE の RHEL6.x では yum は動きますが、グループ情報が登録されておらず、"groupinstall" コマンドが使えない模様でした(赤字および青字が yum groupinstall コマンド実行後の出力結果です):
# yum groupinstall "Desktop"
Loaded plugins: product-id, refresh-packagekit, search-disabled-repos, security,
              : subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
Setting up Group Process
RHEL67                                                   | 3.0 kB     00:00
rhel67optional                                           | 2.9 kB     00:00
rhel67supp                                               | 2.9 kB     00:00
Warning: Group Desktop does not exist.
Error: No packages in any requested group available to install or update

ではどうするか? 要は「groupinstall がコマンドが使えないなら、install コマンドを使えばいいじゃない」というわけで、yum groupinstall コマンドで実行されるのと同じコマンドを yum install コマンドで実行してしまいましょう。この件について詳しくはこちらのブログエントリで紹介しているので、興味がある方はこちらも参照ください:
yum の groupinstall でインストールされるパッケージを確認する


具体的には以下のコマンドを実行して、"Desktop" グループに含まれるはずの個別パッケージをまとめてインストールするよう指定します:
# yum install NetworkManager NetworkManager-gnome alsa-plugins-pulseaudio at-spi control-center dbus gdm gdm-user-switch-applet gnome-panel gnome-power-manager gnome-screensaver gnome-session gnome-terminal gvfs-archive gvfs-fuse gvfs-smb metacity nautilus notification-daemon polkit-gnome xdg-user-dirs-gtk yelp control-center-extra eog gdm-plugin-fingerprint gnome-applets gnome-media gnome-packagekit gnome-vfs2-smb gok openssh-askpass orca pulseaudio-module-gconf pulseaudio-module-x11 vino

ついでというわけではないのですが、X Window のデスクトップを導入しても、ネットワーク越しにデスクトップが利用できないと意味がありません。というわけで RHEL6.x で使える VNC サーバーとして TigerVNC を導入することにします:
# yum install tigervnc-server

なお、TigerVNC の導入そのもの(インストール後の設定方法含む)について、こちらで詳しく紹介しているので一度参照ください:
CentOS に VNC サーバーを導入する


TigerVNC サーバー導入&設定後に再起動し、VNC ビューワで IP アドレスとポート番号を指定してアクセスすると、LinuxONE に導入された X Window のデスクトップ環境にアクセスできます:
2017012202


これで LinuxONE をデスクトップとして使ったり、GUI 必須のアプリケーションが利用できるようになりますね。
 

ペネトレーションテスト向けにカスタマイズされた Linux ディストリビューションである『Kali Linux』に VNC サーバー機能を導入する手順を紹介します。

まず、インストールする VNC サーバーアプリケーションは vnc4server です。これを apt-get でインストールします:
# apt-get install vnc4server

vnc4server の起動は以下の vncserver コマンドで行います。起動後にパスワードを聞かれるので入力内容を覚えておきます。なお、VNC クライアントでアクセスする際には、この vnc4server を実行したユーザーのユーザー権限でログインするので、必要であれば su でユーザーを切り替えてから実行してください。また ":" の後の数字はポート番号を意味する数字(この数字 + 5900 番ポートで実行する)で、この例であれば 5901 番で実行されます:
# vncserver :1

You will require a password to access your desktops.

Password: (パスワードを入力)
Verify: (パスワードを再入力)
   :
   :

これで VNC サーバーが起動しますが、少しカスタマイズを加えます。そのために一旦起動した VNC サーバーを終了します。終了は以下のコマンドで行います(最後の : の後の数字は実行時に指定したものを同じもの):
# vncserver -kill :1

この vncserver コマンドを実行したユーザーのホームディレクトリ以下の ~/.vnc/xstartup というファイルに VNC 実行時の X11 サーバーの設定が記述されているので、このファイルを編集します。具体的にはデフォルト Window Manager を使うのではなく、GNome セッションを使うことにします(赤字の3行を変更):
# vi ~/.vnc/xstartup
  :
  :
xsetroot -solid grey
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
gnome-session &

ここまでのカスタマイズが終わったら、改めて VNC サーバーを実行します。
# vncserver :1

では、この Kali Linux マシン以外から VNC クライアントでこのマシンに接続を試みてみます:
2015101201


今のところ、この VNC サーバーを自動起動させる方法が分からないので、再起動するたびに vncserver コマンドを実行する必要がありますが、一応 VNC サーバーを使えることがわかりました。


 

このページのトップヘ