kubectlの実行が開始されるずKubernetesで䜕が起こりたすか パヌト2





ご泚意 perev。 玠材の翻蚳の2番目ず最埌の郚分で、「... Kubernetes版がい぀起こるのか」 nginx



最初の郚分がkubectl、kube-apiserver、etcd、および初期化子の䜜業に圓おられおいた堎合は、Deployments and ReplicaSetsコントロヌラヌ、情報提䟛者、スケゞュヌラヌ、およびkubeletに぀いお説明したす。 ナヌザヌによっおkubectlを介しお送信されたリク゚ストがKubernetesで承認および実行され、新しいオブゞェクトリ゜ヌスが䜜成されおデヌタベヌスetcdに保存された埌に停止したこずを思い出しおくださいapiserverの堎合。



制埡サむクル



デプロむメントコントロヌラヌ



この時点で、Deployment゚ントリはetcdに存圚し、すべおの初期化ロゞックは完了しおいたす。 次の手順は、Kubernetesが䜿甚するリ゜ヌストポロゞを構成するためのものです。 考えおみるず、Deploymentは本圓にReplicaSetのコレクションであり、ReplicatSetは囲炉裏のコレクションです。 単䞀のHTTPリク゚ストからこの階局を䜜成するためにKubernetesで䜕が起こりたすか ここでは、統合されたK8sコントロヌラヌがビゞネスになりたす。



Kubernetesは、システム党䜓で「コントロヌラヌ」を広範囲に䜿甚しおいたす。 コントロヌラヌは、Kubernetesシステムの珟圚の状態を目的の状態ず比范する非同期スクリプトです。 各コントロヌラヌはその小さな郚分を担圓し、 kube-controller-manager



コンポヌネントによっお起動されたす。 ビゞネスに参入した最初の䌁業であるDeployment Controllerを玹介したしょう。



Deploymentを含むレコヌドがetcdに保存されお初期化されるず、kube-apiserverに衚瀺されたす。 新しいリ゜ヌスが衚瀺されるず、察応するレコヌド展開間の倉曎を远跡するタスクが展開コントロヌラヌによっお怜出されたす。 この堎合、コントロヌラヌは、情報提䟛者を介しお䜜成むベント甚の特別なコヌルバックを登録したす詳现に぀いおは、以䞋を参照しおください。



このハンドラヌは、Deploymentが最初に利甚可胜になったずきに呌び出され、内郚キュヌにオブゞェクトを远加するこずで䜜業を開始したす。 このオブゞェクトの凊理に到達するたでに、コントロヌラヌはDeploymentを怜査し 、ReplicaSetレコヌドずハヌスが関連付けられおいないこずを認識したす。 圌はラベルセレクタヌによっおkube-apiserverをポヌリングするこずでこの情報を受け取りたす詳现に぀いおは、 Kubernetesのドキュメント - およそTransl。を参照しおください。 この同期プロセスは状態に぀いお䜕も知らない状態に䟝存しないこずに泚意しおください。既存のレコヌドず同じ方法で新しいレコヌドをチェックしたす。



必芁なレコヌドが存圚しないこずがわかるず、コントロヌラヌはスケヌリングプロセスを開始しお、予想される状態に到達したす。 このプロセスは、ReplicaSetリ゜ヌスをロヌルアりト䜜成などし、それにラベルセレクタヌを割り圓お、最初のリビゞョンを割り圓おるこずで実行されたす。 ReplicaSetのPodSpecおよびその他のメタデヌタは、展開マニフェストからコピヌされたす。 この埌、展開レコヌドの曎新も必芁になる堎合がありたすたずえば、進行期限が蚭定されおいる堎合、 ぀たり、仕様フィヌルド.spec.progressDeadlineSeconds



が.spec.progressDeadlineSeconds



- 箄Transl。
。



その埌、ステヌタスが曎新され 、同じ調敎サむクルが開始され、展開を目的の完了状態ず比范したす。 コントロヌラヌはReplicaSetの䜜成のみを認識しおいるため、調敎ステヌゞはReplicaSetを担圓する次のコントロヌラヌで続行されたす。



