Upgrade to Pro — share decks privately, control downloads, hide ads and more …

kubeadmに学ぶクラスター構築/implementation of kubeadm init

bells17
September 29, 2020

kubeadmに学ぶクラスター構築/implementation of kubeadm init

Kubernetes Novice Tokyo #5 (#k8snovice)
https://k8s-novice-jp.connpass.com/event/187873/
で発表したLT資料です。

配信アーカイブのURLは
https://youtu.be/Qxn8aQTUZuo
になります。

bells17

September 29, 2020
Tweet

More Decks by bells17

Other Decks in Programming

Transcript

  1. ▶ @bells17 ▶ Software Engineer ▶ 主に Kubernetes 関連コンポーネントの開発など ▶

    Kubernetes #sig-docs-ja-reviews ▶ CNBF実⾏委員 ▶ @bells17_
  2. Kubeadm ▶ Kubernetesコミュニティ公式のKubernetesクラスター構築ツール ▶ Kubernetesクラスター構築の「ベストプラクティス」を提供 ▶ Kubeadmはクラスターのブートストラップにフォーカスした機能を提供 する + コンテナランタイムやkubeletのインストールはkubeadmのスコープ外

    ▶ Kubesprayやkindなどその他のKubernetesクラスター構築ツールの内部 で使われていることがある ▶ kubeadmが⾏うクラスター構築処理を1(サブ)フェーズ単位で実⾏できる ようになっている ▶ KubernetesコミュニティのSig Cluster Lifecycleによって開発されている
  3. Kubeadmの様々なサブコマンド ▶ kubeadm init: Kubernetesクラスターの構築 ▶ kubeadm join: 構築したクラスターへの参加 ▶

    kubeadm upgrade: Kubernetesバージョンのアップグレード ▶ kubeadm config: kubeadmの設定管理 ▶ etc この中で今回はkubeadm initの処理にフォーカスした内容です
  4. kubeadm initのフェーズ⼀覧 ▶ preflight ▶ certs ▶ kubeconfig ▶ kubelet-start

    ▶ control-plane ▶ etcd ▶ wait-control-plane ▶ upload-config ▶ upload-certs ▶ mark-control-plane ▶ bootstrap-token ▶ kubelet-finalize ▶ addon •チェック処理 •クラスター構築 •Kubeadmによるクラスター管理
  5. kubeconfig ▶ 各種control plane/管理者のためのkubeconfigファイルの⽣成を⾏う ▶ 以下の4者のためのkubeconfigを⽣成 ▶ 管理者 ▶ kubelet

    ▶ kube controller manger ▶ kube scheduler ▶ kubernetes/kubernetesのcmd/kubeadm/app/util/kubeconfig
 パッケージにあるCreateBasic関数を使ってkubeconfigファイルのデータを⽣ 成 ▶ その後CreateBasic関数の呼び出し元であるCreateWithCerts関数内でクライ アント証明を埋め込んでいる ▶ クライアント証明書は前のステップで⽣成したファイルを読み込んでいる
  6. control-plane ▶ Static Podで各種control planeのpodを起動するためのpod specマニフェスト ファイルを⽣成する ▶ 以下のコンポーネントのためのyamlを⽣成する ▶

    kube apiserver ▶ kube controller manger ▶ kube scheduler ▶ 内部処理は以下の様になっている ▶ ベースとなるpodのspecを⽣成 ▶ 設定に応じたkustomize/patchファイルによるspecの書き換えを⾏う ▶ ⽣成したspecをstatic pod⽤のファイルとして書き込む ▶ specの書き換えについてはドキュメントについては記載が⾒当たらない(気が する)
  7. 補⾜: Static Pod ▶ Static Podの設定ディレクトリ(デフォルト: /etc/kubelet.d)以下にpod specのマニフェストファイルを設置するとkubeletがPodを起動してくれ る機能 ▶

    Static Podはapi serverからの操作ができないという特徴をがある → kubectlなどで削除したりできない ▶ Static Podの設定ディレクトリはstaticPodPathで設定可能 ▶ また—manifest-urlで指定したURLから定期的に情報取得を⾏い、Static Podを起動することも可能 ▶ Static Podは起動にkube apiserverを必要としないため、kube apiserver を含むcontrol planeの起動ができるということだと思う
  8. etcd ▶ Static Podでetcdのpodを起動するためのpod specマニフェストファイル を⽣成する ▶ 内部処理は以下の様になっている ▶ etcdのデータ⽤のディレクトリを⽣成

    ▶ ベースとなるpodのspecを⽣成 ▶ 設定に応じたkustomize/patchファイルによるspecの書き換えを⾏う ▶ ⽣成したspecをstatic pod⽤のファイルとして書き込む
  9. wait-control-plane ▶ Static Podでetcdのpodを起動するためのpod specマニフェストファイル を⽣成する ▶ 内部処理は以下の様になっている ▶ kubeletが正常に起動していることのチェックを⾏う

    ▶ kubelet のヘルスチェック⽤のエンドポイント(http://localhost: 10248/healthz)へのリクエストによって判断する ▶ kube apiserverが正常に起動していることのチェックを⾏う ▶ kube apiserverの /healthz へのリクエストによって判断する ▶ kube apiserverが正常にレスポンスを返す = etcdも正常という判断? ▶ kube controller manger/kube schedulerのチェックはここでは⾏ってい ないよう
  10. upload-config ▶ Kubeadm/kubeletの設定値をConfigMapに作成する ▶ kubeadm側内部処理 ▶ kubeadmの設定と構築したクラスター情報をkubeadm-configという ConfigMapに保存 ▶ kubeadmが?ConfigMapを取得するためのRole/RoleBindingの作成

    ▶ kubelet側内部処理 ▶ kubeletの設定値をConfigMapに作成 ▶ 各種ノードがConfigMapを取得するためのRole/RoleBindingの作成 ▶ ⾃⾝のNodeリソースのCRIソケットを⽰すアノテーションの設定
  11. upload-certs ▶ 各種証明書情報をSecretに書き込む ▶ 内部処理 ▶ 短命(2時間)なブートストラップトークンを作成する ▶ 各種証明書情報をファイルから読み取り暗号化する ▶

    kubeadm-certsというSecretに暗号化された各種証明書情報の書き込みを⾏ う ▶ このSecretはOwnerReferenceでブートストラップトークンと紐付けられ る ▶ kubeadmが?kubeadm-certsを取得するためのRole/RoleBindingの作成を⾏ う ▶ これらのブートストラップトークン・証明書情報はkubeadm joinの際に利⽤ されるよう
  12. mark-control-plane ▶ control planeノードにnodeRegistration.taintsで渡したtaintを設定する ▶ control planeノードのラベルに
 node-role.kubernetes.io/master: ""の付与も⾏う ▶

    “Implementation design for kubeadm”を⾒る限り
 node-role.kubernetes.io/master:NoScheduleというtaintも設定される
 らしいが、実装を⾒る限りそういった箇所はなさそうだった
  13. bootstrap-token ▶ Kubeadm joinでノードをクラスターに参加させるためのブートストラッ プトークンSecretの⽣成を⾏う ▶ 元となるブートストラップトークンはkubeadm initの各フェーズ前の初 期化処理の段階で予め1つ⽣成されている ▶

    ブートストラップを⾏うための各種(Cluster)RoleBindingの設定をブート ストラップトークンの所属グループである system:bootstrappers:kubeadm:default-node-tokenに⾏う ▶ kube-systemのcluster-info ConfigMapにブートストラップ⽤の設定ファ イルを設置する ▶ system:anonymousに対してkube-systemのcluster-info ConfigMapの取 得権限を付与する
  14. まとめ ▶ kubeadm initでどのようにKubernetesクラスターが作られているのか紹介しました ▶ control plane/etcdの管理にstatic podを使っている、ブートストラップトークンという仕 組みを使って新しいノードがクラスターに参加できるようになっている、addonは kubeadmで直接設定ファイルなどを⽣成してデプロイしているなど、Kubernetse

    The Hard Wayをやるのとはまた違ったやり⽅になっていて⾯⽩かったです ▶ ある程度同じようなことはドキュメントに書いてあるとはいえ、コードレベルで追ってい くとドキュメントには書いてないことも把握することができて勉強になりました
  15. 参考資料 ▶ A Stronger Foundation for Creating and Managing Kubernetes

    Clusters https://kubernetes.io/blog/2017/01/stronger-foundation-for- creating-and-managing-kubernetes-clusters/ ▶ Implementation details https://kubernetes.io/docs/reference/setup-tools/kubeadm/implementation-details/#mark-the-node-as-control- plane ▶ Installing kubeadm https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ ▶ Creating a cluster with kubeadm https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/ ▶ Implementation design for kubeadm https://github.com/kubernetes/kubeadm/blob/master/docs/design/design_v1.10.md ▶ kubernetes/kubernetes/cmd/kubeadm https://github.com/kubernetes/kubernetes/tree/release-1.19/cmd/kubeadm ▶ kubernetes/kubeadm https://github.com/kubernetes/kubeadm ▶ Using Kustomize with Kubeadm Configuration Files https://blog.scottlowe.org/2019/10/16/using-kustomize-with-kubeadm- configuration-files/ ▶ Create static Pods https://kubernetes.io/docs/tasks/configure-pod-container/static-pod/ ▶ Authenticating with Bootstrap Tokens https://kubernetes.io/docs/reference/access-authn-authz/bootstrap-tokens/ ▶ Super Simple Discovery API https://github.com/kubernetes/community/blob/master/contributors/design-proposals/cluster-lifecycle/ bootstrap-discovery.md ▶ Authenticating https://kubernetes.io/docs/reference/access-authn-authz/authentication/ ▶ Kubernetes The Hard Way https://github.com/kelseyhightower/kubernetes-the-hard-way