Pro Yearly is on sale from $80 to $50! »

初めてKubernetesクラスタを作る人のためのkubeadm入門/kubeadm for Novices

D3764b33b44dcefd6a453ade0b8fec75?s=47 heriet
October 28, 2020

初めてKubernetesクラスタを作る人のためのkubeadm入門/kubeadm for Novices

Kubernetesクラスタの構築は数多くの方法が存在しますが、その中でも公式のツールであるkubeadmの使い方について解説します。書籍「解体kubeadm」でも解説したkubeadmの使い方とその動作を知ることで、標準的なKubernetesクラスタ構築の仕組みを理解することができます。

D3764b33b44dcefd6a453ade0b8fec75?s=128

heriet

October 28, 2020
Tweet

Transcript

  1. SERA Michio 2020/10/28 ニフクラ エンジニア ミートアップ 初めてKubernetesクラスタを作る⼈のための kubeadm⼊⾨ 

  2. ⾃⼰紹介 ▶ 世良 迪夫(SERA Michio) • 富⼠通クラウドテクノロジーズ株式会社 • ニフクラ Hatobaとか作ってます

    • 解体kubeadmという本を出しました 
  3. 製品紹介: ニフクラ Hatoba(β) ▶ 法⼈向けパブリッククラウド「ニフクラ」のKubernetes as a Service (KaaS) •

    βのうちは審査に通れば無料で使えます(本番利⽤は⾮推奨)  IUUQTQGTOJGDMPVEDPNTFSWJDFIBUPCBIUN
  4. 解体kubeadm フェーズから読み解くKubernetesクラスタ構築ツールの全貌 ▶ 世界初のkubeadmの技術書 ▶ 特にphase(フェーズ)という切り⼝で説明 ▶ ⼤雑把に⾔えば Kubernetes The

    Hard Wayの kubeadm版みたいな内容 
  5. 本⽇話すこと ▶ Kubernetesクラスタを構成するコンポーネント ▶ kubeadmの基本 ▶ kubeadmによるKubernetesクラスタ構築 ▶ まとめ 

  6. Kubernetesクラスタを構成するコンポーネント 

  7. ⼤雑把に2つの役割で理解するKubernetesクラスタ ▶ コンテナをいい感じに管理できるらしい • これはコントロールプレーンの役割 • マスターとも呼ばれていた ▶ なんかコンテナが動くらしい •

    これはノード(ワーカーノード)の役割 • コンテナ≒アプリと思ってもらって良い  ίϯτϩʔϧϓϨʔϯ ϊʔυ ϊʔυ ϊʔυ ͍͍ײ͡ʹ؅ཧ ,VCFSOFUFTΫϥελ ίϯςφ ίϯςφ ίϯςφ ίϯςφ ίϯςφ ίϯςφ
  8. Kubernetesクラスタのコンポーネント構成(公式)  IUUQTLVCFSOFUFTJPKBEPDTDPODFQUTPWFSWJFXDPNQPOFOUT

  9. Kubernetesの中⼼はKubernetes API ▶ Kubernetes API(kube-api-server)が各コンポーネントと通信する ▶ それぞれHTTPSのクライアント認証(mTLS)でセキュアに通信 • つまり証明書が必要 

    ,VCFSOFUFT"1* ʢLVCFBQJTFSWFSʣ LVCFTDIFEVMFS LVCFDPOUSPMMFS NBOBHFS )5514SFRVFTU )5514SFRVFTU LVCFMFU )5514SFRVFTU LVCFDUM ,VCFSOFUFTར༻ऀ )5514SFRVFTU
  10. Kubernetes APIのストレージはetcd ▶ etcdは分散KVS(Key Value Store) ▶ KubernetesのオブジェクトはすべてKubernetes API経由でetcdに永続化 

    ,VCFSOFUFT"1* ʢLVCFBQJTFSWFSʣ FUDE FUDE FUDE TUPSF BQJ7FSTJPOW LJOE1PE NFUBEBUB OBNFXFC TQFD DPOUBJOFST OBNFXFC JNBHFOHJOY QPSUT OBNFXFC DPOUBJOFS1PSU QSPUPDPM5$1
  11. Kubernetesクラスター内のネットワークはCNIが司る ▶ Kubernetesクラスター内では独⾃のネットワークで通信が⾏われる • Podに独⾃のネットワークのIPアドレスが振られ、ホストのように扱える ▶ その独⾃ネットワークを管理するのがCNIで様々な実装がある (Calico, Cilium, Weave

    Net など)  ࢀߟɿʮ$POUBJOFS/FUXPSL*OUFSGBDFʹ͍ͭͯௐ΂ͨʯIUUQTOUPPGVHJUIVCJPCMPHQPTUDPOUBJOFSOFUXPSLJOUFSGBDF ίϯςφ 1PE ίϯςφ 1PE ίϯςφ 1PE $/*ʹΑΔ,VCFSOFUFTωοτϫʔΫ 192.168.0.0/16 192.168.0.3 ίϯςφ 192.168.0.2 192.168.0.1
  12. Kubernetesクラスタを作るためには… ▶ Kubernetesに必要な各コンポーネントを適切にインストールする必要がある • ⼀つ⼀つ理解してインストールするのは結構⼤変  /usr/local/bin/kube-controller-manager \\ --bind-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 kube-apiserver \\ --advertise-address=${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,DefaultS torageClass,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=true' \\ --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 \\
  13. kubeadmの基本 

  14. kubeadmとは ▶ 公式のKubernetesクラスタ構築・運⽤ツール ▶ Kubernetes + administration でkubeadm(たぶん) • 英語圏ではキューブエーディーエム

    と発⾳されている • わたしは⾃社内で会話するときはクベアダムって発⾳します(発⾳しにくいので…) ▶ 他のツールの内部処理としても使われることを想定 • たとえばCluster API / kubespray / minikube 等の内部で使われている ▶ Kubernetes 1.13(2018/12)でGA 
  15. kubeadmのコアデザインプリンシプル ▶ Secure / セキュア • ベストプラクティスとなるセキュアな構成が構築できる ▶ Easy to

    use / 簡単に使える • ほんの数コマンドでKubernetesクラスタが構築できる ▶ Extendable / 拡張可能 • 設定ファイルで様々なKubernetesクラスタが構築できる  IUUQTLVCFSOFUFTJPEPDTSFGFSFODFTFUVQUPPMTLVCFBENJNQMFNFOUBUJPOEFUBJMTDPSFEFTJHOQSJODJQMFT ৄࡉ͸ެࣜαΠτΛಡ΋͏ʂ
  16. kubeadmのスコープ  Machine kube-apiserver kube-scheduler kube-controller-manager FUDE kubelet (※最初のインストールのみ利⽤者が実施) Control

    Plane kube-proxy CoreDNS CNI Addon Any Kubernetes Resources kubeadmで 構築・運⽤ 利⽤者が作成 利⽤者が作成 Container Runtime ※kubeadmの世界ではetcdはControl Planeに含まれないので注意(通常はetcdも含まれる事が多い)
  17. kubeadmのサブコマンド⼀覧  サブコマンド 説明 kubeadm init 最初のマスターノードの作成 kubeadm join 2台⽬以降のマスターノードまたはワーカーノードの追加

    kubeadm upgrade Kubernetesバージョンのアップグレード kubeadm reset kubeadmで構築したコンポーネントの初期化 kubeadm config kubeadmのコンフィグ周りの処理つめあわせ kubeadm token kubeadmのブートストラップトークン周りの処理つめあわせ kubeadm version kubeadmのバージョン表⽰ kubeadm alpha 開発中のalpha機能つめあわせ ˞ଠࣈ͸௨ৗΑ͔ͭ͘͏Ͱ͋Ζ͏ίϚϯυ
  18. kubeadmによるKubernetes構築 

  19. kubeadmによるシングルコントロールプレーンなクラスターの作成例 ▶ 事前に各ノードでkubeadmのインストールと各種準備 • https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ ▶ ① コントロールプレーンノードで kubeadm init

    ▶ ② CNIをインストール ▶ ③ ワーカーノードでkubeadm join  IUUQTLVCFSOFUFTJPEPDTTFUVQQSPEVDUJPOFOWJSPONFOUUPPMTLVCFBENDSFBUFDMVTUFSLVCFBEN # kubeadm init # kubectl apply -f <cni.yaml> # kubeadm join
  20. kubeadmで構築したKubernetesクラスタ  ίϯτϩʔϧϓϨʔϯ ϊʔυ LVCFBEN LVCFMFU ূ໌ॻ LVCFQSPYZ LVCFBEN LVCFMFU

    ূ໌ॻ DPSFEOT LVCFDPOUSPMMFSNBOBHFS LVCFTDIFEVMFS LVCFBQJTFSWFS LVCFQSPYZ ,VCFSOFUFTΫϥελ ͕LVCFBENͰߏஙͯ͘͠ΕΔίϯϙʔωϯτ FUDE
  21. コントロールプレーンノードが1台のみのリスク ▶ コントロールプレーンノードが1台の場合は 当該ホスト障害時にKubernetes APIが動作しなくなってしまう ▶ 最悪 etcdのデータがロストするかも  ίϯτϩʔϧϓϨʔϯ

    ϊʔυ ϊʔυ ϊʔυ ,VCFSOFUFTΫϥελ
  22. kubeadmによるマルチコントロールプレーンクラスターの作成例  IUUQTLVCFSOFUFTJPEPDTTFUVQQSPEVDUJPOFOWJSPONFOUUPPMTLVCFBENIJHIBWBJMBCJMJUZ ▶ 事前に各ノードでkubeadmのインストールと各種準備 ▶ ① ロードバランサーを作成 ▶ ②

    最初のコントロールプレーンノードで  kubeadm init ▶ ③ CNIをインストール ▶ ④ 2台⽬以降のコントロールプレーンノードで   kubeadm join ▶ ⑤ ワーカーノードでkubeadm join
  23. もっと詳しい話 ▶ Kubernetes Meetup Tokyo #34 で更に内部的な話をしたのでそちらもどうぞ • https://www.youtube.com/watch?v=2AbDqZsMTxA •

    https://speakerdeck.com/heriet/phases-of-kubeadm-and-kubernetes-cluster-internal ▶ 書籍「解体kubeadm」もよければ 
  24. 補⾜: kubeadmままの運⽤は⼤変 ▶ kubeadmはKubernetesの構築・運⽤を楽にしてくれますが、 それでもkubeadmで本番⽤のクラスタ運⽤は⼤変なのでオススメしません • クラウドのKaaSを使うのが第⼀の選択肢(たとえばニフクラHatobaとか) > クラスタ運⽤の⾯倒な部分をカバーしてくれるので •

    KaaS使えないときかつkubeadmままクラスタを作るならkubesprayを使おう > kubesprayはkubeadmをAnsibleで包んで使いやすくしたツール • 検証⽤途等ならkubeadmでもいいと思います 
  25. まとめ ▶ Kubernetesクラスタは多くのコンポーネントによって実現されている ▶ kubeadmを使えば簡単にKubernetesクラスタが構築できる • それでも⾼可⽤なKubernetesクラスタ構築・運⽤は⼤変 ▶ ⾃分でKubernetesクラスタ構築してみるKubernetesの理解におすすめ •

    解体kubeadmではその内部処理を更に詳しく記述しています