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

ご泚意 perev。 この資料は「䜕が起こるず... Kubernetes゚ディション」ずRackspaceのJamie Hannafordによっお曞かれたもので、倚くのKubernetesメカニズムの優れた䟋です。 -システム、䜜業のアルゎリズム、およびそのコンポヌネントの盞互接続。 蚘事党䜓が非垞に膚倧であるため、その翻蚳は2぀の郚分に分かれおいたす。 最初は、kubectl、kube-apiserver、etcd、および初期化子の䜜業を扱いたす。



PS䜜成者が参照する行番号の関連性が長期間保持されるように、マスタヌブランチのコヌドぞの元のリンクの䞀郚は翻蚳時に最新のものに眮き換えられたした。







Kubernetesクラスタヌにnginxをデプロむするずしたす。 タヌミナルに次のようなものを入力したす。



kubectl run --image=nginx --replicas=3
      
      





...そしおEnterを抌したす。 数秒で、すべおの䜜業ノヌドにnginxが分散された3぀のポッドが衚瀺されたす。 それは動䜜したす-たるで魔法のように、それは玠晎らしいです しかし、実際に䜕が起こるのでしょうか



Kubernetesの優れた機胜の1぀は、このシステムがナヌザヌフレンドリヌなAPIを通じおむンフラストラクチャ内のワヌクロヌドの展開を凊理する方法です。 すべおの耇雑さは、単玔な抜象化によっお隠されおいたす。 ただし、K8がもたらす䟡倀を完党に実珟するには、内郚のキッチンを理解するこずが圹立ちたす。 この蚘事では、クラむアントからkubeletぞのリク゚ストのラむフサむクル党䜓を玹介したす。必芁に応じお、゜ヌスコヌドを参照しお䜕が起きおいるかを説明したす。



これは生きた文曞です。 改善たたは曞き換えが必芁な堎合は、倉曎を歓迎したす もちろん、 GitHubの元の英語の蚘事に぀いお-箄Transl。



kubectl



怜蚌ずゞェネレヌタヌ



それでは始めたしょう。 タヌミナルでEnterキヌを抌すだけです。 そしお今䜕



たず、kubectlはクラむアント偎の怜蚌を実行したす。 圌は、機胜しおいないリク゚ストサポヌトされおいないリ゜ヌスの䜜成、 間違った名前の画像の䜿甚などがすぐに䞭断され、kube-apiserverに送信されないようにしたす。 これにより、䞍芁なワヌクロヌドが削枛され、システムのパフォヌマンスが向䞊したす。



怜蚌埌、kubectlはkube-apiserverに送信されるHTTPリク゚ストの䜜成を開始したす。 Kubernetesシステムで状態にアクセスたたは倉曎しようずするすべおの詊みは、APIサヌバヌを通過し、APIサヌバヌはetcdず通信したす。 kubectlも䟋倖ではありたせん。 HTTPリク゚ストを䜜成するために、kubectlはいわゆるゞェネレヌタヌを䜿甚したす。これは、シリアル化を実装する抜象化です。



ここでは、 kubectl run



䜿甚するず、Deploymentsだけでなく、倚くのタむプのリ゜ヌスを指定できるこずは明らかではないかもしれたせん。 これが機胜するために 、ゞェネレヌタ名が--generator



フラグで特に指定されおいない限り、kubectlはリ゜ヌスのタむプを蚈算したす。



たずえば、 --restart-policy=Always



リ゜ヌスは展開ずしお扱われ、 --restart-policy=Never



リ゜ヌスはポッドず芋なされたす。 Kubectlは、コマンドの蚘録ロヌルアりトたたは監査など、他のアクションを実行する必芁があるかどうか、およびこのコマンドが --dry-run



フラグの存圚によりテスト実行であるかどうかも確認したす。



Deploymentを䜜成するこずがわかったので、kubectlはDeploymentV1Beta1



ゞェネレヌタヌを䜿甚しお、提䟛されたパラメヌタヌからランタむムオブゞェクトを䜜成したす。 ランタむムオブゞェクトは、リ゜ヌスの総称です。



APIグルヌプずバヌゞョン管理亀枉



先に進む前に、KubernetesはAPIグルヌプごずに分類されたバヌゞョン管理されたAPIを䜿甚しおいるこずに泚意するこずが重芁です。 APIグルヌプは、同様のリ゜ヌスを分類し、それらずのやり取りを容易にするように蚭蚈されおいたす。 さらに、単䞀のモノリシックAPIの代替ずしおも適しおいたす。 DeploymentのAPIグルヌプはapps



ず呌ばれ、最新バヌゞョンはv1beta2



です。 これは、Deployment apiVersion: apps/v1beta2



の最䞊郚で指定したapiVersion: apps/v1beta2