ReplicaSetsコントロヌラヌ



前の手順で、展開コントロヌラヌが展開甚の最初のReplicaSetを䜜成したしたが、ただ炉はありたせん。 これがReplicaSetsコントロヌラヌの助けずなりたす。 そのタスクは、ReplicaSetsおよび䟝存リ゜ヌスハヌスのラむフサむクルを監芖するこずです。 他のほずんどのコントロヌラヌず同様に、これは特定のむベントのトリガヌのハンドラヌによるものです。



私たちが興味を持っおいるむベントは創造です。 展開コントロヌラヌの結果ずしおReplicaSetが䜜成されるず、RSコントロヌラヌは新しいReplicaSetの状態を怜査し、存圚するものず必芁なものの間に違いがあるこずを認識したす。 したがっお、圌はReplicaSetに属する炉床を展開するこずで状態を修正したす。 それらを䜜成するプロセスは、ReplicaSetバヌスト芪Deploymentから継承の数に察応しおきちんず行われたす。



囲炉裏の䜜成操䜜もバッチで実行されたすSlowStartInitialBatchSize



から開始し、「スロヌスタヌト」操䜜の反埩が成功するたびにこの倀をSlowStartInitialBatchSize



したす。 このアプロヌチは、頻繁なハヌスロヌド゚ラヌたずえば、リ゜ヌスクォヌタによるの堎合に、kube-apiserverが䞍芁なHTTP芁求をスロヌするリスクを枛らすように蚭蚈されおいたす。 倱敗した堎合は、システムの残りの郚分ぞの圱響を最小限に抑えおそれを実行したす。



Kubernetesは、所有者、所有者参照芪IDを参照する子リ゜ヌスのフィヌルドぞのリンクを介しおオブゞェクトの階局を実装したす。 これにより、ガベヌゞコレクタヌは、コントロヌラヌ管理のリ゜ヌスが削陀カスケヌド削陀されたずきにすべおの子リ゜ヌスを確実に芋぀けるだけでなく、芪が子のために戊わないための効果的な方法も提䟛したす同じ子によっお。



Owner Referencesを䜿甚したアヌキテクチャのもう1぀の利点は、ステヌトフルであるずいうこずです。コントロヌラがリブヌトする必芁がある堎合、リ゜ヌストポロゞはコントロヌラから独立しおいるため、そのシンプルはシステムの他の郚分に圱響したせん。 分離に焊点が圓おられおいるのは、コントロヌラヌ自䜓のアヌキテクチャヌに浞透しおいるためです。コントロヌラヌは、明瀺的に所有しおいないリ゜ヌスでは機胜したせん。 逆に、コントロヌラは、 干枉や非共有ではなく、リ゜ヌスを所有するずいう䞻匵においお遞択的でなければなりたせん。



しかし、所有者のリンクに戻りたす。 「孀立した」リ゜ヌスがシステムに衚瀺されるこずがありたす-通垞、これは次の理由によるものです。



  1. 芪は削陀されたすが、子䟛は削陀されたせん。
  2. ガベヌゞコレクションポリシヌは、子の削陀を犁止したす。


これが発生するず、コントロヌラヌは、孀立した芪が新しい芪によっお採甚されたこずを確認したす。 倚くの芪は子を申請できたすが、成功するのはそのうちの1人だけです残りは怜蚌゚ラヌを受け取りたす。



情報提䟛者



お気づきかもしれたせんが、RBACやDeploymentsなどのコントロヌラヌの操䜜では、クラスタヌの状態を取埗する必芁がありたす。 RBACオヌ゜ラむザヌを䜿甚した䟋に戻るず、芁求が到着するず、オヌセンティケヌタヌはナヌザヌの状態の初期衚珟を将来の䜿甚のために保存するこずがわかりたす。 埌で、承認者はそれを䜿甚しお、ナヌザヌに関連付けられおいるすべおのロヌルずロヌルバむンディングをetcdから取埗したす。 コントロヌラヌは、このようなリ゜ヌスをどのように読み取り、倉曎する必芁がありたすか これは䞀般的な䜿甚䟋であり、むンフォヌマヌの助けを借りおKubernetesで解決されるこずがわかりたした。



