Kubernetes The Hard Way
はいわゆるKubernetesチュートリアル。
今回は以下のドキュメントを参考に実施した。
- Kubernetes The Hard Wayを実施したときやってたこと
- 感想
- 知らなかったこと調査
- 02-client-tools
- 04-certificate-authority
- 07-bootstrapping-etcd
- 09-bootstrapping-kubernetes-workers
- 12-dns-addon
- 13-smoke-test
- その他参考
Kubernetes The Hard Wayを実施したときやってたこと
Kubernetes The Hard Way 実施中やったこと言ってみ 作業ログ 片っ端からリンクに飛ぶ ブログにする前提 やるやん やったぜ |
このブログを読んでいるということは、これからKubernetes The Hard Wayをやろうとしているのだと思う。
なので、Hard Wayがどんなものかよりも、作業中どんなものを参考・調査しながらやったのか書いておく。
作業ログ
ターミナルじゃなくて、自分が作業しているセクションをGoodNotesに書いておいてある。
たとえばこういう感じ…。あくまで自分メモなのでさすがになぐり書きしている。字が汚い。
「ここまでやったけど理解できてないかも」というメモは、気づいたら深夜になってて頭の回転が悪くなってたのを観測して翌日に回そうと思ってメモっていたもの。
あとは、クラスタの構築なので、自分が今どこの何をしているのか図も書いた。
片っ端からリンクに飛ぶ
ドキュメントは大変親切に翻訳してくれている*1。
貼ってくれているリンクもわからないものは面倒くさがらず踏んだ。この場で完全に理解しなくても頭の片隅には残る。
最初からブログにするつもりで実施した
これを書くのもそうだが、この先整理するのも見越してブログにメモを書きながら実施した。
感想
普段の業務ではマネージドサービス(EKS)に甘えているので、実施ラストあたりにようやくkubectl get pods
したときはちょっと嬉しかった。
「おお。ここでようやくいつものやつ」みたいな。
Controll Planeなど普段見えない所まで覗けたのは素直に面白かった。
この辺はまた別途整理して書いておきたいと思う。
Kubernetes The Hard Wayをやる価値は十分にあった。
知らなかったこと調査
02-client-tools
cfssl, cfssljson
CloudFlare製のPKI/TLSツール。
PKI(Public key infrastructure)とは公開鍵基盤 - Wikipediaのこと。
TLS証明書に署名、検証、およびバンドルするためのコマンドラインツール。
Kubernetesのクラスタ構築に証明書が使用されるため必要となる。
04-certificate-authority
Node Authorizer
kubeletによって行われたAPIリクエストを特に認証する特別な目的の認証モード。
07-bootstrapping-etcd
etcd
Go言語で記述された分散KVS
。Raftという分散合意アルゴリズムが採用されている。
クラスタ内の全サーバに一貫性のあるステートマシンを提供するためのアルゴリズム
とあるように、etcdを利用してKubernetesはクラスタの状態管理をしている。(Kubernetesのコンポーネントはステートレス)
/etc/systemd/system/kube-apiserver.service
systemdのユニットファイルとして作成。
[Unit] Description=Kubernetes API Server Documentation=https://github.com/kubernetes/kubernetes [Service] ExecStart=/usr/local/bin/kube-apiserver \ --advertise-address=10.240.0.10 \ #INTERNAL_IP --allow-privileged=true \ --apiserver-count=3 \ --audit-log-maxage=30 \ --audit-log-maxbackup=3 \ --audit-log-maxsize=100 \ --audit-log-path=/var/log/audit.log \ --authorization-mode=Node,RBAC \ --bind-address=0.0.0.0 \ --client-ca-file=/var/lib/kubernetes/ca.pem \ --enable-admission-plugins=NamespaceLifecycle,NodeRestriction,LimitRanger,ServiceAccount,DefaultStorageClass,ResourceQuota \ --etcd-cafile=/var/lib/kubernetes/ca.pem \ --etcd-certfile=/var/lib/kubernetes/kubernetes.pem \ --etcd-keyfile=/var/lib/kubernetes/kubernetes-key.pem \ --etcd-servers=https://10.240.0.10:2379,https://10.240.0.11:2379,https://10.240.0.12:2379 \ --event-ttl=1h \ --encryption-provider-config=/var/lib/kubernetes/encryption-config.yaml \ --kubelet-certificate-authority=/var/lib/kubernetes/ca.pem \ --kubelet-client-certificate=/var/lib/kubernetes/kubernetes.pem \ --kubelet-client-key=/var/lib/kubernetes/kubernetes-key.pem \ --kubelet-https=true \ --runtime-config=api/all \ --service-account-key-file=/var/lib/kubernetes/service-account.pem \ --service-cluster-ip-range=10.32.0.0/24 \ --service-node-port-range=30000-32767 \ --tls-cert-file=/var/lib/kubernetes/kubernetes.pem \ --tls-private-key-file=/var/lib/kubernetes/kubernetes-key.pem \ --v=2 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
- advertise-address
- クラスタのメンバーに伝えるIPアドレス
- allow-privileged
- trueの場合、特権コンテナを許可する
- apiserver-count
- クラスタで実行されているapiserverの数
- audit-log-maxage
- ファイル名にエンコードされたタイムスタンプに基づき、古い監査ログファイルを保持する最大日数
- audit-log-maxbackup
- 保持する古い監査ログファイルの最大数
- audit-log-maxsize
- ローテートされる前の監査ログファイルの最大サイズ(MB単位)
- audit-log-path
- 設定すると、apiserverに送られるすべてのリクエストがこのパスのファイルに記録される
- authorization-mode
- 安全なポートで認証を行うためのプラグインの順序付きリスト。カンマ区切り。AlwaysAllow,AlwaysDeny,ABAC,Webhook,RBAC,Node
- bind-address
- secure-portをListenするIPアドレス。空白の場合、全てのインターフェイスが使用される(0.0.0.0, ::)
- client-ca-file
- 公開鍵証明書認証を利用して認証を行う
- enable-admission-plugins
- 有効にするAdmission Plugin
- etcd-cafile
- etcdの通信をセキュアにするために使用するSSL認証のファイル
- etcd-certfile
- etcdの通信をセキュアにするために使用するSSL証明書ファイル
- etcd-keyfile
- etcdの通信をセキュアにするために使用するSSLキーファイル
- etcd-servers
- 接続するetcdのサーバリスト
- event-ttl
- イベントを保持する時間
- encryption-provider-config
- etcdにシークレットを保存するために使用される暗号化プロバイダ構成ファイル
- kubelet-certificate-authority
- 認証局の証明書ファイルパス
- kubelet-client-certificate
- TLSのクライアント証明書ファイルパス
- kubelet-client-key
- TLSのクライアントキーファイルパス
- kubelet-https
- kubeletはhttpsを使用する
- runtime-config
- apiserverに渡せるランタイム構成。api/allはすべてのapiバージョンを制御する特別なキー。どう設定すればいいかわからないときはfalseを推奨
- service-account-key-file
- Service AccountTokenの検証に使われる秘密鍵・公開鍵
- service-cluster-ip-range
- サービスクラスタIPを割り当てるIP範囲。CIDR表記。Podのノードに割り当てられるIP範囲と重複できない
- service-node-port-range
- NodePortの可視性のあるサービス用に予約するポート範囲
- tls-cert-file
- https用の証明書ファイル
- tls-private-key-file
- tls-cert-fileに一致する秘密鍵ファイル
- v
- ログレベル冗長性の数
Unit, Installについてはこちらが参考になる。
/etc/systemd/system/kube-controller-manager.service
systemdのユニットファイルとして作成。
[Unit] Description=Kubernetes Controller Manager Documentation=https://github.com/kubernetes/kubernetes [Service] ExecStart=/usr/local/bin/kube-controller-manager \\ --address=0.0.0.0 \\ --cluster-cidr=10.200.0.0/16 \\ --cluster-name=kubernetes \\ --cluster-signing-cert-file=/var/lib/kubernetes/ca.pem \\ --cluster-signing-key-file=/var/lib/kubernetes/ca-key.pem \\ --kubeconfig=/var/lib/kubernetes/kube-controller-manager.kubeconfig \\ --leader-elect=true \\ --root-ca-file=/var/lib/kubernetes/ca.pem \\ --service-account-private-key-file=/var/lib/kubernetes/service-account-key.pem \\ --service-cluster-ip-range=10.32.0.0/24 \\ --use-service-account-credentials=true \\ --v=2 Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
- cluster-cidr
- クラスタ内のPodのCIDR範囲
- cluster-signing-cert-file
- クラスタスコープの証明書発行に使用されるCA証明書を含むファイル
- cluster-signing-key-file
- クラスタスコープの証明書署名用の秘密鍵
- kubeconfig
- kubeconfigのパス
- leader-elect
- 高可用性のために複製されたコンポーネントを実行する場合にtrue
- root-ca-file
- 設定すると、ルート認証局がサービスアカウントのシークレットトークンに含まれる
- service-account-private-key-file
- サービスアカウントトークンに署名するためのPem
- use-service-account-credentials
- trueの場合は各コントローラーに込めつのサービスアカウント資格情報を使用する
09-bootstrapping-kubernetes-workers
runc
OCI使用に従ってコンテナを生成および実行するためのCLIツール。
CNI
コンテナネットワークインターフェイス。
コンテナとネットワークを接続する技術。
socat
ソケット通信をサーバ側としてもクライアント側としても 使えるコマンド。
conntrack
netfilterコネクショントラッキングシステムの全機能を提供する
netfilter
Linuxカーネル2.4以降のパケット処理のためのフレームワーク。これの設定を操作するツールがiptables
。
ipset
IPアドレスやポート番号等をひとまとめにして管理するツール。
swapが有効になっているとkubeletは起動失敗する
デフォルトで、無効にしないと起動失敗するようになっている。
「Pod がメモリを消費しすぎて、他の Pod のメモリが swap して遅くなる」状況を回避するため。
そのときのissueはこちら。
containerd
Dockerのコンテナランタイム。
Docker社がもともと開発していたが、現在はCNCFに寄贈されている。
なお現在もDocker内部のランタイムとして使われているので事実上標準のランタイムと言われている。 実行中のコンテナの管理・監視であったり、コンテナイメージの管理(レジストリへのpush, pullなど)が主な役割。
containerd1.1では、containerdにCRIプラグインが組み込まれ、直接Kubernetesとやり取りが可能になっている。
このKubernetes The Hard Wayでインストールしたcontainerdはv1.2.9だった。
ctr --version ctr github.com/containerd/containerd v1.2.9
12-dns-addon
CoreDNS
CoreDNSはGo言語製のDNSサーバ。CNCFのgraduatedプロジェクト。
Kubernetesでは個々のコンテナがDNSを使って名前解決する仕組みを持っている。つまりその部分を担っている。
クラスタで定義されたすべてのサービス(DNSサーバ自身も含め)にDNS名が割り当てられる。
13-smoke-test
kubectl port-forward
Podに対してポートフォワードを行う。
ローカルで実行するkubectlとPod間でポートフォワードを作成してくれる。
Pod内のエンドポイントにアクセスして動作を確認したいとかに使うと効率が良さそう。
その他参考
- Kubernetes The Hard Wayする - Qiita
- Kubernetes: 構成コンポーネント一覧 - Qiita
- Kubernetesのユーザー管理と認証・権限確認機構を理解しよう | さくらのナレッジ
*1:原文でできるのが一番いいのはわかっているけど、英語に躓いてHard WayがExtra Hard Wayになってもなーと言うことで