。



 泚の翻蚳  Kubernetes 1.8の発衚で説明したように、プロゞェクトは珟圚、「ワヌクロヌド」に関連するデプロむメントやその他のAPIを含む新しいワヌクロヌドAPIグルヌプの䜜成に取り組んでいたす。



䞀般に、kubectlはランタむムオブゞェクトを生成した埌、察応するAPIグルヌプずバヌゞョンの怜玢を開始し 、目的のバヌゞョンのクラむアントを収集したす-リ゜ヌスのさたざたなRESTセマンティクスを考慮したす。 「 バヌゞョンネゎシ゚ヌション 」ず呌ばれるこの怜出フェヌズでは、リモヌトAPIの/apis



のコンテンツをスキャンしお、可胜なすべおのAPIグルヌプを取埗したす。 kube-apiserverはこのパス /apis



に沿っお構造ドキュメントOpenAPI圢匏を生成するため、クラむアントは簡単に怜出を実行できたす。



パフォヌマンスを向䞊させるために、kubectl は OpenAPIスキヌムも~/.kube/schema



ディレクトリにキャッシュし ~/.kube/schema



。 実際のAPI怜出を確認するには、このディレクトリを削陀し、 -v



フラグの最倧倀を指定しおコマンドを実行しおみおください。 APIバヌゞョンを芋぀けようずしおいるすべおのHTTPリク゚ストが衚瀺されたす。 そしお、それらはたくさんありたす



最埌のステップは、 HTTPリク゚ストを送信するこずです。 それが完了し、正垞な応答が受信されるず、kubectlは優先出力圢匏を考慮しお正垞なメッセヌゞを衚瀺したす。



クラむアント認蚌



最埌のステップでは、クラむアント認蚌に蚀及したせんでしたHTTP芁求を送信する前に発生したす-それも考慮したす。



kubectlリク゚ストを正垞に送信するには、認蚌する必芁がありたす。 ナヌザヌ資栌情報は、ほずんどの堎合ディスクに保存されおいるkubeconfig



ファむルに保存されたすが、別の堎所に配眮するこずもできたす。 それを怜玢するために、kubectlは次のこずを行いたす。





ファむルの解析埌、珟圚のコンテキスト、珟圚のクラスタヌ、および珟圚のナヌザヌの認蚌情報が決定されたす。 ナヌザヌがフラグを通じお特別な倀 --username



などを指定した堎合、それらに優先順䜍が䞎えられ、 kubeconfig



指定された倀を䞊曞きしたす。 情報が受信されるず、kubectlはクラむアント構成をセットアップし、HTTPリク゚ストのニヌズに適したものにしたす。





kube-apiserver



認蚌



リク゚ストが送信されたした。 次は Kube-apiserverが登堎したす。 前述のように、kube-apiserverは、クラむアントずシステムコンポヌネントがクラスタヌの状態を保存および取埗するために䜿甚するメむンむンタヌフェむスです。 この機胜を実行するには、芁求元を怜蚌し、芁求元ず䞀臎するこずを確認する必芁がありたす。 このプロセスは認蚌ず呌ばれたす。



apiserverはリク゚ストをどのように認蚌したすか サヌバヌは最初に起動するずきに、ナヌザヌが提䟛するすべおのコン゜ヌルフラグをチェックし、適切な認蚌システムのリストを収集したす。 䟋に぀いお考えおみたしょう --client-ca-file



が枡された堎合、 --client-ca-file



オヌセンティ--client-ca-file



が远加されたす。 --token-auth-file



が指定されおいる堎合、トヌクン認蚌システムがリストに远加されたす。 芁求が受信されるたびに、認蚌者のチェヌンが1぀正垞に機胜するたで実行されたす。



  1. x509ハンドラヌは、HTTP芁求が蚌明機関のルヌト蚌明曞によっお眲名されたTLSキヌで暗号化されおいるこずを確認したす。
  2. トヌクンハンドラヌは、提䟛されたトヌクン Authorization



    HTTPヘッダヌで定矩されおいるが--token-auth-file



    ディレクティブで指定されたディスク䞊のファむルに存圚するこずを確認したす。
  3. 同様に、basicauthハンドラヌは 、HTTP芁求の基本認蚌の資栌情報がロヌカルデヌタず䞀臎するこずを確認したす。


どの認蚌子も成功しなかった堎合、芁求は倱敗し、集玄゚ラヌが返されたす。 認蚌が成功するず、 Authorization



ヘッダヌがリク゚ストから削陀され、ナヌザヌ情報がそのコンテキストに远加されたす。 これにより、埌続の手順承認および蚱可コントロヌラヌなどで以前に確立されたナヌザヌIDにアクセスできたす。



ログむン



さお、リク゚ストが送信されたした。kube-apiserverは、自分が玹介者であるこずを確認したした。 なんお安心 ただし、それだけではありたせん。 私たちは自分自身を玹介する人かもしれたせんが、この操䜜を実行する暩利はありたすか IDずアクセス暩は同じものではありたせん。 続行するには、kube-apiserverが承認する必芁がありたす。



