2018.12.07
tel 一般

Windowsでk8sを動かしてみた

めっきり冬めいて来ましたね(季節の挨拶)

このところ新しい非電源系ゲームに触れる機会がなく、すっかりネタもなくなってしまいましたのでちょっと興味のあったk8sを自分のマシンで動かしてみることにしました。
※ k8s とはなにか?というお話については、難しくて私には説明できません!

とはいえ、やってみないとはじまらない!
何がなんだかわからない中やってみよう!
ということで、大雑把な流れは以下のように進めて見ることにしました。

      1. docker for windows をインストールする
      2. 適当なイメージを作ってみる
      3. k8sを使えるようにする
      4. k8sでコンテナを動かしてみる

# docker for windows をインストールする

まず重要な点としては

  • Hyper-V が動く必要があります。つまり、 Home Edition では使用できません。
  • ストアからインストールする場合無料で作成するアカウントが必要になります。
  • インストールの際に、再起動やログオフが必要になることがあります。
  • docker for windows の起動のために結構なメモリを要求されます。

というところです。これらが満たされないと、そもそも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 を使えるようにする

k8sを有効にするには、タスクトレイのアイコン(白いクジラのアイコン)を右クリックして

settings を選択したうえで、kubernetesを選びます。

画像のようにチェックを入れて Apply すると k8s を使うための処理が始まります。


なんか入ったっぽいです。kubectlが動いています

# k8s でコンテナを動かしてみる

とりあえず先程作ったコンテナをベースに、以下の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ページが表示される様になりました。
とはいえ、

  • DBとかも使いたいよね
  • コンテナ内の実行権限の調整どうする
  • そもそも永続化ディスクとか繋がないと
  • ソースの配置とかどうする?!
  • サイドカーパターンってなんだ?!
  • っていうかwindowの場合クラスタ1個だから旨味がないよね
  • ログどうするの
  • ローリングアップデート!
  • Podの監視どうするの
  • どうせならwslでできないのか

などなど、k8sで環境を構築する場合は、設定したり設計しないといけないことはこの先山積みです。

自分で本番運用に堪えるk8s環境を構築するのはかなり難しいですし、どこかのクラウドのサービスを使ったほうがよほど管理は楽かと思います。
とはいえ、自分で一度作成してみることで、なんとなくの動きがわかるというのは大事なことですし、例えば開発者がローカルに開発環境を立てるときに(多少雑な設計の)k8sで動かすのも面白いのではないかと思います。

tel

一覧に戻る