Skip to content

Kubernetes 拡張メカニズム クイズ ​

Kubernetes extensions

元の 20 の問題トピックは、現在の API と挙動に照らしてレビュー済みです。

1. CRD は何のためのものですか? ​

回答を表示

Kubernetes API にカスタム resource 型と入力 schema を登録するためのものです。CRD それ自体が workload の挙動を実装するわけではありません。

2. reconciliation loop は何を行いますか? ​

回答を表示

繰り返し発生する event、再起動、競合を処理しながら、観測された状態と望ましい状態を一致させます。状態が既に一致している場合は不要な更新を避けます。

3. Operator を定義するものは何で、その限界は何ですか? ​

回答を表示

Operator はカスタム API と controller を使ってドメイン知識を実装します。それらを作成しただけでは、backup、failover、upgrade が安全になるわけではありません。

4. mutating webhook は何を返せますか? ​

回答を表示

リクエストを許可/拒否し、必要に応じて JSONPatch を伴う AdmissionReview response を返します。リクエストの UID/version は保持し、patch のバイト列は Base64 でエンコードします。

5. Filter plugin は何を行いますか? ​

回答を表示

Pod の要件を満たせない node を除外します。filter を通過しても binding や実行が完了するわけではありません。

6. aggregation と CRD はどう違いますか? ​

回答を表示

CRD は既存の API server のカスタム resource ストレージ/バリデーションを利用します。aggregation は別の server に委譲するため、TLS、認証、認可、discovery、ストレージの運用が必要になります。

7. finalizer は何を提供しますか? ​

回答を表示

削除が完了する前に、controller がクリーンアップを終える機会を与えます。文字列自体が何らかのクリーンアップを実行するわけではなく、調査せずに削除すると外部 resource が残る可能性があります。

8. PostBind はいつ実行されますか? ​

回答を表示

binding が成功した後の情報提供用のステージであり、あらゆるエラーからの復旧手段ではありません。失敗/キャンセルされた予約に対しては Unreserve などの経路を実装します。

9. 現在の Istio における Pod 単位の injection はどのように制御しますか? ​

回答を表示

Pod または workload の Pod template の label に sidecar.istio.io/inject を設定します。古い annotation を既定として使うのではなく、namespace の injection/revision label と優先順位を確認します。

10. Score の結果はどのように使われますか? ​

回答を表示

正規化と plugin の重みを組み合わせて、実行可能な node を順位付けします。同点時の選択や失敗時の処理も scheduler の挙動に含まれます。

11. CRD の schema と必須 field はどこに置きますか? ​

回答を表示

spec.versions[].schema.openAPIV3Schema 配下に置きます。トップレベルの required: [spec] と spec 内の required: [image] は、それぞれ異なる条件を強制します。

12. ownerReferences について何を確認しなければなりませんか? ​

回答を表示

owner の UID、namespace/スコープ、既存の controller 所有権を確認します。GC は propagation/finalizer に依存し、名前が一致するだけでは他の workload を引き取る権限にはなりません。

13. VAP と validating webhook はどう違いますか? ​

回答を表示

ValidatingAdmissionPolicy は 1.30 以降 stable であり、CEL をプロセス内で評価します。webhook はリモート呼び出し、TLS、可用性の管理が必要です。VAP でもスコープと validationActions を指定する binding が必要です。

14. controller-runtime は何を提供しますか? ​

回答を表示

manager、client/cache、reconciliation のセットアップ、leader election を提供します。カスタム API 型、scheme、RBAC、ドメインロジックは提供しないため、ライブラリと Kubernetes Go モジュールのバージョンを揃えてください。

15. conversion webhook は何のためのものですか? ​

回答を表示

CRD の API version 間で表現を変換するためのものです。served/storage version、storedVersions、意味の保持を確認します。すべての CRD に conversion webhook が必要なわけではありません。

16. image を必須とし、replicas を 1 から 5 の範囲に制限する WebApp CRD を書いてください。 ​

回答を表示

これには spec 自体も必須とし、status/scale の経路を分離することが必要です。実際の status.replicas と selector は controller が設定しなければなりません。

yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: webapps.apps.example.com
spec:
  group: apps.example.com
  names:
    kind: WebApp
    plural: webapps
    singular: webapp
    shortNames: [wa]
  scope: Namespaced
  versions:
    - name: v1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          type: object
          required: [spec]
          properties:
            spec:
              type: object
              required: [image]
              properties:
                replicas:
                  type: integer
                  default: 1
                  minimum: 1
                  maximum: 5
                image:
                  type: string
                  minLength: 1
                port:
                  type: integer
                  default: 8080
                  minimum: 1
                  maximum: 65535
            status:
              type: object
              properties:
                replicas:
                  type: integer
                availableReplicas:
                  type: integer
                selector:
                  type: string
                observedGeneration:
                  type: integer
                  format: int64
      subresources:
        status: {}
        scale:
          specReplicasPath: .spec.replicas
          statusReplicasPath: .status.replicas
          labelSelectorPath: .status.selector

17. Deployment を検証する webhook を production に限定するにはどうしますか? ​

回答を表示

apps/v1 の deployments の CREATE/UPDATE にマッチさせ、kubernetes.io/metadata.name: production を選択します。実際の検証用 server/Service/path、CA bundle、failurePolicy、timeoutSeconds、sideEffects、admissionReviewVersions を設定します。ガイドの /mutate handler は Deployment の validator ではありません。replica の上限だけを制限する場合は、その VAP/binding の例を使い、deployments と deployments/scale の両方にマッチさせて、HPA や kubectl scale による更新が制限を回避できないようにします。

18. 堅牢な reconciliation の流れを説明してください。 ​

回答を表示

NotFound は正常完了として扱います。削除中は冪等なクリーンアップを完了させてから、自身の finalizer のみを削除します。外部 resource を作成する前に finalizer を永続化し、子 resource の所有権を確認して、所有する field を reconcile します。競合はリトライし、変化した観測状態を patch します。擬似コードを実行可能な controller と称してはいけません。

19. 分散データベースの Operator を設計する際に必要なものは何ですか? ​

回答を表示

schema と workload の作成に加えて、primary の fencing、quorum、replica 同期、backup/WAL リカバリのテスト、ストレージのライフサイクル、移行の互換性、障害を設計します。Service、StatefulSet、CronJob を作成するだけではデータの安全性は確立されません。

20. カスタム scheduler はどのように実装し検証すべきですか? ​

回答を表示

対象となる Kubernetes マイナーバージョンの framework インターフェースに対して plugin をコンパイル/登録します。profile 名と Pod の schedulerName を揃え、Filter/Score と予約、permit、binding の失敗をテストします。YAML だけでは plugin をインストールできません。単純な zone 要件であれば、まず node affinity を検討してください。

ドキュメントに質問する

Enter で送信、Shift+Enter で改行します。