kube-apiserverが認蚌を実行する方法は認蚌に非垞に䌌おいたす。フラグ倀から、各着信芁求に䜿甚される認蚌者のチェヌンを収集したす。 すべおの承認者がリク゚ストを拒吊するず、リク゚ストはForbidden



レスポンスで終了し、そこで停止したす。 少なくずも1人の承認者がリク゚ストを承認するず、さらに先に進みたす。



Kubernetes v1.8リリヌスに含たれる承認者の䟋





それぞれのAuthorize



メ゜ッドを芋お、どのように機胜するかを確認しおください。



アクセス制埡



OK、kube-apiserverによっお認蚌および承認されおいたす。 残っおいるものは䜕ですか Kube-apiserver自䜓が私たちを信頌し、継続するこずを蚱可したすが、Kubernetesのシステムの他の郚分には、蚱可されおいるものず蚱可されおいないものに぀いおの独自の深い確信があるかもしれたせん。 これがアドミッションコントロヌラヌの出番です。



ナヌザヌが暩利を持っおいるかどうかの質問に承認が答えた堎合、アドミッションコントロヌラヌは、クラスタヌ内のより広い範囲の期埅ずルヌルぞの準拠の芁求をチェックしたす。 これらは、オブゞェクトがetcdに転送される前の最埌の制埡の芁塞であり、システム内の残りのチェックを担圓したす。これは、アクションが予期しない結果たたはネガティブな結果をもたらさないこずを確認するこずを目的ずしおいたす。



これらのコントロヌラヌの動䜜原理はオヌセンティケヌタヌずオヌ゜ラむザヌに䌌おいたすが、1぀の違いがありたすアドミッションコントロヌラヌの堎合、コントロヌラヌチェヌンの単䞀の障害でこのチェヌンを䞭断し、リク゚ストを倱敗ずしお認識できたす。



アドミッションコントロヌラのアヌキテクチャは、拡匵性の促進に重点を眮いおいたす。 各コントロヌラヌはplugin/pkg/admission



ディレクトリにplugin/pkg/admission



ずしお保存され、小さなむンタヌフェむスのニヌズを満たすように䜜成されたす。 それぞれがメむンのKubernetesバむナリにコンパむルされたす。



通垞、アドミッションコントロヌラは、リ゜ヌス管理、セキュリティ、デフォルト蚭定、および参照敎合性に分類されたす。 リ゜ヌス管理コントロヌラヌの䟋を次に瀺したす。





etcd



この時点で、Kubernetesは着信リク゚ストを完党に承認し、先に進むこずを蚱可したした。 次のステップは、kube-apiserverがHTTPリク゚ストをデシリアラむズし、そこからランタむムオブゞェクトを䜜成しkubectlゞェネレヌタヌの動䜜の逆のようなもの、デヌタストアを保存するこずです。 それを詳しく芋おみたしょう。



kube-apiserverは、リク゚ストを受け入れるずきに䜕をすべきかをどのように知っおいたすか このため、芁求の凊理の前に、かなり耇雑な䞀連の手順が続きたす。 最初から芋おみたしょう-バむナリファむルが最初に起動されたずき



  1. kube-apiserverバむナリを実行するず 、サヌバヌチェヌンが䜜成され、Kubernetes apiserver集玄が有効になりたす。 これは倚くのAPIサヌバヌをサポヌトするための基瀎ですこれに぀いおは心配するこずはできたせん。
  2. これが発生するず、汎甚APIサヌバヌが䜜成され、デフォルトの実装ずしお機胜したす。
  3. 生成されたOpenAPIスキヌマは、apiserver構成に入力されたす。
  4. 次に、kube-apiserverは、スキヌムで定矩されたすべおのAPIグルヌプを順番に凊理し、それらのそれぞれに察しおストレヌゞプロバむダヌをセットアップし、 汎甚ストレヌゞ抜象化ずしお機胜したす。 Kube-apiserverは、リ゜ヌスの状態にアクセスするか、リ゜ヌスの状態を倉曎するず、それず察話したす。
  5. 各APIグルヌプに぀いお、グルヌプのすべおのバヌゞョンが順番に゜ヌトされ、各HTTPルヌトぞのREST察応が確立されたす。 これにより、kube-apiserverはク゚リを照合し、結果にロゞックを委任できたす。
  6. 特定のケヌスでは、 POSTハンドラヌが登録され、リ゜ヌス䜜成ハンドラヌに委任されたす。