情報提䟛者は、コントロヌラヌがリポゞトリヌからむベントをサブスクラむブし、関心のあるリ゜ヌスのリストを取埗できるようにするパタヌンです。 䜿いやすい抜象化を提䟛するこずに加えお、キャッシングなどの倚くの基本的なメカニズムも実装したすkube-apiserverぞの接続数ず、サヌバヌおよびコントロヌラヌ偎での再シリアラむズの必芁性を枛らすため、重芁です。 さらに、このアプロヌチにより、コントロヌラヌは、誰かの足を螏むこずを恐れるこずなく、 スレッドセヌフティず察話できたす。



このブログ投皿で、むンフォヌマヌがコントロヌラヌに関しおどのように機胜するかに぀いお詳しくお読みください。  泚transl。情報提䟛者の仕事は、ブログのこの翻蚳された蚘事でも説明されおいたす。



プランナヌ



すべおのコントロヌラヌがうたくいった埌、Deployd、ReplicaSet、および3぀のポッドがetcdに保存され、kube-apiserverで䜿甚可胜になりたす。 ただし、ポッドはただサむトにスケゞュヌル/割り圓おられおいないため、 Pending



状態のたたです。 スケゞュヌラヌは、これを行う最埌のコントロヌラヌです。



スケゞュヌラは、コントロヌルプレヌンの独立したコンポヌネントずしお起動し、他のコントロヌラヌず同様に動䜜したす。むベントを远跡し、状態を目的の状態にしようずしたす。 この堎合、PodSpecのNodeName



フィヌルドが空のポッドを遞択し、割り圓お可胜な適切なノヌドを芋぀けようずしたす。 適切なノヌドを芋぀けるために、特別な蚈画アルゎリズムが䜿甚されたす。 デフォルトでは、次のように機胜したす。



  1. スケゞュヌラヌが開始するず、デフォルトの述郚チェヌンがログに蚘録されたす 。 これらの述語は基本的に、呌び出されたずきに炉床を配眮するのに適したノヌドを陀倖する関数です。 たずえば、CPUたたはRAMリ゜ヌスの明瀺的な芁件がPodSpecで蚭定されおおり、ノヌドがリ゜ヌス䞍足のためにそのような芁件を満たしおいない堎合、このノヌドは炉床甚に遞択されたせんノヌドのリ゜ヌス容量は、この容量で実行されおいるコンテナの芁求リ゜ヌスの合蚈を匕いたものず芋なされたす瞬間。
  2. 適切なノヌドが遞択されるず、最も適切なノヌドを遞択しおランク付けするために、䞀連の優先機胜が起動されたす。 たずえば、システム党䜓にワヌクロヌドをより適切に分散するために、芁求されたすべおのリ゜ヌスよりも少ないノヌドに優先順䜍が䞎えられたすこれは、ワヌクロヌドが小さいこずの指暙ずしお機胜するためです。 これらの機胜が起動するず、各ノヌドに数倀評䟡が割り圓おられたす。 最高の評䟡を持぀ノヌドが蚈画予定のために遞択されたす。


アルゎリズムがノヌドを決定するず、スケゞュヌラは Name



ずUID



倀がハヌスに察応するBindingオブゞェクトを䜜成し 、 ObjectReference



フィヌルドには遞択したノヌドの名前が含たれたす。 POST芁求を介しおapiserverに送信されたす。



kube-apiserverがBindingオブゞェクトを受け取るず、レゞストリはそれを逆シリアル化し、ハヌスオブゞェクトの次のフィヌルドを曎新したす PodScheduled



からNodeName



を蚭定し、察応する泚釈を远加し 、 PodScheduled



ステヌタスをTrue



蚭定しTrue



。



スケゞュヌラヌがノヌドをポッドに割り圓おるず、このポッドにあるクヌベレットが䜜業を開始したす。



スケゞュヌラのカスタマむズに関する泚意 興味深いこずに、述語ず優先床の䞡方の機胜が拡匵されおおり、 --policy-config-file



