Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

⾃⼰紹介 ▶ 世良 迪夫(SERA Michio) • 富⼠通クラウドテクノロジーズ株式会社 • ニフクラ Hatobaとか作ってます • 解体kubeadmという本を出しました

Slide 3

Slide 3 text

製品紹介: ニフクラ Hatoba(β) ▶ 法⼈向けパブリッククラウド「ニフクラ」のKubernetes as a Service (KaaS) • βのうちは審査に通れば無料で使えます(本番利⽤は⾮推奨) IUUQTQGTOJGDMPVEDPNTFSWJDFIBUPCBIUN

Slide 4

Slide 4 text

解体kubeadm フェーズから読み解くKubernetesクラスタ構築ツールの全貌 ▶ 世界初のkubeadmの技術書 ▶ 特にphase(フェーズ)という切り⼝で説明 ▶ ⼤雑把に⾔えば Kubernetes The Hard Wayの kubeadm版みたいな内容

Slide 5

Slide 5 text

本⽇話すこと ▶ Kubernetesクラスタを構成するコンポーネント ▶ kubeadmの基本 ▶ kubeadmによるKubernetesクラスタ構築 ▶ まとめ

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

⼤雑把に2つの役割で理解するKubernetesクラスタ ▶ コンテナをいい感じに管理できるらしい • これはコントロールプレーンの役割 • マスターとも呼ばれていた ▶ なんかコンテナが動くらしい • これはノード(ワーカーノード)の役割 • コンテナ≒アプリと思ってもらって良い ίϯτϩʔϧϓϨʔϯ ϊʔυ ϊʔυ ϊʔυ ͍͍ײ͡ʹ؅ཧ ,VCFSOFUFTΫϥελ ίϯςφ ίϯςφ ίϯςφ ίϯςφ ίϯςφ ίϯςφ

Slide 8

Slide 8 text

Kubernetesクラスタのコンポーネント構成(公式) IUUQTLVCFSOFUFTJPKBEPDTDPODFQUTPWFSWJFXDPNQPOFOUT

Slide 9

Slide 9 text

Kubernetesの中⼼はKubernetes API ▶ Kubernetes API(kube-api-server)が各コンポーネントと通信する ▶ それぞれHTTPSのクライアント認証(mTLS)でセキュアに通信 • つまり証明書が必要 ,VCFSOFUFT"1* ʢLVCFBQJTFSWFSʣ LVCFTDIFEVMFS LVCFDPOUSPMMFS NBOBHFS )5514SFRVFTU )5514SFRVFTU LVCFMFU )5514SFRVFTU LVCFDUM ,VCFSOFUFTར༻ऀ )5514SFRVFTU

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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 \\

Slide 13

Slide 13 text

kubeadmの基本

Slide 14

Slide 14 text

kubeadmとは ▶ 公式のKubernetesクラスタ構築・運⽤ツール ▶ Kubernetes + administration でkubeadm(たぶん) • 英語圏ではキューブエーディーエム と発⾳されている • わたしは⾃社内で会話するときはクベアダムって発⾳します(発⾳しにくいので…) ▶ 他のツールの内部処理としても使われることを想定 • たとえばCluster API / kubespray / minikube 等の内部で使われている ▶ Kubernetes 1.13(2018/12)でGA

Slide 15

Slide 15 text

kubeadmのコアデザインプリンシプル ▶ Secure / セキュア • ベストプラクティスとなるセキュアな構成が構築できる ▶ Easy to use / 簡単に使える • ほんの数コマンドでKubernetesクラスタが構築できる ▶ Extendable / 拡張可能 • 設定ファイルで様々なKubernetesクラスタが構築できる IUUQTLVCFSOFUFTJPEPDTSFGFSFODFTFUVQUPPMTLVCFBENJNQMFNFOUBUJPOEFUBJMTDPSFEFTJHOQSJODJQMFT ৄࡉ͸ެࣜαΠτΛಡ΋͏ʂ

Slide 16

Slide 16 text

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も含まれる事が多い)

Slide 17

Slide 17 text

