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

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

はじめに

Kubernetes The Hard Way とは

GCP上にKubernetesクラスタを構築するチュートリアルです。GitHubで公開されています。大きく分けると14つの章で構成されています。
GCP上といってもGKEは使わず、GCEインスタンスに対してそれぞれ設定を入れ、独力でクラスタを構築(ブートストラップ)するため、Kubernetesを深く理解する上で有用らしい。

kelseyhightower/kubernetes-the-hard-way
Bootstrap Kubernetes the hard way on Google Cloud Platform. No scripts. - kelseyhightower/kubernetes-the-hard-way
  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).

kelseyhightower/kubernetes-the-hard-way
Bootstrap Kubernetes the hard way on Google Cloud Platform. No scripts. - kelseyhightower/kubernetes-the-hard-way

Kubernetesクラスタを構成する主なコンポーネントは以下です。「Kubernetes The Hard Way」を全て終えると、このような構成のKubernetesクラスタが出来上がるはず。図はWikipediaから引用しました。

今回やること

Kubernetes the hard wayをやってみたときのメモを残します。また↑のGithubのページでは、ほとんど文章とコマンドが並んでいるだけで簡潔なのですが、少し想像力が必要だったので適宜図をつけていきます。

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

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



やってみる

1. Prerequisites

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

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

2. Installing the Client Tools

チュートリアルに必要な以下のコマンドラインツールをインストールします。

  • cfssl, cfssljson: 自己署名認証局(CA)でTLS証明書を作成するためのコマンドラインツール
  • kubectl: Kubernetes APIサーバーに対してコマンドを実行するためのコマンドラインツール

3. Provisioning Compute Resources

KubernetesのコントロールプレーンとワーカーノードをホストするためのVMをデプロイし、SSHで接続できるように設定します。このチュートリアルでは、コントロールプレーンもワーカーノードもそれぞれ3台ずつ用意して冗長化しています。

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

CloudFlareのPKIツールキット、cfsslを用いて認証局を構築し、TLS証明書を生成します。TLS証明書は、以下のコンポーネントに対して適用します。各コンポーネントの説明は、以下から引用しています。

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のルールを発行し、パケットの制御を行っている。

生成した証明書と秘密鍵(.pemファイル)は、それぞれ適切なVMに転送します。



5. Generating Kubernetes Configuration Files for Authentication

Kubenetesの設定ファイル(kubeconfig)を、controller manager, kubelet, kube-proxy, schedulerクライアントおよびadminユーザに対して生成します。
これにより、Kubernetesクライアントが接続先のKubernetes APIサーバーを見つけて、認証できるようになります。

Organizing Cluster Access Using kubeconfig Files

接続先には以下のように、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

Kubernetes Secretを暗号化するための鍵と設定ファイルを生成します。設定ファイルの解説は、以下の公式ドキュメント参照。

Encrypting Secret Data at Rest

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

さいごに

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

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

Integrations
Integrations draw.io integrates with the collaboration tools you already use draw.io Online Use draw.io Online for free and store your diagrams with your...

以上.

コメント