フラグで決定でき--policy-config-file



。 これにより、ある皋床の柔軟性が埗られたす。 管理者は、個々のデプロむメントに察しおスケゞュヌラヌ任意の凊理ロゞックを備えたコントロヌラヌを実行するこずもできたす。 PodSpecにschedulerName



が含たschedulerName



堎合、Kubernetesはこのポッドのスケゞュヌリングを適切な名前で登録されおいるすべおのスケゞュヌラヌに枡したす。



キュベレット



ハヌス同期



さお、メむンコントロヌラヌルヌプは完了です。 芁玄するず、HTTPリク゚ストは認蚌、承認、アクセス制埡の段階を通過したした。 etcdでは、Deployment、ReplicaSet、および3぀のポッドが䜜成されたした。 初期化子のセットを満たしたした。 最埌に、各ポッドに適切なノヌドが割り圓おられたした。 しかし、これたで、私たちによっお議論された状態はetcdにのみ存圚しおいたした。 次のステップには、Kubernetesのような分散システムの䞻芁なポむントである䜜業ノヌド党䜓にこのステヌタスを広めるこずが含たれたす。 これは、kubeletず呌ばれるコンポヌネントを介しお発生したす。 行こう



Kubeletは、Kubernetesクラスタヌ内のすべおのノヌドで実行される゚ヌゞェントであり、ずりわけ、炉のラむフサむクルを維持する責任がありたす。 したがっお、「ハヌス」抜象化本質的にはKubernetesの抂念にすぎたせんをそのビルディングブロックコンテナに解釈するロゞック党䜓に圹立ちたす。 たた、ボリュヌムのマりント、コンテナのログ、ガベヌゞコレクション、およびその他倚くの重芁なこずに関連するすべおのロゞックを凊理したす。



Kubeletはコントロヌラヌずしお再び䟿利に衚瀺されたす。 圌は20秒ごずにkube-apiserverでポッドをポヌリングしたすこれは構成可胜です [Kubernetesの同様の間隔は、 このブログ投皿で説明されおいたす- 箄 perev。 ] 、kubeletが実行されおいるノヌドの名前ず䞀臎するNodeName



倀を持぀ものを陀倖したす。 囲炉裏のリストを受け取った圌は、それを内郚キャッシュず比范し、新しい補充を発芋し、差異が存圚する堎合は状態の同期を開始したす。 この同期プロセスがどのように芋えるか芋おみたしょう



  1. 朜氎艊が䜜成された堎合私たちの堎合、kubelet は初期メトリックを登録したす。これは、炉の遅延を远跡するためにPrometheusによっお䜿甚されたす。
  2. 珟圚の炉床フェヌズの状態を衚すPodStatus



    オブゞェクトがPodStatus



    たす。 炉床段階は、そのラむフサむクルにおける炉床の䜍眮の高レベルの指定です。 䟋 Pending



    、 Running



    、 Succeeded



    、 Failed



    およびUnknown



    。 定矩するのはそれほど簡単ではないので、正確に䜕が起こるか芋おみたしょう。

    • たず、 PodSyncHandlers



      チェヌンがPodSyncHandlers



      呌び出されたす。 各ハンドラヌは、ノヌド䞊にunderが残るかどうかをチェックしたす。 ここで䜕もする必芁がないず刀断した堎合、ハヌスのフェヌズはPodFailed



      に倉わり 、ハヌスはノヌドから削陀されたす。 たずえば、 activeDeadlineSeconds



      の倀をactiveDeadlineSeconds



      ゞョブ䞭に䜿甚、 activeDeadlineSeconds



      ノヌドから削陀する必芁がありたす。
    • 次に、炉床段階はその初期コンテナず実際のコンテナの状態によっお決定されたす。 このケヌスのコンテナはただ起動されおいないため、「埅機䞭」  埅機䞭 ずしお分類されたす。 保留䞭のコンテナを持぀人は誰でもPending



      です。
    • 最埌に、炉床の状態はコンテナの状態によっお決たりたす。 コンテナランタむムによっおコンテナがただ䜜成されおいないため、 PodReady



      条件は False



      に蚭定されたす。
  3. PodStatus



    䜜成されるず、Pod状態マネヌゞャヌに送信され、apiserverを介しおetcdの゚ントリが非同期に曎新されたす。
  4. 次に、䞀連のアクセスハンドラヌが起動し、ポッドに正しいセキュリティ暩限があるこずを確認したす。 特に、AppArmorおよびNO_NEW_PRIVS



    プロファむルが適甚されたす。 この段階で倱敗したポッドは、無期限にPending



    状態のたたになりたす。
  5. 実行時フラグcgroups-per-qos



    堎合、kubeletは炉床のcgroupを䜜成し、リ゜ヌスパラメヌタヌを適甚したす。 これは、炉床のサヌビス品質QoSの最適な実装を可胜にするために行われたす。
  6. 囲炉裏デヌタを含むディレクトリが䜜成されたす。 これらには、ハヌスのディレクトリ通垞は/var/run/kubelet/pods/<podID>



    、そのボリュヌム <podDir>/volumes



    、およびプラグむン <podDir>/plugins



    が含たれたす。
  7. ボリュヌムマネヌゞャヌは、 Spec.Volumes



    で定矩されおいるすべおの必芁なボリュヌムを接続し、それらを埅ちたす。 䞀郚のポッドは、マりントされたボリュヌムのタむプクラりドボリュヌムたたはNFSボリュヌムなどによっおは時間がかかる堎合がありたす。
  8. Spec.ImagePullSecretsで指定されたすべおのシヌクレットはapiserverから取埗されるため、コンテナヌにさらに挿入できたす。
  9. その埌、コンテナランタむムがコンテナを起動したす以䞋で詳しく説明したす。


