はじめに
Kubernetes The Hard Way とは
GCP上にKubernetesクラスタを構築するチュートリアルです。GitHubで公開されています。
GCP上といってもGKEは使わず、GCEインスタンスに対してそれぞれ設定を入れ、独力でクラスタを構築(ブートストラップ)するため、Kubernetesを深く理解する上で有用らしい。
全部で14章まであります。
- Prerequisites
- Installing the Client Tools
- Provisioning Compute Resources
- Provisioning the CA and Generating TLS Certificates
- Generating Kubernetes Configuration Files for Authentication
- Generating the Data Encryption Config and Key
- Bootstrapping the etcd Cluster
- Bootstrapping the Kubernetes Control Plane
- Bootstrapping the Kubernetes Worker Nodes
- Configuring kubectl for Remote Access
- Provisioning Pod Network Routes
- Deploying the DNS Cluster Add-on
- Smoke Test
- Cleaning Up
もちろんGCPを利用するので料金が発生します。ご注意ください。目安は以下を参照。
とはいえ、最初に$300の無料クレジットが付与されるので、それを使えば実質無料だと思います。
Estimated cost to run this tutorial: $0.23 per hour ($5.46 per day).
Prerequisites
Kubernetesクラスタを構成する主なコンポーネントは以下です。「Kubernetes The Hard Way」を全て終えると、このような構成のKubernetesクラスタが出来上がるはず。図はWikipediaから引用しました。
今回やること
Kubernetes the hard wayをやってみたときのメモを残します。また↑のGithubのページでは、ほとんど文章とコマンドが並んでいるだけで簡潔なのですが、少し想像力が必要だったので適宜図をつけていきます。
手順の日本語版は、こちらの記事にあるようです。
全編となる今回は、6章までをまとめていきます。
- Prerequisites
- Installing the Client Tools
- Provisioning Compute Resources
- Provisioning the CA and Generating TLS Certificates
- Generating Kubernetes Configuration Files for Authentication
- Generating the Data Encryption Config and Key
やってみる
1. Prerequisites
GCPを使うため、gcloudコマンドの設定を行います。VMをデプロイするリージョンなどもここで設定します。
また今後、複数のVMに対して並行してコマンドを実行することがあるため、tmux
が紹介されています。
2. Installing the Client Tools
チュートリアルに必要な以下のコマンドラインツールをインストールします。
- cfssl, cfssljson: 自己署名認証局(CA)でTLS証明書を作成するためのコマンドラインツール
- kubectl: Kubernetes APIサーバーに対してコマンドを実行するためのコマンドラインツール
3. Provisioning Compute Resources
Provisioning Compute Resources
Kubernetesのコントロールプレーン(マスターノード)とワーカーノードをホストするためのVMをデプロイし、SSHで接続できるように設定します。このチュートリアルでは、コントロールプレーンもワーカーノードもそれぞれ3台ずつVMを用意して冗長化しています。
VPCやサブネットなどのネットワーク構成は、以下の通り。
VPC
- 「kubernetes-the-hard-way」VPCを作成
- 「kubernetes」サブネットを切る
- IPアドレスのレンジは、
10.240.0.0/24
を割当
- IPアドレスのレンジは、
ファイアウォールルール
「kubernetes-the-hard-way-allow-internal」ルールを作成
- Kubernetesクラスタの内部通信で、すべてのプロトコルを許可
- ソース:
- 10.240.0.0/24: VMがデプロイされるIPレンジ
- 10.200.0.0/16: PodがデプロイされるIPレンジ
「kubernetes-the-hard-way-allow-external」ルールを作成
- Kubernetesクラスタ外からの通信で、SSH, ICMP, HTTPSを許可
- ソース: 0.0.0.0/0
- あとで、Kubernetes API サーバーを公開する外部LBを利用するため
1 2 3 |
NAME NETWORK DIRECTION PRIORITY ALLOW DENY kubernetes-the-hard-way-allow-external kubernetes-the-hard-way INGRESS 1000 tcp:22,tcp:6443,icmp kubernetes-the-hard-way-allow-internal kubernetes-the-hard-way INGRESS 1000 tcp,udp,icmp |
- パブリックIPアドレス
- あとで、Kubernetes API サーバーの外部LBに対してアタッチするために予約
4. Provisioning the CA and Generating TLS Certificates
Provisioning the CA and Generating TLS Certificates
CloudFlareのPKIツールキット、cfsslを用いて認証局を構築し、TLS証明書を生成します。TLS証明書は、以下のコンポーネントやKubernetesのAdminユーザに対して適用します。各コンポーネントの説明は、以下のようなサイトから引用しています。
- コントロールプレーン
- etcd: 一貫性、高可用性を持ったキーバリューストア(KVS)で、Kubernetesの全てのクラスター情報の保存場所として利用
- kube-api-server: Kubernetes APIを外部に提供する、マスター上のコンポーネント。Kubernetesコントロールプレーンのフロントエンド
- kube-controller-manager: マスター上で動くcontrollersを動かすコンポーネント。論理的には、各controllerは、それぞれ別のプロセスだが、複雑になるのを避けるため、一つの実行ファイルにまとめてコンパイルされ、単一のプロセスとして動く
- kube-scheduler: まだノードに紐付けられていない新規に作成されたPodを見張り、稼働させるべきノードを選択する
- ワーカーノード
- kubelet: kube-scheduler によって紐付けられた(スケジュールされた)Podを kubelet が認識して、そのPodを自身のNodeで起動させる。 また、実行しているPodの監視・管理も行う
- kube-proxy: kube-proxy はKubernetesのServiceオブジェクトを元にルーティングを行う。実体はiptablesのルールを発行し、パケットの制御を行っている
Wikipediaの図を再掲。
認証局の構築
TLS証明書を生成するための認証局を構築します。↑に沿ってコマンドを実行して、CA設定ファイル、証明書、CAの秘密鍵が生成されます。
- ca-key.pem
- ca.pem
なおCAの秘密鍵は、証明書を発行する際の電子署名に利用されます。そして、例えばクライアントは、CAの公開鍵を使って、発行されたサーバ証明書を検証します。
クライアント証明書 と サーバ証明書
クライアント証明書/サーバ証明書 および 秘密鍵を生成していきます。
adminクライアント証明書
- Kubernetes の adminユーザ用クライアント証明書を作成
- できるもの
- admin-key.pem
- admin.pem
Kubelet用クライアント証明書
- ワーカーノード3台分のkubelet用クライアント証明書を生成
- Kubernetesでは、
Node Authorizer
と呼ばれる機能を用いて、KubeletからのAPIリクエストを認可する- 例えば、当該ノードに載っていないPodが参照するSecretにはアクセスできなくなる
- この
Node Authorizer
で認可されるための要件を満たすように、クライアント証明書を生成する - できるもの
- worker-0-key.pem
- worker-0.pem
- worker-1-key.pem
- worker-1.pem
- worker-2-key.pem
- worker-2.pem
Controller Manager用クライアント証明書
- kube-controller-manager用のクライアント証明書と秘密鍵を生成
- できるもの
- kube-controller-manager-key.pem
- kube-controller-manager.pem
Kube Proxy用クライアント証明書
- kube-proxy用のクライアント証明書と秘密鍵を生成
- できるもの
- kube-proxy-key.pem
- kube-proxy.pem
Client and Server Certificates
Scheduler用クライアント証明書
- kube-scheduler用のクライアント証明書と秘密鍵を生成
- できるもの
- kube-scheduler-key.pem
- kube-scheduler.pem
Kubernetes API Server用サーバ証明書
- kube-api-server用のサーバ証明書と秘密鍵生成
- できるもの
- kubernetes-key.pem
- kubernetes.pem
Service Account用キーペア
- Controller Managerは、キーペアを利用してサービスアカウントトークンを生成および署名する
- Managing Service Accounts
- ちなみに、Podを作成して、コンテナ内の
/var/run/secrets/kubernetes.io/serviceaccount
を見ると、サービスアカウントのトークンがマウントされている - そのほか、証明書や(ServiceAccountはNamespaceに紐づくため)namespaceが書いたファイルもマウントされている
- このトークンを使って、Kubernetes API Serverにアクセスする
- このために、証明書と秘密鍵を生成する
- できるもの
- service-account-key.pem
- service-account.pem
証明書と秘密鍵の配布
コントロールプレーンとワーカーノードにそれぞれ、適切な証明書と秘密鍵を配布していきます。
ただし、kube-proxy
、kube-controller-manager
、kube-scheduler
および kubelet
のクライアント証明書については、次の章でクライアント認証用の設定ファイルを生成する際に使います。
5. Generating Kubernetes Configuration Files for Authentication
Generating Kubernetes Configuration Files for Authentication
Kubenetesの設定ファイル(kubeconfig)を、controller manager, kubelet, kube-proxy, schedulerクライアントおよびadminユーザに対して生成します。
これにより、Kubernetesクライアントが接続先のKubernetes APIサーバーを見つけて、認証できるようになります。
接続先には以下のように、Kubernetes APIサーバーを指定します。
- ワーカーノード上のコンポーネント(kubelet, kube-proxy)の設定においては、3章で払い出したパブリックIPアドレスを指定します。後の章でKubernetes APIサーバーを外部LBで外部公開
する際に、このパブリックIPアドレスを割り当てるためです - コントロールプレーン上のコンポーネント(controller manager, scheduler)の設定においては、
127.0.0.1
を指定します。kube-api-serverもコントロールプレーンで動作するためです - adminユーザの設定においては、
127.0.0.1
を指定します。今回はコントロールプレーンからkubectlを実行することが想定されているためです
生成した設定ファイル(.kubeconfigファイル)は、それぞれ適切なVMに転送します。
6. Generating the Data Encryption Config and Key
Generating the Data Encryption Config and Key
Kubernetes Secretを暗号化するための鍵と設定ファイルを生成します。設定ファイルの解説は、以下の公式ドキュメント参照。
生成した鍵と設定ファイルは、コントロールプレーンのVMに転送します。
暗号化するデータはetcdに保持され、etcdはコントロールプレーン上で動作するためです。
さいごに
前編では、全14章のうち1~6章までやりました。
やる前から薄々気づいてはいましたが、図を描く場面がほとんどありませんでした。GCPに絡むところだけ。。めげずに後編に続きます。
余談ですが、アーキテクチャ図を描く時に、今までパワポやKeynoteを使っていましたが、今回はdraw.ioを使いました。あんまり使ったことがなくて手こずりましたが、これから慣れていきたいです。
クラウド版とデスクトップ版があるらしいですね。
<このシリーズ>
以上.
コメント