はじめに
前編の続き、後編です。
Kubernetes the hard wayといやつをやってみたときのメモを残します。また各章に対して、適宜図などをつけてみます。
- 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
今回の範囲
前回は6章までやったので、今回は7章から12章までをまとめていきたいと思います。Smoke TestとClean Upの章は省略します。
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
GCP上のVM構成
前回作成したVM構成は、こんな感じ。
これから作っていくKubernetesクラスタの構成
Kubernetesクラスタを構成する主なコンポーネントは以下です。図はWikipediaから引用しました。
7章からやっていく
7. Bootstrapping the etcd Cluster
Bootstrapping the etcd Cluster
Kubernetesでは、クラスタの状態などを表すデータを、マスターノードのコンポーネントであるetcd
に保持します。読み方は、「イーティーシーディー」とか「エトセディー」とかがありますが、どれが正しいかは知りません。
etcd
というのは、Go言語で書かれた分散Key-Value Storeであり、現在CNCFがホストするプロジェクトです。
Kubernetesの公式ドキュメントによると、このetcd
は3台以上の冗長構成を組むことが推奨されています。この「3台以上」という数字は、「Raft Consensus Algorithm」という分散合意アルゴリズムに依るものらしいです。2台構成でもし1台死ぬと、クラウス内のリーダーが選出できなくなるためだそうで、詳細は省きますが、以下の記事がとてもわかりやすいです。
さて7章では、マスターノード用のVM3台(controller-1
, controller-2
, controller-3
)に対して、etcd
のバイナリを入れて、3台でクラスタを組むための設定を入れていきます。VMのOSはLinuxなので、etcd
もsysytemdで管理されることになります。
以下のコマンドを実行し、クラスタのメンバーの一覧が表示されれば成功です。
1 2 3 |
sudo systemctl daemon-reload sudo systemctl enable etcd sudo systemctl start etcd |
1 2 3 4 5 |
sudo ETCDCTL_API=3 etcdctl member list \ --endpoints=https://127.0.0.1:2379 \ --cacert=/etc/etcd/ca.pem \ --cert=/etc/etcd/kubernetes.pem \ --key=/etc/etcd/kubernetes-key.pem |
8. Bootstrapping the Kubernetes Control Plane
Bootstrapping the Kubernetes Control Plane
8章では、マスターノードを構築していきます。
コンポーネントの導入
以下のコンポーネントも入れていきます。etcd
の時と同様に、バイナリをダウンロードして導入します。これらのサービスも今回はsysytemdで管理されます。
- kube-api-server: Kubernetes APIを外部に提供する、マスター上のコンポーネント。Kubernetesコントロールプレーンのフロントエンド
- kube-controller-manager: マスター上で動くcontrollersを動かすコンポーネント。論理的には、各controllerは、それぞれ別のプロセスだが、複雑になるのを避けるため、一つの実行ファイルにまとめてコンパイルされ、単一のプロセスとして動く
- kube-scheduler: まだノードに紐付けられていない新規に作成されたPodを見張り、稼働させるべきノードを選択する
RBACの設定
Kubernetes API Serverから、Workerノードのkubeletにアクセスするために、RBACの設定を行います。Kubernetes API→kubeletの通信は、ログ/メトリクスの取得やPod内でコマンド実行のために行われます。
ちなみにRBACとは、Role Based Access Controlの略で、Kubernetesデフォルトの認可モジュールです。
主にRole/ClusterRoleとRoleBinding/ClusterRoleBindingというリソースがあります。Clusterが付くとクラスタ単位であり、Clusterが付かないとNamespace単位です。Roleをまず作成して権限を設定します。次にRoleBindingを作成して Roleとユーザ または RoleとServiceAccount を紐付けます。(唐突な手書きメモ)
さて、今回の設定の手順は、以下の通りらしい。
* ClusterRole作成
* system:kube-apiserver-to-kubelet
* kubeletにアクセスして、あれこれできるいい感じの権限を与える。以下抜粋。
1 2 3 4 5 6 7 8 9 10 11 |
rules: - apiGroups: - "" resources: - nodes/proxy - nodes/stats - nodes/log - nodes/spec - nodes/metrics verbs: - "*" |
- ClusterRoleBinding作成
- 上で作成したRoleと、
kubernetes
というユーザを紐づける
- 上で作成したRoleと、
1 2 3 4 5 6 7 8 9 10 11 12 13 |
apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: system:kube-apiserver namespace: "" roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: system:kube-apiserver-to-kubelet subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: kubernetes |
余談ですが、認証と認可の違いは、転職活動での技術面接でよく聞かれたので、知らない方は以下の記事も参照ください。すごくわかりやすい。
Kubernetes API Serverの前段にLBの導入
Google Network Load Balancerを導入して、Kubernetes API Serverへのアクセスを分散させる。
9. Bootstrapping the Kubernetes Worker Nodes
Swapの無効化
このあと導入するkubeletは、swapが有効だと起動に失敗するのがデフォルトらしいので、下記コマンドで無効化する。
1 |
sudo swapoff -a |
ワーカーノードのコンポーネント導入
マスターノードの次は、Workerノードを構築していきます。各Workerノードに対して、以下のコンポーネントを設定していきます。
コンテナランタイム: High Level と Low Level
Kubernetesでデプロイするコンテナを動かすため、コンテナランタイムを導入します。コンテナランタイムについては、以下の記事(シリーズ)がわかりやすいです。
コンテナランタイムは、ハイレベルコンテナランタイムとローレベルコンテナに分けることができます。
- High Levelコンテナランタイム
- kubeletと連携する。コンテナイメージ展開やローレベルコンテナランタイムへの受け渡しを担当。
- Low Levelコンテナランタイム
- 実際のコンテナを管理する
containerdは、High Levelコンテナランタイムの1つ。runcは、Low Levelコンテナランタイムの1つ。どちらも、もともとDockerが開発していたが、CNCF寄贈された際に改名して、今の名前になったらしい。
みなさんもよくご存知のDockerも、分解すると以下のようなアーキテクチャになるそうです。dockerコマンドしか打たないので、意識することはないですが、知っておいて損はなさそうですね。
余談: CRI と OCI
コンテナランタイムのレイヤとして、High LevelとLow Levelがあると書きました。Kubernetesでは、[kubelet]-[High Levelコンテナランタイム]-[Low Levelコンテナランタイム]が連携して、コンテナを動かすわけですが、それぞれのインターフェイスの規格は、CRI(Container Runtime Interface) と OCI(Open Container Initiative)によって、標準化されているようです。
こちらの記事も参照ください。
CNI Networking
CNI (Container Network Interface)は、CNCFのプロジェクトの1つであり、Linuxコンテナ内のネットワークインターフェイスの設定を行うプラグインを書く上での規格やライブラリから成ります。(直 訳)
要はコンテナが作成されたときにネットワークリソースをいい感じに構成して接続性を確保し、コンテナが削除されたときにネットワークリソースを開放します。この説明から分かる通り、私も正直よくわかっていないので以下のスライドで完全に理解してください。(Calicoくらいしか使ったことない)
kubelet
kube-scheduler によって紐付けられた(スケジュールされた)Podを kubelet が認識して、そのPodを自身のNodeで起動させる。 また、実行しているPodの監視・管理も行う。
kube-proxy
kube-proxy はKubernetesのServiceオブジェクトを元にルーティングを行う。実体はiptablesのルールを発行し、パケットの制御を行っている。
10. Configuring kubectl for Remote Access
Configuring kubectl for Remote Access
adminユーザで、kubectlを実行するために、kubeconfigファイルを生成します。接続するKubernetes API Serverとしては、Kubernetes API Serverの前段に配置したLBを指定します。
11. Provisioning Pod Network Routes
異なるWorkerノード上で動くPodが通信できるように、経路情報を設定します。ここでは、それぞれのWorkerノードに対して、PodのCIDRとノードの内部IPアドレスを紐づける経路情報を定義します。
1 2 3 4 5 6 |
NAME NETWORK DEST_RANGE NEXT_HOP PRIORITY default-route-081879136902de56 kubernetes-the-hard-way 10.240.0.0/24 kubernetes-the-hard-way 1000 default-route-55199a5aa126d7aa kubernetes-the-hard-way 0.0.0.0/0 default-internet-gateway 1000 kubernetes-route-10-200-0-0-24 kubernetes-the-hard-way 10.200.0.0/24 10.240.0.20 1000 kubernetes-route-10-200-1-0-24 kubernetes-the-hard-way 10.200.1.0/24 10.240.0.21 1000 kubernetes-route-10-200-2-0-24 kubernetes-the-hard-way 10.200.2.0/24 10.240.0.22 1000 |
ちなみにKubernetesのネットワークモデルを実装するその他の選択肢は、公式ドキュメントに書いてあるようです。
12. Deploying the DNS Cluster Add-on
DNSアドオンをデプロイすることで、クラスタ内のアプリケーションに対して、DNSベースのサービスディスカバリを提供できます。導入自体は、コマンド1行でできるらしいです。
1 |
kubectl get pods -l k8s-app=kube-dns -n kube-system |
さいごに
図や説明などは適宜追記していきます。次回は残りのテストを行い、Kubernetesクラスタの動作を確認します。
ちなみに手書きのメモはiPad mini 5で書きました。GoodNotes5というアプリです。有名だけど、意外と使ってない人もいるので、布教していきたい。
<このシリーズ>
以上.
コメント