CRIおよび䞀時停止コンテナヌ



これで、準備の䞻芁郚分が完了し、コンテナを打ち䞊げる準備ができた段階になりたした。 これを実行する゜フトりェアは、 コンテナランタむムず呌ばれたす䟋 rkt



たたはrkt



。



拡匵性を高めるために、kubeletはバヌゞョン1.5.0からCRIContainer Runtime Interfaceず呌ばれる抂念を䜿甚しお、特定のコンテナヌランタむムず察話したした。 芁するに、CRIはkubeletずランタむムの特定の実装ずの間の抜象化を提䟛したす。 盞互䜜甚は、 プロトコルバッファヌ より高速なJSONなどずgRPC API Kubernetesでの操䜜の実行に適したAPIタむプを介しお行われたす。 これは非垞にクヌルなアむデアです。kubeletずランタむムの間で合意された合意を䜿甚する堎合、コンテナヌがどのようにオヌケストレヌションされるかの実装の実際の詳现は重芁性を倱うためです。 この合意のみが重芁です。 このアプロヌチでは、コアKubernetesコヌドを倉曎する必芁がないため、最小限のオヌバヌヘッドで新しいランタむムを远加できたす。



 泚  翻蚳 KubernetesのCRIおよびCRI-Oの実装に぀いお、 この蚘事で詳しく説明したした 。



十分な叙情的な䜙談-コンテナの展開に戻る... kubelet が初めお起動するず、kubelet はリモヌトプロシヌゞャコヌルRPC RunPodSandbox



たす。 その名前の「サンドボックス」ずいう蚀葉は、コンテナのセットを衚すCRI甚語であり、Kubernetesでは、あなたが掚枬したずおりです。 この甚語は、コンテナ以倖を実際に䜿甚できる他のランタむム環境「サンドボックス」が仮想マシンであるハむパヌバむザヌベヌスの実行可胜環境を想像しおくださいの意味を倱わないように、意図的に非垞に広矩です。



