「Kubernetes the hard way」を図で理解したい -前編-

Kubernetes
Nishipy
自分の中でやるやる詐欺をしていた「Kubernetes the hard way」をやっていきます。前編では、全14章のうち1~6章まで。

はじめに

Kubernetes The Hard Way とは

GCP上にKubernetesクラスタを構築するチュートリアルです。GitHubで公開されています。

GitHub - kelseyhightower/kubernetes-the-hard-way: Bootstrap Kubernetes the hard way. No scripts.
Bootstrap Kubernetes the hard way. No scripts. Contribute to kelseyhightower/kubernetes-the-hard-way development by creating an account on GitHub.

GCP上といってもGKEは使わず、GCEインスタンスに対してそれぞれ設定を入れ、独力でクラスタを構築(ブートストラップ)するため、Kubernetesを深く理解する上で有用らしい。

全部で14章まであります。

  1. Prerequisites
  2. Installing the Client Tools
  3. Provisioning Compute Resources
  4. Provisioning the CA and Generating TLS Certificates
  5. Generating Kubernetes Configuration Files for Authentication
  6. Generating the Data Encryption Config and Key
  7. Bootstrapping the etcd Cluster
  8. Bootstrapping the Kubernetes Control Plane
  9. Bootstrapping the Kubernetes Worker Nodes
  10. Configuring kubectl for Remote Access
  11. Provisioning Pod Network Routes
  12. Deploying the DNS Cluster Add-on
  13. Smoke Test
  14. 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のページでは、ほとんど文章とコマンドが並んでいるだけで簡潔なのですが、少し想像力が必要だったので適宜図をつけていきます。

手順の日本語版は、こちらの記事にあるようです。

Kubernetes The Hard Wayする - Qiita
Kubernetesについての勉強のため、以下のとてもよくできたチュートリアルを実施したログ。Kubernetes The Hard WayこのチュートリアルではGCP上にKubernetesの…

全編となる今回は、6章までをまとめていきます。

  1. Prerequisites
  2. Installing the Client Tools
  3. Provisioning Compute Resources
  4. Provisioning the CA and Generating TLS Certificates
  5. Generating Kubernetes Configuration Files for Authentication
  6. Generating the Data Encryption Config and Key



やってみる

1. Prerequisites

Prerequisites

GCPを使うため、gcloudコマンドの設定を行います。VMをデプロイするリージョンなどもここで設定します。
また今後、複数のVMに対して並行してコマンドを実行することがあるため、tmuxが紹介されています。

Home
tmux source code. Contribute to tmux/tmux development by creating an account on GitHub.

2. Installing the Client Tools

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を割当

ファイアウォールルール

「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を利用するため

  • パブリック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ユーザに対して適用します。各コンポーネントの説明は、以下のようなサイトから引用しています。

Kubernetesのコンポーネント
Kubernetesクラスターはコントロールプレーンのコンポーネントとノードと呼ばれるマシン群で構成されています。
Kubernetes道場 24日目 - Kubernetesの各コンポーネントについて - Toku's Blog
この記事は Kubernetes道場 Advent Calendar 2018 24日目の記事です。 今回はKubernetesの各コンポーネントについて見ていこう。 Kubernetesの各コンポーネントについて Kubernetesには以下のようなコンポーネントがある。 kubectl etcd kube-apis...(続く)
  • コントロールプレーン
    • 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の図を再掲。

認証局の構築

Certificate Authority

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用クライアント証明書
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-proxykube-controller-managerkube-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サーバーを見つけて、認証できるようになります。

Organizing Cluster Access Using kubeconfig Files
Use kubeconfig files to organize information about clusters, users, namespaces, and authentication mechanisms. The kubectl command-line tool uses kubeconfig fil...(続く)

接続先には以下のように、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を暗号化するための鍵と設定ファイルを生成します。設定ファイルの解説は、以下の公式ドキュメント参照。

Encrypting Confidential Data at Rest
All of the APIs in Kubernetes that let you write persistent API resource data support at-rest encryption. For example, you can enable at-rest encryption for Sec...(続く)

生成した鍵と設定ファイルは、コントロールプレーンのVMに転送します。
暗号化するデータはetcdに保持され、etcdはコントロールプレーン上で動作するためです。

さいごに

前編では、全14章のうち1~6章までやりました。
やる前から薄々気づいてはいましたが、図を描く場面がほとんどありませんでした。GCPに絡むところだけ。。めげずに後編に続きます。

余談ですが、アーキテクチャ図を描く時に、今までパワポやKeynoteを使っていましたが、今回はdraw.ioを使いました。あんまり使ったことがなくて手こずりましたが、これから慣れていきたいです。
クラウド版とデスクトップ版があるらしいですね。

draw.io Integrations

<このシリーズ>

「Kubernetes the hard way」を図で理解したい -前編-
Nishipy自分の中でやるやる詐欺をしていた「Kubernetes the hard way」をやっていきます。前編では、全14章のうち1~6章まで。はじめにKubernetes The Hard Way とはGCP上...(続く)
「Kubernetes the hard way」を図で理解したい -後編-
Nishipyはじめに前編の続き、後編です。Kubernetes the hard wayといやつをやってみたときのメモを残します。また各章に対して、適宜図などをつけてみます。PrerequisitesI...(続く)

以上.

コメント