Kubernetes The Hard Wayをやってみたときのメモ

Kubernetesの中の人がつくったチュートリアルがあります。

これは、GCPでやる方法とAWSでやる方法があるけど、AWSのほうはjqを使わないとダメらしくて手元のWindows環境ではつらそうなのでGCPでやります。

(もはやGCPの使い方すら忘れてるくらいの初心者なので、適当なこと書いてたら優しくツッコミを入れてもらえるとありがたいです...)

1. Cloud Infrastructure Provisioning - Google Cloud Platform

kubernetes-the-hard-way/01-infrastructure-gcp.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

ネットワークの設定をして、インスタンスを6つ立てます。細かい点として、Windowsコマンドプロンプトだと複数行のコマンドがコピペしただけだとうまく動きません。\で改行をエスケープすることができないので。

2. Setting up a Certificate Authority and TLS Cert Generation

kubernetes-the-hard-way/02-certificate-authority.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

cfsslというツールでCAと証明書をつくります。このツールわりと便利そう。

blog.cloudflare.com

本番でやる際はちゃんとサービスごとに証明書を分けたほうがいいよ、と。こういうときにVaultとかを使うんでしょうか。あんまりよく知らないんですけど。

3. Bootstrapping a H/A etcd cluster

kubernetes-the-hard-way/03-etcd.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

etcdのクラスタを立てます。Kubernetesは状態を持たず、etcdですべての状態が管理されます。このチュートリアルだとKubernetesのcontrollerと同居しますが、本番環境でやるときはちゃんとetcd専用のマシンをつくってそこに立てましょう、と。

こんな感じのワーニングみたいなのが出るけど、問題あるのかはよくわからない。

Oct 15 09:42:43 controller1 etcd[3415]: serving insecure client requests on ...!
Oct 15 09:42:43 controller1 etcd[3415]: forgot to set Type=notify in systemd...?

4. Bootstrapping an H/A Kubernetes Control Plane

kubernetes-the-hard-way/04-kubernetes-controller.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

Kubernetesのcontrollerクラスタをつくろう、と。Kubernetesのフロント部分(workerじゃないところ)は以下のコンポーネントから成り立っている。この3つは、色々な理由から同じマシンで走らせる必要がある。

  • Kubernetes API Server
  • Kubernetes Scheduler
  • Kubernetes Controller Manager

この章でロードバランサの設置もやるけど、ELB便利そうですね。

5. Bootstrapping Kubernetes Workers

kubernetes-the-hard-way/05-kubernetes-worker.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

workerとproxyを立てる。ここはまだDockerを使う手順になってるけど、いずれcri-oに置き換わるのかな? CNIを使うところで

The Kubernetes kubelet no longer relies on docker networking for pods!

って書いてあるけど結局Dockerをインストールするのよくわからなかった。

6. Configuring the Kubernetes Client - Remote Access

kubernetes-the-hard-way/06-kubectl.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

これまでのところはがんばればWindowsでもなんとかなったけど(cfsslはWindows版がある)、kubectlはないのであきらめてBash on Windowsを使いました。

7. Managing the Container Network Routes

kubernetes-the-hard-way/07-network.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

コンテナが使う用のルータをつくるだけの簡単なお仕事。

8. Deploying the Cluster DNS Add-on

kubernetes-the-hard-way/08-dns-addon.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

サービスディスカバリ用のDNSをつくります。アドオンとして提供されているもの。これがなかったら、consulとかでやるのかな。

なぜあらかじめ組み込まれているのではなくアドオン形式なのかは謎。Googleのことだから、DNSじゃない新しい名前解決方法を使ってたりするんでしょうか。

9. Smoke Test

kubernetes-the-hard-way/09-smoke-test.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

とりあえず動かしてみる。という章。

あんまり説明がなくてわからないけど、この--imageに指定してるのがDockerのイメージ名っぽい。

kubectl run nginx --image=nginx --port=80 --replicas=3

実際Worker上で見るとそれっぽいやつが動いていた(もうひとつのgcr.ioというのがGCPのDockerレジストリらしい)

user@worker1:~$ sudo docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
nginx                                  latest              a5311a310510        2 days ago          181.4 MB
gcr.io/google_containers/pause-amd64   3.0                 99e59f495ffa        5 months ago        746.9 kB

10. Clean Up

kubernetes-the-hard-way/10-cleanup.md at master · kelseyhightower/kubernetes-the-hard-way · GitHub

こんなに大変だったのにこれだけか...。積み上げてきたものを壊すのは一瞬ですね。ショッギョ・ムッジョ。

ところで、セットアップの時はAWSのほうが楽そうに見えてたんですけど、消すときけっこう大変なんですね。GCPのほうが管理単位がかっちり分かれてるということなんでしょうか。

感想

The Hard Wayというからにはもっと大変だろうと思ってたんですけど、意外と楽でした。これは、READMEに書いてあるように、

This tutorial will walk you through setting up Kubernetes the hard way.

ということでKubernetesのセットアップに重点をおいたチュートリアルで、使い方の説明はあんまりないからな感じがします。そのへん詳しくは公式ドキュメントを読め、と。

あと、GCPAWSのいずれにしても、ネットワークの部分はそれぞれのインフラに依存していて、この仕組みを自前でやろうと思うと大変そうな気もしました。DigitalOceanでKubernetesを動かすチュートリアルは、そのへんインフラの仕組みに頼らずflannelでやってて、こっちのほうが勉強になるかもしれません。まだ読んでないけど。

www.digitalocean.com