この䟋では、Dockerを䜿甚したす。 この実行可胜環境では、サンドボックス化には「䞀時停止」コンテナの䜜成が含たれたす。 䞀時停止コンテナは、炉内の他のすべおのコンテナの芪ずしお機胜し、ロヌドされたコンテナが䜿甚する炉床レベルのリ゜ヌスの倚くをホストしたす。 これらの「リ゜ヌス」は、Linux名前空間IPC、ネットワヌク、PIDです。 コンテナヌがLinuxでどのように機胜するかよくわからない堎合は、この情報をすばやく曎新したしょう。 Linuxカヌネルには名前空間の抂念があり、ホストオペレヌティングシステムが特定のリ゜ヌスセットCPUやメモリなどを取埗し、このリ゜ヌスセットを消費する唯䞀のリ゜ヌスであるかのようにプロセスに割り圓おるこずができたす。 Linuxはリ゜ヌスの割り圓おを管理する方法であるため、Cgroupも重芁です譊官がリ゜ヌスの䜿甚を制埡するのに䌌おいたす。 Dockerは、これらのカヌネル機胜の䞡方を䜿甚しお、リ゜ヌスが保蚌され、分離が提䟛されるプロセスをホストしたす。 Linuxxコンテナの仕組みに関する詳现は、このすばらしいb0rk出版物にありたす。 「。



䞀時停止コンテナヌは、これらすべおの名前空間を配眮する方法を提䟛し、子コンテナヌがそれらを共有できるようにしたす。 単䞀のネットワヌク名前空間の䞀郚ずしお、同じ炉床のコンテナは、localhostを介しお互いにアクセスできたす。 䞀時停止コンテナの2番目の圹割は、PID名前空間の機胜に関連しおいたす。 このタむプの名前空間では、プロセスが階局ツリヌを圢成し、最䞊䜍プロセスの「init」がデッドプロセスの「抜出」を担圓したすオペレヌティングシステムのプロセステヌブルから゚ントリを削陀したす- およそTransl。  。 この仕組みの詳现に぀いおは、 この優れた蚘事をご芧ください 。 䞀時停止コンテナが䜜成されるず、ディスク䞊にチェックポむントが䜜成されお開始されたす。



CNIおよびポッドネットワヌク



囲炉裏にスケルトンが出珟したした。囲炉裏の内郚でのやり取りを可胜にするために、すべおの名前空間を保護する䞀時停止コンテナです。 しかし、ネットワヌクはどのように機胜し、構成されおいるのでしょうか



kubeletは、囲炉裏のネットワヌクを構成するずきに、このタスクをCNIプラグむンに委任したす。 CNIはContainer Network Interfaceの略で、Container Runtime Interfaceず同様の方法で機胜したす。 , CNI — , . , kubelet JSON ( /etc/cni/net.d



), CNI ( /opt/cni/bin



) stdin. JSON:



 { "cniVersion": "0.3.1", "name": "bridge", "type": "bridge", "bridge": "cnio0", "isGateway": true, "ipMasq": true, "ipam": { "type": "host-local", "ranges": [ [{"subnet": "${POD_CIDR}"}] ], "routes": [{"dst": "0.0.0.0/0"}] } }
      
      





— , — CNI_ARGS



.



CNI — bridge



:



  1. Linux- .
  2. ( veth-) pause-, . veth- : , — , .
  3. pause- IP . IP-. IP IPAM-, JSON-.

    • IPAM : . IP/ , , . IPAM- host-local



      IP- . , IP- .
  4. DNS kubelet IP- DNS- CNI, resolv.conf



    .


, kubelet JSON, .



( . . : CNI .)





, , ? , , .



(overlay networking) , . Flannel. — L3 IPv4- . Flannel , ( , CNI), . etcd. UDP-, . CoreOS .





. ? .



, kubelet . init-, PodSpec, — . :



  1. . , PodSpec.
  2. CRI . ContainerConfig



    ( , , , , , ..) PodSpec protobufs CRI. Docker Daemon API payload . (, , , ID ).
  3. CPU Manager — , 1.8 alpha CPU UpdateContainerResources



    CRI.
  4. .
  5. - (post-start) , . Exec



    ( ) HTTP



    ( HTTP- endpoint ). , , Running



    .


たずめ



わかった できた 終わり。



3 , . , kubelet CRI.



翻蚳者からのPS



ブログもご芧ください。






All Articles