「[[.NET 開発基盤部会 Wiki>http://dotnetdevelopmentinfrastructure.osscons.jp]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>Open PaaS]] --[[OpenShift]] --[[Cloud Foundry]] --[[Kubernetes]] *目次 [#dc96026c] #contents *概要 [#ec699210] -ネットワークインフラなどの自動展開やスケーリングといったコンテナの運用を自動化するための、~ フリーソフトウェアによって構成されるコンテナ・オーケストレーション・プラットフォーム。 -[[Open PaaS]]と比較されることが多いが、ジャンルとしては、PaaSではなく、CaaS(新設)らしい。 **呼称 [#r0c31f26] -クバネティス / クバネテス / クーべネティス -ギリシャ語で航海長またはパイロットを意味する。 -K8sと略記される。 **経緯 [#v0663bf1] -当初、Googleが開発していた。~ Google の Borg という 15 年にわたるプロジェクトに基づいている。 -オープンソースソフトウェアとして公開したことで、~ MicrosoftやRed Hatといった多くのIT企業が開発に参加表明。 ***2014年 [#b0c577b8] Google、Kubernetes発表(6月) ***2015年 [#l593ed2e] -2月~ OpenShift V3、[[Docker>#de77bde7]]とKubernetesをコアとすると発表。 -7月 --バージョン1.0に達する --CNCFが設立され開発主体がこの団体へ移動。 ***2016年 [#r839d233] [[Swarm>Docker#u512f6bd]] 対 Kubernetesの状態 -10月~ Kubernetesが独自コンテナランタイム([[cri-o>#wd8d1dac]])開発を表明 ***2017年 [#a235c6fb] コンテナ・オーケストレーションのデファクトになった。 -初頭に、Kubernetesをサポートする~ Public Cloud は Google Cloud Platformのみだった。 -2月~ Microsoft AzureがKubernetesの公式サポートを表明、~ クラウド業界は次第にKubernetesにシフトするようになった。 --オラクルやVMwareといった企業もCNCFに参加を表明 --GoogleやMicrosoftとは競合関係にあるAWSも参加 -10月に、[[Docker>#de77bde7]]がKubernetesサポートすることを発表。 ***2018年 [#c1de5ccb] -1月時点でLinux Foundationの傘下にある~ CNCFが管理するオープンソースプロジェクトになった。 ***[[標準化の動向>#c2b84e28]] [#f8f6436f] *アーキテクチャ [#xbc57197] -ネットワークで接続された複数のLinux上にクラスタを構築することで動作する。 -クラスタは主に複数の[[マスター>#x3a054be]] (master) と[[ノード>#w630aafb]] (node) から構成される。 --[[マスター>#x3a054be]]がクラスターの管理を行い、 --各[[ノード>#w630aafb]]上にコンテナがデプロイされる。 -[[マスター>#x3a054be]]や[[ノード>#w630aafb]]を構成するコンポーネントは下記のようになっている。 -[[マスター>#x3a054be]]と[[ノード>#w630aafb]]のコンポーネントは同一のマシン上に存在してもよく、~ 最小の構成では1台からなるKubernetesクラスタが構築出来る。 **マスター [#x3a054be] 制御プレーンとも。 ***kube-apiserver [#vdc79d21] Kubernetes APIを外部に公開するためのコンポーネント。 ***etcd [#f3f1e957] Kubernetesクラスタの情報を保存する分散キーバリューストア。 ***kube-scheduler [#ybf9a720] [[ポッド>#j268603c]]をどの[[ノード>#w630aafb]]に対してデプロイするかを選択するコンポーネント。 ***kube-controller-manager [#bbc30c32] Kubernetesクラスタの各種[[コントローラ>#zca03066]]を実行するコンポーネント。 ***cloud-controller-manager [#ccfc4f4b] -Kubernetesとプラットフォームとなっている~ クラウドプロバイダとの相互作用を担うコンポーネント。 -各クラウドプロバイダに特化した機能を提供し、パフォーマンスを向上する。 ***[[その他アドオン>#y089c43f]] [#ubeb7941] **ノード [#w630aafb] 実行ノードとも。 ***kubelet [#a31f1808] -ノード上に常駐し、ノードの生存をクラスタに対して通知する。 -自身に対する[[ポッド>#j268603c]]の割り当てが行われたかどうかを監視して --ボリュームのマウント、 --コンテナのダウンロード/デプロイ、 --[[ポッド>#j268603c]]の生存確認 >などを行い、クラスタに通知する機能も担う。 ***kube-proxy [#wc90f28d] 外部やapiserverからのアクセスを、~ ノード上の各[[ポッド>#j268603c]]に対して転送し、~ [[ポッド>#j268603c]]へのアクセスを抽象化するコンポーネント。 **コンテナ・ランタイム [#r6074505] -実際にコンテナを動作させるバックエンドに利用される。 -全て [[Kubernetes CRI (Container Runtime Interface)>#t04d9c7b]] 実装 ***[[Docker]] [#de77bde7] ***[[containerd>#h78f8fe9]] [#k8003d18] ***[[CRI-O>#n37e3d66]] [#wd8d1dac] **アドオン [#y089c43f] ***DNS [#cd972417] -環境内の他のDNSサーバ -以下のDNSレコードを提供するDNSサーバ --環境内の他のDNSサーバ --Kubernetesサービスの ***ダッシュボード [#n1081d32] ***コンテナリソース監視 [#o0092bab] -supervisord -kubeletと[[Docker>#de77bde7]]が正しく動作~ し続けるように監視及び管理するコンポーネント。 ***クラスターレベルログ [#m40c6bcb] -fluentd -クラスタレベルでのロギングを補助する。 **コントローラ [#zca03066] [[マスター>#x3a054be]]上の[[kube-controller-manager>#bbc30c32]]上で実行される。 ***Deployments [#p7551857] 下位要素は、[[ReplicaSet>#w119c808]] -CLIを使用したり、yaml や JSON で定義をコントローラに渡したりして展開できる。 -[[ポッド>#j268603c]]だけでなく[[サービス>#neadf311]]の定義や、各種要素の詳細な設定を定義して一括で適用できる。 ***ReplicaSet [#w119c808] 下位要素は、[[ポッド>#j268603c]] -負荷分散や、SLAの維持のためレプリカ数の[[ポッド>#j268603c]]が利用可能であることを保証する。 -[[ポッド>#j268603c]]がどの[[ノード>#w630aafb]]で動くかは、[[kube-scheduler>#ybf9a720]]によって決定される。 ***DaemonSet [#e7cc1702] 下位要素は、[[ポッド>#j268603c]] -[[ノード>#w630aafb]]が単一の[[ポッド>#j268603c]]のコピーを稼働させることを保証する。 -全[[ノード>#w630aafb]]や特定の[[ノード>#w630aafb]]群に対してある機能を実行しておきたい場合に使う。 -具体的な利用シーンとしては、ログ収集のエージェントなどがある。 ***StatefulSet [#t7cc78b3] 下位要素は、[[ポッド>#j268603c]] -データベースなどステートフルな[[ポッド>#j268603c]]が必要な場合は[[StatefulSet>#t7cc78b3]]を使って展開。 -[[Deployment>#p7551857]]では、全ての[[ポッド>#j268603c]]で1個のPVをマウントするが、~ [[StatefulSet>#t7cc78b3]]で作成された[[ポッド>#j268603c]]は、それぞれ単一のPVをマウントする。 -[[StatefulSet>#t7cc78b3]]を使うとストレージやネットワーク名などが保持される。 -データベースなど、データの永続化の用途で利用される。 **ポッド [#j268603c] ***概要 [#ra6a9cd9] -いくつかのコンテナをグループ化したもの。 -ポッド単位で作成、開始、停止、削除といった操作を行う。 -1つのコンテナを作成したいときも「コンテナが1つ含まれるポッド」を作成する。 ***特徴 [#o1577b38] 以下の特徴がある。 -ポッド内のコンテナは、同一ホスト上に配備される。 -ポッド内のコンテナは、仮想NICやプロセステーブルを共有する。~ → つまり、同じIPを使えたり、互いのプロセスが見えたりする。 --各ポッドには固有のIPアドレスがあり、ポートスペース全体を所有している。 --ポッド内のコンテナはストレージを共有できる。 -ポッドには、ポッドをグループするための1つ以上のラベルを指定できる。 -一般的には、サーバと、そのサーバと共に実行する補助サービスを含める。 --Webサーバ --APサーバ --DBサーバ --KVSサーバ **ボリューム [#jcc6a107] -抽象化された[[ポッド>#j268603c]]と疎結合なリソースで、[[ポッド>#j268603c]]に紐づく。 -[[ポッド>#j268603c]]内のコンテナがデータを読み書きできるディスク領域。 -様々な種類が提供されている。 ***種類や用途 [#s3ba1bd4] ボリュームには様々な種類や用途がある。 -一時領域 --CONFIG -データ共有 --永続領域 --高可用性 ---DBの高可用性オプションによるもの ---[[ReplicaSet>#w119c808]]によるもの ***ボリューム・タイプ [#o6b09b53] -emptyDir --[[ポッド>#j268603c]]用の一時的なディスク領域 --[[ポッド>#j268603c]]が terminate されると削除される。 -hostPath~ [[ノード>#w630aafb]](ホスト)の任意の領域をマウントできる。 -[[PersistentVolume(PV)>#l873c79e]]~ 永続化領域として確保されるボリューム。 **サービス [#neadf311] ネットワーク機能を提供するコンポーネント ***用途 [#s545ffc7] -[[ポッド>#j268603c]]に対して通信をルーティングする。 -[[ポッド>#j268603c]]に対する通信を維持する(SLA、負荷分散) ***サービス・タイプ [#pd866509] 以下の種類がある。 -Node Port -Cluster IP -Load Balancer -, etc. ※ 詳しくは[[コチラ>#u9217b63]]。 *リソースで分類 [#ee62200e] に分類されます。リソースを定義するYAMLの記述方法の詳細はAPIドキュメントを参照ください。 **Workloads [#o20650b7] Kubernetesを構成する基本的なリソース ***[[Deployment>#p7551857]] [#r5d77514] ***[[ReplicaSet>#w119c808]] [#k5d1f44c] ***[[Pod>#j268603c]] [#f39bdbac] ***[[DaemonSet>#e7cc1702]] [#le61eab5] ***[[StatefulSet>#t7cc78b3]] [#n861cc2c] ***Job/CronJob [#f9dce694] -Job~ バッチ処理が終わったらPodが(正常)終了。 -CronJob~ Jobをスケジュール実行する。 **Discovery & LB [#u5daf1b9] 基本的なリソースに対して、外部から参照する口を提供するもの ***Service [#u9217b63] -L4のロードバランシングを実現する。 -Serviceは、既定で利用可能。 -種別~ 以下のような種別がある。 --Node Port ---'<Node IP>:<Node Port>にアクセスを提供する。 ---<Node IP>は、マスタのIPで、サービスの全Nodeを公開 --Cluster IP~ サービスの特定のNodeを公開(内部通信用) --External IP~ サービスの特定のNodeを公開(外部通信用) --Headless~ DNS ラウンドロビンによる転送先PodのIPアドレス取得 --Endpoint(selector 指定無し) ***負荷分散 [#sba5ab4d] -Load balancer --L4ロード・バランシングを実現する。 --Cluster IPに負荷分散機能を加えている。 -Ingress --L7ロード・バランシングを実現する。 --IngressリソースにはIngressコントローラーが必要。 ***Outbound [#n6e47aba] -External Name --外部のドメイン宛のCNAMEを返す機能を提供する。 --例えば、Podから外部のexample.comへアクセスする場合。 -None-Selector~ 外部のサービスに対してロード・バランシング **Config & Storage [#iffeeae0] ***Config Map [#b03c67e4] Key-Valueで構成され、アプリケーションの設定値を管理するリソース。 ***Secret [#cdb67527] パスワードなどの機密情報を管理するリソース。 ***Volume [#l873c79e] Podのデータを永続化するための仕組み。 -PersistentVolumeClaim (PVC)~ PodにVolumeや[[PersistentVolume (PV)>#sf7eb14d]]を間接的に指定。 --PV の要求を行うリソース。 --PVC は要求された内容(容量、ラベル)から~ 適切な PV を探し、ボリュームを割り当てる。 --プロビジョニングの方法として以下の2つの方法がある。 ---Static : 予め PV を作成 ---Dynamic : PVC が作成した際に動的に PV を作成 ***Cluster [#sf7eb14d] -[[Node>#w630aafb]] -Namespace~ 分離 / 独立した環境を準備する。 -PersistentVolume (PV) --[[PersistentVolumeClaim(PVC)>#l873c79e]]経由で利用する。 --accessModes, capacity, storageClassName, volumeMode, etc.を定義 -RBAC (Role Based Access Control) --Role --ClusterRole --RoleBinding --ClusterRoleBinding ***Metadata [#eefe0c0e] -Resource Quota --resource.request~ NamespaceおよびPodに割り当てるリソース量を定義 --resource.limit~ NamespaceおよびPodに割り当てるリソースの上限を定義 --LimitRange~ 最小 / 最大・デフォルト値を定義 ---リソースタイプ~ Pod / Container / PersistentVolumeClaim ---マシンリソース~ CPU / メモリ ---設定値~ 最大値 / 最小値 / デフォルト / resource.limitとresource.requestの比率 -QoS Classes~ マシンリソースを超えたリソースを割当を行う場合、~ どのPodに優先 / 削除する必要があるかを決定する。 --Guaranteed~ CPU/メモリ共にresource.limit/requestが設定&limit=request --Burstable~ CPU/メモリのいずれかがresource.limit/requestが設定 --BestEffort~ 上記条件に当てはまらない -HorizontalPodAutoscaler(HPA) --Pod数を増減 --動的な水平スケーリングを実現 --Webサーバなど永続化データを持たないサーバが対象 -VerticalPodAutoscaler(VPA) --Podに割り当てるCPU / メモリ量を増減 --動的な垂直スケーリングを実現 --DBサーバなど永続化データを持つサーバが対象 *エコシステム [#na158cd0] **[[kubectl]] [#o2eaedf8] ***[[kubectlコマンド>kubectl#n7027448]] [#n7027448] ***[[kube configファイル>kubectl#ja6b145e]] [#ja6b145e] **サブシステム [#y92d3a2a] ***[[Compose on Kubernetes]] [#l49a8b15] [[Kompose>#fbdd4dc8]]と同じだが、開発元が社 ***[[Kompose]] [#fbdd4dc8] Docker Compose ファイルを Kubernetes オブジェクトに変換できる。 ***[[Helm Charts]] [#qb08430b] Kubernetes の charts を利用するための簡単なツール ***[[Rancher Charts]] [#s02dcf6f] [[Helm>#qb08430b]]のウワモノ。 **[[構築ツール類>Kubernetesの構築]] [#l3e7f5de] **ツール類 [#od0fea25] ***[[構築ツール類>Kubernetesの構築]] [#l3e7f5de] ***[[運用ツール類>Kubernetesの運用]] [#z0740fe8] ***[[監視ツール類>Kubernetesの監視]] [#h8d0c17c] *トレンド [#dfd9871c] **[[コンテナの標準仕様]] [#lb9e85e4] ***[[CRI(Container Runtime Interface)>コンテナの標準仕様#r82f49bd]] [#t04d9c7b] → [[コンテナ・ランタイム>#r6074505]] ***[[OCI(Open Container Initiative)>コンテナの標準仕様#y9807a95]] [#z00fdca5] ***[[CSI(Container Storage Interface)>コンテナの標準仕様#f78e2849]] [#odd00978] ***[[CNI(Container Network Interface)>コンテナの標準仕様#j757b1a3]] [#o5f190ed] **標準化の動向 [#c2b84e28] ***2015年 [#u50a190d] [[OCI(Open Container Initiative)>#z00fdca5]] -コンテナ・ランタイムとコンテナ・イメージの標準 -6月にDocker社などの複数の企業によりイニシアチブ(組織)が設立された。 ***2016年 [#vd6fce6b] [[CRI(Container Runtime Interface)>#t04d9c7b]] -[[Docker]]以外のコンテナ・ランタイムを組み込み易くするI/F標準。 -12月にkubeletとコンテナランタイムの通信規格として規定された ***2017年 [#i2ec3011] -[[OCI(Open Container Initiative)>#z00fdca5]]~ 7月に「OCI v1.0」が策定、以下がリリースされている。 --コンテナランタイムの標準仕様である「Runtime Specification」 --コンテナイメージの標準仕様である「Image Format Specification」 -[[CRI(Container Runtime Interface)>#t04d9c7b]] --「[[cri-o>#n37e3d66]]」も1.0に到達 --kubeletとコンテナランタイム間のAPIのI/Fも「CRI」準拠のものとなった。 ***2018年 [#q1c2e1bd] -[[OCI(Open Container Initiative)>#z00fdca5]]~ 4月にはコンテナイメージ配布の標準仕様を策定する、~ 「Distribution Specification」プロジェクトへの着手が発表。 -[[CSI(Container Storage Interface)>#odd00978]]~ 11月にコンテナ・オーケストレーション・ツールと~ ストレージ間のI/Fの標準仕様として、v1.0に到達した。 **[[Docker]]との関係 [#nd0739d1] 昨今、開発寄りなのかも知れない。 -アプリケーションの開発フェーズにおいて[[Docker]]が使われる。 -今後は、コンテナ・ランタイムの多様化が起きると言われている。 ***containerd [#h78f8fe9] デファクト・スタンダードのコンテナ・ランタイム -2016年 --6-8月~ [[Swarm>Docker#u512f6bd]] と Kubernetesのコンテナ・オーケストレーション・ツールの主導権争い。 --10月~ Kubernetesが独自コンテナランタイム([[cri-o>#n37e3d66]])開発を表明 --12月~ 中立的なコンテナ・ランタイムのため、[[Docker]]からcontainerdが分離された。 ***cri-o [#n37e3d66] [[Docker]]に依存しない軽量コンテナ・ランタイム -2017年 --1.0が2017/10/17にリリースされた。 --ランタイムのみなので、[[Docker]]コマンドのような機能は備えていない。 *参考 [#g54270bb] -Kubernetes~ https://ja.wikipedia.org/wiki/Kubernetes -GKEを用いたレガシーシステムからのリプレース事例~ https://lp.google-mkto.com/rs/248-TPC-286/images/Google_Cloud_Kubernetes_Day_Session02.pdf -Kubernetesのしくみ やさしく学ぶ 内部構造とアーキテクチャー~ https://www.slideshare.net/ToruMakabe/kubernetes-120907020 **Qiita [#gd21561e] -今さら人に聞けない Kubernetes とは?~ https://qiita.com/MahoTakara/items/85096f8b2632c802ab22 -構築関連は[[コチラ>Kubernetesの構築#gd21561e]]に移動しました。 **Publickey [#b2ba6395] -Dockerを管理するKubernetesの基本的な動作や仕組みとは?~ Kubernetesを触ってみた。第20回 PaaS勉強会~ https://www.publickey1.jp/blog/14/dockerkubernetes_kubernetes20_paas_1.html -Dockerコンテナ時代の第一章の終わり、そして第二章の展望など~ https://www.publickey1.jp/blog/17/post_265.html ***CRI [#bd0a533b] -Kubernetes、独自のコンテナランタイム「cri-o」開発中。~ コンテナランタイムのインターフェイスを標準化し、~ Dockerだけでなくどんなコンテナランタイムでも対応可能に~ https://www.publickey1.jp/blog/16/kubernetescri-odocker.html -「Kubernetesはオープンソースの~ コンテナオーケストレーションのデファクトになった」と、~ CoreOSがfleetの開発を終了、代わりにKubernetes採用を発表~ https://www.publickey1.jp/blog/17/kubernetescoreosfleetkubernetes.html ***OCI [#y2471083] -Dockerエンジンのコアランタイムが~ 「containerd」として分離、独立したオープンソースプロジェクトに。~ Docker、AWS、Google、IBM、マイクロソフトらが協力して開発推進へ~ https://www.publickey1.jp/blog/16/dockercontainerddockerawsgoogleibm.html -Open Container Initiativeによる~ コンテナランタイムとコンテナイメージの~ 最初の標準化作業が完了、「OCI v1.0」発表~ https://www.publickey1.jp/blog/17/open_container_initiativeoci_v10.html -Kubernetes、Dockerに依存しないKubernetes用の~ 軽量コンテナランタイム「cri-o」正式版1.0リリース~ https://www.publickey1.jp/blog/17/kubernetesdockerkubernetescri-o10.html -事実上の標準コンテナランタイム~ 「containerd」がバージョン1.0に到達~ https://www.publickey1.jp/blog/17/containerd10.html -Kubernetes対応コンテナランタイム「containerd 1.1」正式リリース。~ CRIにネイティブ対応し、Dockerより軽量で高速な動作を実現~ https://www.publickey1.jp/blog/18/kubernetescontainerd_11cridocker.html **IT Search+ [#j81f922c] 【連載】Kubernetes入門 -[1]Kubernetesとは~ https://news.mynavi.jp/itsearch/article/devsoft/4097 -[2]Dockerを触ってみる~ https://news.mynavi.jp/itsearch/article/devsoft/4208 -[[[3]Kubernetesを試す>Kubernetesの構築#i3250356]] -[4]Kubernetesの4つのリソース - Pod/ReplicaSet/Deployment/Service~ https://news.mynavi.jp/itsearch/article/devsoft/4358 -Kubernetesのリソースタイプを体系的に学ぶ --[5] Workloads~ https://news.mynavi.jp/itsearch/article/devsoft/4413 --[6] Discovery & LB~ https://news.mynavi.jp/itsearch/article/devsoft/4459 --[7] Config & Storage~ https://news.mynavi.jp/itsearch/article/devsoft/4516 --[8] Cluster~ https://news.mynavi.jp/itsearch/article/devsoft/4611 --[9] Metadata~ https://news.mynavi.jp/itsearch/article/devsoft/4665 -[10]Kubernetesのアーキテクチャ~ https://news.mynavi.jp/itsearch/article/devsoft/4729 -[[[11]-[13]k8s構築ツールの選択肢>Kubernetesの構築#i3250356]] -[[[14]その他の学習用サービス>Kubernetesの構築#i3250356]] -[15]CI/CDにおける潮流 - CIOpsからGitOpsへ~ https://news.mynavi.jp/itsearch/article/devsoft/5025 -DevOps --[16]Jenkins Xを使ってKubernetesでDevOps~ https://news.mynavi.jp/itsearch/article/devsoft/5079 --[17]「ArgoCD」を使ってKubernetesでDevOps~ https://news.mynavi.jp/itsearch/article/devsoft/5154 --[18]Tektonを使ってKubernetesでDevOps~ https://news.mynavi.jp/itsearch/article/devsoft/5218 --[19]Spinnakerを使ってKubernetesでDevOps~ https://news.mynavi.jp/itsearch/article/devsoft/5311 **Kubernetes [#f9f4c856] -Kubernetes Documentation~ https://kubernetes.io/docs/home/ ***Concepts [#r02d3a19] https://kubernetes.io/docs/concepts/ -Overview -Cluster Architecture -Workloads -Services, Load Balancing, and Networking -Storage -Configuration -Security -Policies -Scheduling -Cluster Administration -Extending Kubernetes ***Kubectl [#l10a8c3a] -kubectl CLI~ https://kubernetes.io/docs/reference/kubectl/ -Kubectl Reference Docs~ https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands ***github.com [#d01789e2] -kubernetes/kubernetes:~ Production-Grade Container Scheduling and Management~ https://github.com/kubernetes/kubernetes **マイクロソフト系技術情報 Wiki [#ke5e4ce1] ***[[Docker Desktop for Windows>https://techinfoofmicrosofttech.osscons.jp/index.php?Docker%20Desktop%20for%20Windows]] [#qb5fcdac] ***[[Azure Kubernetes Service (AKS)>https://techinfoofmicrosofttech.osscons.jp/index.php?Azure%20Kubernetes%20Service%20%28AKS%29]] [#rc6e2b9b]