kubeadmのサブコマンド⼀覧 サブコマンド 説明 kubeadm init 最初のマスターノードの作成 kubeadm join 2台⽬以降のマスターノードまたはワーカーノードの追加 kubeadm upgrade Kubernetesバージョンのアップグレード kubeadm reset kubeadmで構築したコンポーネントの初期化 kubeadm config kubeadmのコンフィグ周りの処理つめあわせ kubeadm token kubeadmのブートストラップトークン周りの処理つめあわせ kubeadm version kubeadmのバージョン表⽰ kubeadm alpha 開発中のalpha機能つめあわせ ˞ଠࣈ͸௨ৗΑ͔ͭ͘͏Ͱ͋Ζ͏ίϚϯυ

Slide 18

Slide 18 text

kubeadmによるKubernetes構築

Slide 19

Slide 19 text

kubeadmによるシングルコントロールプレーンなクラスターの作成例 ▶ 事前に各ノードでkubeadmのインストールと各種準備 • https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/ ▶ ① コントロールプレーンノードで kubeadm init ▶ ② CNIをインストール ▶ ③ ワーカーノードでkubeadm join IUUQTLVCFSOFUFTJPEPDTTFUVQQSPEVDUJPOFOWJSPONFOUUPPMTLVCFBENDSFBUFDMVTUFSLVCFBEN # kubeadm init # kubectl apply -f # kubeadm join

Slide 20

Slide 20 text

kubeadmで構築したKubernetesクラスタ ίϯτϩʔϧϓϨʔϯ ϊʔυ LVCFBEN LVCFMFU ূ໌ॻ LVCFQSPYZ LVCFBEN LVCFMFU ূ໌ॻ DPSFEOT LVCFDPOUSPMMFSNBOBHFS LVCFTDIFEVMFS LVCFBQJTFSWFS LVCFQSPYZ ,VCFSOFUFTΫϥελ ͕LVCFBENͰߏஙͯ͘͠ΕΔίϯϙʔωϯτ FUDE

Slide 21

Slide 21 text

コントロールプレーンノードが1台のみのリスク ▶ コントロールプレーンノードが1台の場合は 当該ホスト障害時にKubernetes APIが動作しなくなってしまう ▶ 最悪 etcdのデータがロストするかも ίϯτϩʔϧϓϨʔϯ ϊʔυ ϊʔυ ϊʔυ ,VCFSOFUFTΫϥελ

Slide 22

Slide 22 text

kubeadmによるマルチコントロールプレーンクラスターの作成例 IUUQTLVCFSOFUFTJPEPDTTFUVQQSPEVDUJPOFOWJSPONFOUUPPMTLVCFBENIJHIBWBJMBCJMJUZ ▶ 事前に各ノードでkubeadmのインストールと各種準備 ▶ ① ロードバランサーを作成 ▶ ② 最初のコントロールプレーンノードで  kubeadm init ▶ ③ CNIをインストール ▶ ④ 2台⽬以降のコントロールプレーンノードで   kubeadm join ▶ ⑤ ワーカーノードでkubeadm join

Slide 23

Slide 23 text

もっと詳しい話 ▶ Kubernetes Meetup Tokyo #34 で更に内部的な話をしたのでそちらもどうぞ • https://www.youtube.com/watch?v=2AbDqZsMTxA • https://speakerdeck.com/heriet/phases-of-kubeadm-and-kubernetes-cluster-internal ▶ 書籍「解体kubeadm」もよければ

Slide 24

Slide 24 text

補⾜: kubeadmままの運⽤は⼤変 ▶ kubeadmはKubernetesの構築・運⽤を楽にしてくれますが、 それでもkubeadmで本番⽤のクラスタ運⽤は⼤変なのでオススメしません • クラウドのKaaSを使うのが第⼀の選択肢(たとえばニフクラHatobaとか) > クラスタ運⽤の⾯倒な部分をカバーしてくれるので • KaaS使えないときかつkubeadmままクラスタを作るならkubesprayを使おう > kubesprayはkubeadmをAnsibleで包んで使いやすくしたツール • 検証⽤途等ならkubeadmでもいいと思います

Slide 25

Slide 25 text

まとめ ▶ Kubernetesクラスタは多くのコンポーネントによって実現されている ▶ kubeadmを使えば簡単にKubernetesクラスタが構築できる • それでも⾼可⽤なKubernetesクラスタ構築・運⽤は⼤変 ▶ ⾃分でKubernetesクラスタ構築してみるKubernetesの理解におすすめ • 解体kubeadmではその内部処理を更に詳しく記述しています