めっきり冬めいて来ましたね(季節の挨拶)
このところ新しい非電源系ゲームに触れる機会がなく、すっかりネタもなくなってしまいましたのでちょっと興味のあったk8sを自分のマシンで動かしてみることにしました。
※ k8s とはなにか?というお話については、難しくて私には説明できません!
とはいえ、やってみないとはじまらない!
何がなんだかわからない中やってみよう!
ということで、大雑把な流れは以下のように進めて見ることにしました。
まず重要な点としては
というところです。これらが満たされないと、そもそもdockerが動きません。
1. 公式サイトからインストーラーをダウンロードします。
2. ダウンロードしたインストーラーを起動して、インストールしましょう。
インストール後、ログオフが必要になることがあります。
また、HyperVを有効にしていない場合は、有効にした上で再起動します!というdockerの指示に従います。
3. 再起動が完了し、よし dockerサービス が起動だ!と思ったところで、メモリが足りない!と怒られました。
ブラウザのタブを開きすぎていたので、開いているタブを減らしてなんとか起動させました。
4. docker サービスが無事起動していることを確認。ついでに、hello-world imageをpull してコンテナの起動も確認しました。
次は、サービスとして稼働するコンテナをテストで作ります。
php7.2が入っているapacheのコンテナで、公式から引っ張ることにしました。(本筋ではないので)
# Apache php 7.2系 FROM php:7.2-apache # 80 番ポートを公開する EXPOSE 80 # index.php をコピー COPY ./index.php ./ # 環境変数を設定 ENV APACHE_RUN_USER www-data ENV APACHE_RUN_GROUP www-data ENV APACHE_PID_FILE /var/run/apache2.pid ENV APACHE_RUN_DIR /var/run/apache2 ENV APACHE_LOG_DIR /var/log/apache2 ENV APACHE_LOCK_DIR /var/lock/apache2 # コンテナ実行コマンド CMD ["apachectl", "-D", "FOREGROUND"]
上記のようなDockerfileを用意しておきます。
コンテナにコピーされる index.php の中身は
<?php print "i am".gethostname();
こんな感じで、自分自身のホスト名を画面に出すだけのものです。
これを同じディレクトリに置いた上で、PowerShellでそのディレクトリからビルドをします。
docker build ./ -t sample/apache:v1.0
試しにこのコンテナを起動させます。
docker run -d -p 80:80 sample/apache:v1.0
dockerのランダムのホスト名が表示されました
k8sを有効にするには、タスクトレイのアイコン(白いクジラのアイコン)を右クリックして
settings を選択したうえで、kubernetesを選びます。
画像のようにチェックを入れて Apply すると k8s を使うための処理が始まります。
なんか入ったっぽいです。kubectlが動いています
とりあえず先程作ったコンテナをベースに、以下のymlを作成しました。
apiVersion: v1 kind: Pod metadata: name: sample-pod spec: containers: - name: apache-container image: sample/apache:v1.0 ports: - containerPort: 80
これをapplyすると
ちゃんと起動しました。
ただし、この状態でブラウザから確認をしても表示されません。
乱暴に言うと、先程の状態だとホスト機(windows)とpodの間でのポート転送がないため、アクセスが届かないのです。
そこで
--- apiVersion: apps/v1 kind: Deployment metadata: name: sample-deployment spec: replicas: 2 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - name: apache-container image: sample/apache:v1.0 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: simple-loadbalancer spec: type: LoadBalancer ports: - name: "http-port" protocol: "TCP" port: 80 targetPort: 80 selector: app: sample-app
こんな感じにymlを変更しました。
だいぶ端折っている感じがありますが、type: LoadBalancer な Service を追加して、ポート転送を行っています。
その結果
無事に表示されるようになりました。
とりあえず、理屈はわからないものの(!)なんとかコンテナのWEBページが表示される様になりました。
とはいえ、
などなど、k8sで環境を構築する場合は、設定したり設計しないといけないことはこの先山積みです。
自分で本番運用に堪えるk8s環境を構築するのはかなり難しいですし、どこかのクラウドのサービスを使ったほうがよほど管理は楽かと思います。
とはいえ、自分で一度作成してみることで、なんとなくの動きがわかるというのは大事なことですし、例えば開発者がローカルに開発環境を立てるときに(多少雑な設計の)k8sで動かすのも面白いのではないかと思います。
tel