この時点で、kube-apiserverはどのルヌトが存圚するかを認識し、リク゚ストが䞀臎したずきにどのハンドラヌずストレヌゞプロバむダヌを呌び出す必芁があるかを瀺す内郚マッピングを持っおいたす。 HTTPリク゚ストを受け取ったずしたす



  1. ハンドラヌのチェヌンがリク゚ストずパタヌンの䞀臎登録枈みルヌトを芋぀けるこずができる堎合、このルヌトに登録されおいる目的のハンドラヌが呌び出されたす それ以倖の堎合は、パスベヌスのハンドラヌが呌び出されたす /apis



    呌び出されたずきに同じこずが起こりたす。 このパスに登録されおいるハンドラヌがない堎合、not foundハンドラヌが呌び出され、404が返されたす。
  2. 幞いなこずに、 createHandler



    ずいう登録枈みのルヌトがcreateHandler



    たす。 圌は䜕をしおいたすか たず、HTTPリク゚ストをデコヌドし、提䟛されたJSONデヌタが目的のバヌゞョンのAPIからのリ゜ヌスに察する期埅ず䞀臎するこずを確認するなど、基本的な怜蚌を実行したす。
  3. 監査ず最終入堎がありたす。
  4. リ゜ヌスは、ストレヌゞプロバむダヌぞの委任によっおetcdに保存されたす。 通垞、etcdのキヌは<namespace>/<name>



    ずしお衚され<namespace>/<name>



    が、これはカスタマむズ可胜です。
  5. 䜜成䞭の゚ラヌはすべおキャッチされ、最埌にストレヌゞプロバむダヌがget



    呌び出しを行っお、オブゞェクトが実際に䜜成されたこずを確認したす。 次に、䜜成埌䜜成埌に割り圓おられたすべおのハンドラヌず、远加のファむナラむズが必芁な堎合はデコレヌタヌを呌び出したす。
  6. HTTPリク゚ストが䜜成され、返信されたす。


たくさんのステップ このようなapiserverをフォロヌするのは驚くべきこずです。実際にどれだけの䜜業を行うかを理解しおいるからです。 そのため、芁玄するず、展開リ゜ヌスはetcdに存圚するようになりたした。 しかし、そこに眮くだけでは十分ではありたせん-この段階ではただ衚瀺されたせん...



初期化子



オブゞェクトがデヌタりェアハりスに栌玍されるず、apiserverは完党に衚瀺されず、 初期化子  初期 化子のセットを実行するたでスケゞュヌラヌに分類されたせん。 初期化子は、リ゜ヌスの皮類に関連付けられたコントロヌラヌであり、リ゜ヌスが倖郚で䜿甚可胜になる前にそのリ゜ヌスでロゞックを実行したす。 リ゜ヌスタむプに初期化子が登録されおいない堎合、この手順はスキップされ、リ゜ヌスはすぐに衚瀺されたす。



倚くのブログで曞かれおいるように、これは䞀般的なブヌトストラップ操䜜を実行できる匷力な機胜です。 䟋は次のずおりです。





initializerConfiguration



オブゞェクトを䜿甚するず、特定のタむプのリ゜ヌスに察しお実行するむニシャラむザヌを決定できたす。 囲炉裏を䜜成するたびにむニシャラむザを実行したいず想像しおください。 次に、次のようなこずを行いたす。



 apiVersion: admissionregistration.k8s.io/v1alpha1 kind: InitializerConfiguration metadata: name: custom-pod-initializer initializers: - name: podimage.example.com rules: - apiGroups: - "" apiVersions: - v1 resources: - pods
      
      





この構成を䜜成した埌、 custom-pod-initializer



が各ポッドの埅機フィヌルド metadata.initializers.pending



に远加されたす。 初期化コントロヌラヌは既にデプロむされおおり、新しいポッドのクラスタヌを定期的にスキャンし始めたす。 初期化子は、埅機フィヌルドにその名前぀たり、初期化子を発芋するず、そのアクションを実行したす。 完了するず、圌は名前をりェむティングリストから削陀したす。 リストの最初に名前があるむニシャラむザヌのみがリ゜ヌスを管理できたす。 すべおの初期化子が完了し、埅機リストが空になるず、オブゞェクトは初期化されたず芋なされたす。



ほずんどの読者は、朜圚的な問題に気付いおいるかもしれたせん。 kube-apiserverがただリ゜ヌスを衚瀺しおいない堎合、ナヌザヌ空間のコントロヌラヌはどのようにリ゜ヌスを凊理できたすか このために、kube-apiserverには特別なリク゚ストパラメヌタヌ?includeUninitialized



があり、初期化されおいないオブゞェクトを含むすべおのオブゞェクトを返すこずができたす。



翻蚳者からのPS



近日䞭に蚘事の第2郚を公開したす... このリンクで公開したす。 DeploymentsおよびReplicaSetsコントロヌラヌ、情報提䟛者、スケゞュヌラヌ、kubeletの䜜業に぀いお説明したす。



ブログもご芧ください。






All Articles