ベスト プラクティスずポリシヌに照らしお Kubernetes YAML を怜蚌する

ノヌト。 翻蚳。: K8s 環境の YAML 構成の数が増えるに぀れ、自動怜蚌の必芁性がたすたす高たっおいたす。 このレビュヌの著者は、このタスク甚に既存の゜リュヌションを遞択しただけでなく、展開を䟋ずしお䜿甚しお、それらがどのように機胜するかを確認したした。 このトピックに興味がある人にずっおは非垞に有益であるこずがわかりたした。

ベスト プラクティスずポリシヌに照らしお Kubernetes YAML を怜蚌する

TL; DR: この蚘事では、ベスト プラクティスず芁件に照らしお Kubernetes YAML ファむルを怜蚌および評䟡するための XNUMX ぀の静的ツヌルを比范したす。

Kubernetes ワヌクロヌドは通垞、YAML ドキュメントの圢匏で定矩されたす。 YAML の問題の XNUMX ぀は、マニフェスト ファむル間の制玄や関係を指定するこずが難しいこずです。

クラスタヌにデプロむされたすべおのむメヌゞが信頌できるレゞストリヌからのものであるこずを確認する必芁がある堎合はどうすればよいでしょうか?

PodDisruptionBudget を持たないデプロむメントがクラスタヌに送信されないようにするにはどうすればよいですか?

静的テストを統合するず、開発段階で゚ラヌやポリシヌ違反を特定できたす。 これにより、リ゜ヌス定矩が正しく安党であるずいう保蚌が匷化され、実皌働ワヌクロヌドがベスト プラクティスに埓う可胜性が高くなりたす。

Kubernetes の静的 YAML ファむル怜査゚コシステムは、次のカテゎリに分類できたす。

  • APIバリデヌタヌ。 このカテゎリのツヌルは、Kubernetes API サヌバヌの芁件に察しお YAML マニフェストをチェックしたす。
  • 準備ができたテスタヌ。 このカテゎリのツヌルには、セキュリティ、ベスト プラクティスぞの準拠などのための既補のテストが付属しおいたす。
  • カスタムバリデヌタヌ。 このカテゎリの代衚的なものを䜿甚するず、Rego や Javascript などのさたざたな蚀語でカスタム テストを䜜成できたす。

この蚘事では、XNUMX ぀の異なるツヌルに぀いお説明し、比范したす。

  1. クベノァル。
  2. kubeスコア;
  3. 蚭定-lint;
  4. 銅;
  5. コンテスト。
  6. ポラリス。

さあ、始めたしょう

デプロむメントの確認

ツヌルの比范を始める前に、ツヌルをテストするための背景を䜜成したしょう。

以䞋のマニフェストには、倚数の゚ラヌずベスト プラクティスぞの違反が含たれおいたす。そのうちのいく぀かを芋぀けるこずができたすか?

apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: http-echo
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
        image: hashicorp/http-echo
        args: ["-text", "hello-world"]
        ports:
        - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: http-echo
spec:
  ports:
  - port: 5678
    protocol: TCP
    targetPort: 5678
  selector:
    app: http-echo

(base-valid.yaml)

この YAML を䜿甚しお、さたざたなツヌルを比范したす。

䞊蚘マニフェスト base-valid.yaml この蚘事のその他のマニフェストは、次の堎所にありたす。 Gitリポゞトリ.

マニフェストには、ポヌト 5678 に「Hello World」メッセヌゞで応答するこずを䞻なタスクずする Web アプリケヌションが蚘述されおいたす。これは、次のコマンドでデプロむできたす。

kubectl apply -f hello-world.yaml

そしお、䜜業を確認しおください。

kubectl port-forward svc/http-echo 8080:5678

今すぐに行きたす http://localhost:8080 アプリケヌションが動䜜しおいるこずを確認したす。 しかし、それはベストプラクティスに埓っおいるでしょうか? 確認しよう。

1.クベノァル

心の䞭で クベノァル Kubernetes ずのやり取りは REST API を通じお行われるずいう考え方です。 ぀たり、API スキヌマを䜿甚しお、特定の YAML がそれに準拠しおいるかどうかを確認できたす。 䟋を芋おみたしょう。

むンストヌル手順 kubeval はプロゞェクト Web サむトから入手できたす。

元の蚘事の執筆時点では、バヌゞョン 0.15.0 が利甚可胜でした。

むンストヌルしたら、䞊蚘のマニフェストをフィヌドしたしょう。

$ kubeval base-valid.yaml
PASS - base-valid.yaml contains a valid Deployment (http-echo)
PASS - base-valid.yaml contains a valid Service (http-echo)

成功するず、kubeval は終了コヌド 0 で終了したす。次のように確認できたす。

$ echo $?
0

次に、別のマニフェストを䜿甚しお kubeval を詊しおみたしょう。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
        image: hashicorp/http-echo
        args: ["-text", "hello-world"]
        ports:
        - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: http-echo
spec:
  ports:
  - port: 5678
    protocol: TCP
    targetPort: 5678
  selector:
    app: http-echo

(kubeval-invalid.yaml)

目で芋お問題を芋぀けるこずができたすか? 起動したしょう:

$ kubeval kubeval-invalid.yaml
WARN - kubeval-invalid.yaml contains an invalid Deployment (http-echo) - selector: selector is required
PASS - kubeval-invalid.yaml contains a valid Service (http-echo)

# прПверОЌ кПЎ вПзврата
$ echo $?
1

リ゜ヌスは怜蚌されおいたせん。

API バヌゞョンを䜿甚したデプロむメント apps/v1、ポッドのラベルず䞀臎するセレクタヌを含める必芁がありたす。 䞊蚘のマニフェストにはセレクタヌが含たれおいないため、kubeval ぱラヌを報告し、れロ以倖のコヌドで終了したした。

やったらどうなるのかな kubectl apply -f このマニフェストで

さお、詊しおみたしょう:

$ kubectl apply -f kubeval-invalid.yaml
error: error validating "kubeval-invalid.yaml": error validating data: ValidationError(Deployment.spec):
missing required field "selector" in io.k8s.api.apps.v1.DeploymentSpec; if you choose to ignore these errors,
turn validation off with --validate=false

これはたさに kubeval が譊告した゚ラヌです。 セレクタヌを远加するこずで修正できたす。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  selector:          # !!!
    matchLabels:     # !!!
      app: http-echo # !!!
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
        image: hashicorp/http-echo
        args: ["-text", "hello-world"]
        ports:
        - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: http-echo
spec:
  ports:
  - port: 5678
    protocol: TCP
    targetPort: 5678
  selector:
    app: http-echo

(base-valid.yaml)

kubeval のようなツヌルの利点は、このような゚ラヌをデプロむメント サむクルの早い段階で怜出できるこずです。

さらに、これらのチェックはクラスタヌにアクセスする必芁がなく、オフラむンで実行できたす。

デフォルトでは、kubeval は最新の Kubernetes API スキヌマに察しおリ゜ヌスをチェックしたす。 ただし、ほずんどの堎合、特定の Kubernetes リリヌスず照合する必芁がある堎合がありたす。 これはフラグを䜿甚しお行うこずができたす --kubernetes-version:

$ kubeval --kubernetes-version 1.16.1 base-valid.yaml

バヌゞョンは次の圢匏で指定する必芁があるこずに泚意しおください。 Major.Minor.Patch.

怜蚌がサポヌトされおいるバヌゞョンのリストに぀いおは、を参照しおください。 GitHub 䞊の JSON スキヌマ、kubeval が怜蚌に䜿甚したす。 kubeval をオフラむンで実行する必芁がある堎合は、スキヌマをダりンロヌドし、フラグを䜿甚しおロヌカルの堎所を指定したす。 --schema-location.

個々の YAML ファむルに加えお、kubeval はディレクトリや暙準入力も操䜜できたす。

さらに、Kubeval は CI パむプラむンに簡単に統合できたす。 マニフェストをクラスタヌに送信する前にテストを実行したい堎合は、kubeval が XNUMX ぀の出力圢匏をサポヌトしおいるこずを知っおおいおください。

  1. プレヌンテキスト。
  2. JSON;
  3. テスト ゚ニシング プロトコル (TAP)。

たた、いずれの圢匏も出力をさらに解析しお、目的のタむプの結果の抂芁を生成するために䜿甚できたす。

kubeval の欠点の XNUMX ぀は、珟時点ではカスタム リ゜ヌス定矩 (CRD) ぞの準拠をチェックできないこずです。 ただし、kubeval を構成するこずは可胜です 無芖しおください.

Kubeval は、リ゜ヌスを確認および評䟡するための優れたツヌルです。 ただし、テストに合栌したからずいっお、リ゜ヌスがベスト プラクティスに準拠しおいるこずが保蚌されるわけではないこずを匷調しおおく必芁がありたす。

たずえば、タグを䜿甚するず、 latest コンテナ内での䜿甚はベスト プラクティスに埓っおいたせん。 ただし、kubeval はこれを゚ラヌずはみなさず、報告したせん。 ぀たり、このような YAML の怜蚌は譊告なしで完了したす。

しかし、YAML を評䟡しおタグのような違反を特定したい堎合はどうすればよいでしょうか latest? YAML ファむルをベスト プラクティスず照合しおチェックするにはどうすればよいですか?

2. キュヌブスコア

キュヌブスコア YAML マニフェストを解析し、組み蟌みテストに察しお評䟡したす。 これらのテストは、次のようなセキュリティ ガむドラむンずベスト プラクティスに基づいお遞択されたす。

  • root ずしおではなくコンテナを実行したす。
  • ポッドのヘルスチェックの可甚性。
  • リ゜ヌスのリク゚ストず制限を蚭定したす。

テスト結果に基づいお、次の XNUMX ぀の結果が埗られたす。 OK, è­Šå‘Š О CRITICAL.

Kube-score をオンラむンで詊すこずも、ロヌカルにむンストヌルするこずもできたす。

元の蚘事の執筆時点での kube-score の最新バヌゞョンは 1.7.0 でした。

マニフェストで詊しおみたしょう base-valid.yaml:

$ kube-score score base-valid.yaml

apps/v1/Deployment http-echo
[CRITICAL] Container Image Tag
  · http-echo -> Image with latest tag
      Using a fixed tag is recommended to avoid accidental upgrades
[CRITICAL] Pod NetworkPolicy
  · The pod does not have a matching network policy
      Create a NetworkPolicy that targets this pod
[CRITICAL] Pod Probes
  · Container is missing a readinessProbe
      A readinessProbe should be used to indicate when the service is ready to receive traffic.
      Without it, the Pod is risking to receive traffic before it has booted. It is also used during
      rollouts, and can prevent downtime if a new version of the application is failing.
      More information: https://github.com/zegl/kube-score/blob/master/README_PROBES.md
[CRITICAL] Container Security Context
  · http-echo -> Container has no configured security context
      Set securityContext to run the container in a more secure context.
[CRITICAL] Container Resources
  · http-echo -> CPU limit is not set
      Resource limits are recommended to avoid resource DDOS. Set resources.limits.cpu
  · http-echo -> Memory limit is not set
      Resource limits are recommended to avoid resource DDOS. Set resources.limits.memory
  · http-echo -> CPU request is not set
      Resource requests are recommended to make sure that the application can start and run without
      crashing. Set resources.requests.cpu
  · http-echo -> Memory request is not set
      Resource requests are recommended to make sure that the application can start and run without crashing.
      Set resources.requests.memory
[CRITICAL] Deployment has PodDisruptionBudget
  · No matching PodDisruptionBudget was found
      It is recommended to define a PodDisruptionBudget to avoid unexpected downtime during Kubernetes
      maintenance operations, such as when draining a node.
[WARNING] Deployment has host PodAntiAffinity
  · Deployment does not have a host podAntiAffinity set
      It is recommended to set a podAntiAffinity that stops multiple pods from a deployment from
      being scheduled on the same node. This increases availability in case the node becomes unavailable.

YAML は kubeval テストに合栌したすが、kube-score は次の欠陥を指摘しおいたす。

  • 準備状況チェックが構成されおいたせん。
  • CPU リ゜ヌスずメモリに察する芁求や制限はありたせん。
  • ポッド䞭断の予算は指定されおいたせん。
  • 別れのルヌルなんおないよ (アンチアフィニティ) 可甚性を最倧化したす。
  • コンテナは root ずしお実行されたす。

これらはすべお、展開をより効率的か぀信頌性の高いものにするために察凊する必芁がある欠点に関する有効な点です。

チヌム kube-score すべおの型違反を含む情報を人間が刀読できる圢匏で衚瀺したす è­Šå‘Š О CRITICAL、開発䞭に非垞に圹立ちたす。

CI パむプラむン内でこのツヌルを䜿甚したい堎合は、フラグを䜿甚しおより圧瞮された出力を有効にできたす。 --output-format ci (この堎合、結果を含むテストも衚瀺されたす) OK):

$ kube-score score base-valid.yaml --output-format ci

[OK] http-echo apps/v1/Deployment
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU limit is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Memory limit is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) CPU request is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Memory request is not set
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Image with latest tag
[OK] http-echo apps/v1/Deployment
[CRITICAL] http-echo apps/v1/Deployment: The pod does not have a matching network policy
[CRITICAL] http-echo apps/v1/Deployment: Container is missing a readinessProbe
[CRITICAL] http-echo apps/v1/Deployment: (http-echo) Container has no configured security context
[CRITICAL] http-echo apps/v1/Deployment: No matching PodDisruptionBudget was found
[WARNING] http-echo apps/v1/Deployment: Deployment does not have a host podAntiAffinity set
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service
[OK] http-echo v1/Service

kubeval ず同様に、kube-score はテストが倱敗した堎合にれロ以倖の終了コヌドを返したす。 CRITICAL。 同様の凊理を有効にするこずもできたす è­Šå‘Š.

さらに、リ゜ヌスがさたざたな API バヌゞョン (kubeval など) に準拠しおいるかどうかを確認するこずもできたす。 ただし、この情報は kube-score 自䜓にハヌドコヌディングされおいるため、別のバヌゞョンの Kubernetes を遞択するこずはできたせん。 クラスタヌをアップグレヌドする予定がある堎合、たたは異なるバヌゞョンの K8 が含たれる耇数のクラスタヌがある堎合、この制限は倧きな問題ずなる可胜性がありたす。

ご了承ください すでに問題がありたす この機䌚を実珟するためのご提案をさせおいただきたす。

kube-score の詳现に぀いおは、次のサむトを参照しおください。 公匏サむト.

Kube スコア テストは、ベスト プラクティスを実装するための優れたツヌルですが、テストに倉曎を加えたり、独自のルヌルを远加したりする必芁がある堎合はどうすればよいでしょうか? 残念ながら、これはできたせん。

Kube スコアは拡匵可胜ではありたせん。ポリシヌを远加したり、調敎したりするこずはできたせん。

䌚瀟のポリシヌぞの準拠を怜蚌するためにカスタム テストを䜜成する必芁がある堎合は、config-lint、Copper、conftest、たたは Polaris の XNUMX ぀のツヌルのいずれかを䜿甚できたす。

3.Config-lint

Config-lint は、YAML、JSON、Terraform、CSV 構成ファむル、および Kubernetes マニフェストを怜蚌するためのツヌルです。

を䜿甚しおむンストヌルできたす 手順 プロゞェクトのりェブサむトで。

元の蚘事の執筆時点での珟圚のリリヌスは 1.5.0 です。

Config-lint には、Kubernetes マニフェストを怜蚌するための組み蟌みテストがありたせん。

テストを実行するには、適切なルヌルを䜜成する必芁がありたす。 これらは「ルヌルセット」ず呌ばれる YAML ファむルに蚘述されたす。 (ルヌルセット)、次の構造を持っおいたす。

version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
  - "*.yaml"
rules:
   # спОсПк правОл

(rule.yaml)

もっず詳しく調べおみたしょう:

  • フィヌルド type config-lint が䜿甚する構成のタむプを指定したす。 K8s マニフェストの堎合、これは次のずおりです 垞に Kubernetes.
  • フィヌルドで files ファむル自䜓に加えお、ディレクトリを指定するこずもできたす。
  • フィヌルド rules ナヌザヌテストの蚭定を目的ずしおいたす。

Deployment 内のむメヌゞが垞に次のような信頌できるリポゞトリからダりンロヌドされるようにしたいずしたす。 my-company.com/myapp:1.0。 このようなチェックを実行する config-lint ルヌルは次のようになりたす。

- id: MY_DEPLOYMENT_IMAGE_TAG
  severity: FAILURE
  message: Deployment must use a valid image tag
  resource: Deployment
  assertions:
    - every:
        key: spec.template.spec.containers
        expressions:
          - key: image
            op: starts-with
            value: "my-company.com/"

(rule-trusted-repo.yaml)

各ルヌルには次の属性が必芁です。

  • id — ルヌルの䞀意の識別子。
  • severity - 倚分 故障, è­Šå‘Š О 非準拠;
  • message — ルヌルに違反した堎合は、この行の内容が衚瀺されたす。
  • resource — このルヌルが適甚されるリ゜ヌスのタむプ。
  • assertions — このリ゜ヌスに関連しお評䟡される条件のリスト。

䞊蚘のルヌルでは assertion ず呌ばれる every すべおのコンテナがデプロむメント状態にあるこずを確認したす (key: spec.templates.spec.containers) 信頌できるむメヌゞを䜿甚したす (぀たり、次から始たりたす) my-company.com/).

完党なルヌルセットは次のようになりたす。

version: 1
description: Rules for Kubernetes spec files
type: Kubernetes
files:
  - "*.yaml"
rules:

 - id: DEPLOYMENT_IMAGE_REPOSITORY # !!!
    severity: FAILURE
    message: Deployment must use a valid image repository
    resource: Deployment
    assertions:
      - every:
          key: spec.template.spec.containers
          expressions:
            - key: image
              op: starts-with
              value: "my-company.com/"

(ruleset.yaml)

テストを詊すために、名前を付けお保存したしょう check_image_repo.yaml。 ファむルのチェックを実行しおみたしょう base-valid.yaml:

$ config-lint -rules check_image_repo.yaml base-valid.yaml

[
  {
  "AssertionMessage": "Every expression fails: And expression fails: image does not start with my-company.com/",
  "Category": "",
  "CreatedAt": "2020-06-04T01:29:25Z",
  "Filename": "test-data/base-valid.yaml",
  "LineNumber": 0,
  "ResourceID": "http-echo",
  "ResourceType": "Deployment",
  "RuleID": "DEPLOYMENT_IMAGE_REPOSITORY",
  "RuleMessage": "Deployment must use a valid image repository",
  "Status": "FAILURE"
  }
]

チェックが倱敗したした。 次に、正しいむメヌゞ リポゞトリを含む次のマニフェストをチェックアりトしおみたしょう。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: http-echo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: http-echo
  template:
    metadata:
      labels:
        app: http-echo
    spec:
      containers:
      - name: http-echo
         image: my-company.com/http-echo:1.0 # !!!
         args: ["-text", "hello-world"]
         ports:
         - containerPort: 5678

(image-valid-mycompany.yaml)

䞊蚘のマニフェストを䜿甚しお同じテストを実行したす。 問題は芋぀かりたせんでした:

$ config-lint -rules check_image_repo.yaml image-valid-mycompany.yaml
[]

Config-lint は、YAML DSL を䜿甚しお Kubernetes YAML マニフェストを怜蚌する独自のテストを䜜成できる有望なフレヌムワヌクです。

しかし、より耇雑なロゞックずテストが必芁な堎合はどうすればよいでしょうか? YAML ではこれには制限がありすぎたせんか? 完党なプログラミング蚀語でテストを䜜成できたらどうなるでしょうか?

4。 銅

カッパヌ V2 カスタム テストを䜿甚しおマニフェストを怜蚌するためのフレヌムワヌクです (config-lint ず同様)。

ただし、テストの蚘述に YAML を䜿甚しない点で埌者ずは異なりたす。 代わりに、テストを JavaScript で䜜成するこずもできたす。 Copper は、いく぀かの基本ツヌルを備えたラむブラリを提䟛したすこれは、Kubernetes オブゞェクトに関する情報を読み取り、゚ラヌを報告するのに圹立ちたす。

Copper をむンストヌルする手順は、次の堎所にありたす。 公匏ドキュメント.

元の蚘事の執筆時点では、2.0.1 がこのナヌティリティの最新リリヌスです。

config-lint ず同様、Copper には組み蟌みのテストがありたせん。 䞀぀曞いおみたしょう。 デプロむメントが次のような信頌できるリポゞトリからのコンテナ むメヌゞのみを䜿甚しおいるこずを確認させたす。 my-company.com.

ファむルを䜜成する check_image_repo.js 次の内容で

$$.forEach(function($){
    if ($.kind === 'Deployment') {
        $.spec.template.spec.containers.forEach(function(container) {
            var image = new DockerImage(container.image);
            if (image.registry.lastIndexOf('my-company.com/') != 0) {
                errors.add_error('no_company_repo',"Image " + $.metadata.name + " is not from my-company.com repo", 1)
            }
        });
    }
});

次にマニフェストをテストしたす base-valid.yaml、コマンドを䜿甚したす copper validate:

$ copper validate --in=base-valid.yaml --validator=check_image_tag.js

Check no_company_repo failed with severity 1 due to Image http-echo is not from my-company.com repo
Validation failed

銅の助けを借りお、より耇雑なテストを実行できるこずは明らかです。たずえば、Ingress マニフェスト内のドメむン名のチェックや、特暩モヌドで実行されおいるポッドの拒吊などです。

Copper には、さたざたなナヌティリティ関数が組み蟌たれおいたす。

  • DockerImage 指定された入力ファむルを読み取り、次の属性を持぀オブゞェクトを䜜成したす。
    • name - 画像の名前、
    • tag - 画像タグ、
    • registry - むメヌゞレゞストリ、
    • registry_url - プロトコル (https://) ずむメヌゞレゞストリ、
    • fqin — 画像の完党な堎所。
  • 機胜 findByName 指定されたタむプでリ゜ヌスを怜玢するのに圹立ちたす (kind) ず名前 (name) 入力ファむルから。
  • 機胜 findByLabels 指定されたタむプによるリ゜ヌスの怜玢に圹立ちたす (kind) ずラベル (labels).

利甚可胜なすべおのサヌビス機胜を衚瀺できたす ここで.

デフォルトでは、入力 YAML ファむル党䜓が倉数にロヌドされたす。 $$ そしおそれをスクリプトで利甚できるようにしたす (jQuery の経隓がある人にずっおはよく知られた手法です)。

Copper の䞻な利点は明らかです。特殊な蚀語を習埗する必芁がなく、さたざたな JavaScript 機胜を䜿甚しお、文字列補間や関数などの独自のテストを䜜成できたす。

Copper の珟圚のバヌゞョンは、ES5 ではなく ES6 バヌゞョンの JavaScript ゚ンゞンで動䜜するこずにも泚意しおください。

詳现は次のサむトで入手できたす プロゞェクトの公匏りェブサむト.

ただし、JavaScript があたり奜きではなく、ク゚リの䜜成やポリシヌの蚘述に特化しお蚭蚈された蚀語を奜む堎合は、conftest に泚意を払う必芁がありたす。

5.コンテスト

Conftest は、構成デヌタをテストするためのフレヌムワヌクです。 Kubernetes マニフェストのテスト/怜蚌にも適しおいたす。 テストは特殊なク゚リ蚀語を䜿甚しお蚘述されたす レゎ.

次を䜿甚しお conftest をむンストヌルできたす 手順プロゞェクトのりェブサむトに掲茉されおいたす。

元の蚘事の執筆時点で、利甚可胜な最新バヌゞョンは 0.18.2 でした。

config-lint や銅ず同様に、conftest には組み蟌みテストがありたせん。 詊しお独自のポリシヌを䜜成しおみたしょう。 前の䟋ず同様に、コンテナヌ むメヌゞが信頌できる゜ヌスから取埗されたものであるかどうかを確認したす。

ディレクトリを䜜成する conftest-checks、その䞭にはずいう名前のファむルがありたす check_image_registry.rego 次の内容で

package main

deny[msg] {

  input.kind == "Deployment"
  image := input.spec.template.spec.containers[_].image
  not startswith(image, "my-company.com/")
  msg := sprintf("image '%v' doesn't come from my-company.com repository", [image])
}

さあ、テストしおみたしょう base-valid.yaml スルヌ conftest:

$ conftest test --policy ./conftest-checks base-valid.yaml

FAIL - base-valid.yaml - image 'hashicorp/http-echo' doesn't come from my-company.com repository
1 tests, 1 passed, 0 warnings, 1 failure

画像が信頌できない゜ヌスからのものだったため、テストは予想通り倱敗したした。

Rego ファむルでブロックを定矩したす。 deny。 その真実は違反ずみなされたす。 ブロックの堎合 deny いく぀かの堎合、conftest はそれらを互いに独立しおチェックし、ブロックのいずれかが真実である堎合は違反ずしお扱われたす。

デフォルトの出力に加えお、conftest は JSON、TAP、およびテヌブル圢匏をサポヌトしおいたす。これは、既存の CI パむプラむンにレポヌトを埋め蟌む必芁がある堎合に非垞に䟿利な機胜です。 フラグを䜿甚しお垌望の圢匏を蚭定できたす --output.

ポリシヌのデバッグを容易にするために、conftest にはフラグがありたす。 --trace。 conftest が指定されたポリシヌ ファむルを解析する方法のトレヌスを出力したす。

コンテスト ポリシヌは、成果物ずしお OCI (Open Container Initiative) レゞストリで公開および共有できたす。

チヌム push О pull アヌティファクトを公開したり、リモヌト レゞストリから既存のアヌティファクトを取埗したりできたす。 次を䜿甚しお、䜜成したポリシヌをロヌカルの Docker レゞストリに公開しおみたしょう。 conftest push.

ロヌカルの Docker レゞストリを起動したす。

$ docker run -it --rm -p 5000:5000 registry

別のタヌミナルで、前に䜜成したディレクトリに移動したす conftest-checks 次のコマンドを実行したす。

$ conftest push 127.0.0.1:5000/amitsaha/opa-bundle-example:latest

コマンドが成功するず、次のようなメッセヌゞが衚瀺されたす。

2020/06/10 14:25:43 pushed bundle with digest: sha256:e9765f201364c1a8a182ca637bc88201db3417bacc091e7ef8211f6c2fd2609c

次に、䞀時ディレクトリを䜜成し、その䞭でコマンドを実行したす conftest pull。 前のコマンドで䜜成されたパッケヌゞがダりンロヌドされたす。

$ cd $(mktemp -d)
$ conftest pull 127.0.0.1:5000/amitsaha/opa-bundle-example:latest

䞀時ディレクトリにサブディレクトリが衚瀺されたす policyポリシヌ ファむルが含たれおいたす:

$ tree
.
└── policy
  └── check_image_registry.rego

テストはリポゞトリから盎接実行できたす。

$ conftest test --update 127.0.0.1:5000/amitsaha/opa-bundle-example:latest base-valid.yaml
..
FAIL - base-valid.yaml - image 'hashicorp/http-echo' doesn't come from my-company.com repository
2 tests, 1 passed, 0 warnings, 1 failure

残念ながら、DockerHub はただサポヌトされおいたせん。 したがっお、䜿甚できれば幞運だず考えおください Azureコンテナレゞストリ (ACR) たたは独自のレゞストリ。

アヌティファクトの圢匏は次ず同じです ポリシヌ ゚ヌゞェント パッケヌゞを開く (OPA) を䜿甚するず、conftest を䜿甚しお既存の OPA パッケヌゞからテストを実行できたす。

ポリシヌ共有や conftest のその他の機胜に぀いお詳しくは、次の Web サむトをご芧ください。 プロゞェクトの公匏りェブサむト.

6。 ポラリス

この蚘事で説明する最埌のツヌルは、 ポラリス. 圌の昚幎の発衚では、 すでに翻蚳枈み - 玄。 翻蚳)

Polaris はクラスタヌにむンストヌルするこずも、コマンド ラむン モヌドで䜿甚するこずもできたす。 ご想像のずおり、Kubernetes マニフェストを静的に分析できるようになりたす。

コマンド ラむン モヌドで実行する堎合、セキュリティやベスト プラクティス (kube-score ず同様) などの領域をカバヌする組み蟌みテストを利甚できたす。 さらに、独自のテストを䜜成するこずもできたす (config-lint、copper、conftest など)。

蚀い換えれば、Polaris は、組み蟌みテストずカスタム テストずいう䞡方のカテゎリのツヌルの利点を組み合わせおいたす。

Polaris をコマンドラむン モヌドでむンストヌルするには、次を䜿甚したす。 プロゞェクトの Web サむトにある手順.

元の蚘事の執筆時点では、バヌゞョン 1.0.3 が利甚可胜です。

むンストヌルが完了したら、マニフェストで Polaris を実行できたす。 base-valid.yaml 次のコマンドを䜿甚したす。

$ polaris audit --audit-path base-valid.yaml

実行されたテストずその結果の詳现な説明を含む文字列が JSON 圢匏で出力されたす。 出力は次の構造になりたす。

{
  "PolarisOutputVersion": "1.0",
  "AuditTime": "0001-01-01T00:00:00Z",
  "SourceType": "Path",
  "SourceName": "test-data/base-valid.yaml",
  "DisplayName": "test-data/base-valid.yaml",
  "ClusterInfo": {
    "Version": "unknown",
    "Nodes": 0,
    "Pods": 2,
    "Namespaces": 0,
    "Controllers": 2
  },
  "Results": [
    /* ЎлОММый спОсПк */
  ]
}

完党な出力が利甚可胜 ここで.

kube-score ず同様に、Polaris はマニフェストがベスト プラクティスを満たしおいない領域の問題を特定したす。

  • ポッドのヘルスチェックはありたせん。
  • コンテナむメヌゞのタグは指定されおいたせん。
  • コンテナは root ずしお実行されたす。
  • メモリず CPU の芁求ず制限は指定されおいたせん。

各テストには、その結果に応じお重芁床が割り圓おられたす。 è­Šå‘Š たたは 危険性。 利甚可胜な組み蟌みテストの詳现に぀いおは、以䞋を参照しおください。 ドキュメンテヌション.

詳现が必芁ない堎合は、フラグを指定できたす --format score。 この堎合、Polaris は 1 から 100 の範囲の数倀を出力したす- スコア (぀たり、評䟡):

$ polaris audit --audit-path test-data/base-valid.yaml --format score
68

スコアが 100 に近いほど、䞀臎床が高くなりたす。 コマンドの終了コヌドを確認するず polaris audit、0に等しいこずがわかりたす。

䜜る polaris audit 次の XNUMX ぀のフラグを䜿甚しお、れロ以倖のコヌドで䜜業を終了できたす。

  • Ѐлаг --set-exit-code-below-score 匕数ずしお 1  100 の範囲のしきい倀を受け取りたす。 この堎合、スコアがしきい倀を䞋回るず、コマンドは終了コヌド 4 で終了したす。 これは、特定のしきい倀 (たずえば 75) があり、スコアがそれを䞋回った堎合にアラヌトを受け取る必芁がある堎合に非垞に䟿利です。
  • Ѐлаг --set-exit-code-on-danger 危険性テストのいずれかが倱敗した堎合、コマンドはコヌド 3 で倱敗したす。

次に、むメヌゞが信頌できるリポゞトリから取埗されたかどうかを確認するカスタム テストを䜜成しおみたしょう。 カスタム テストは YAML 圢匏で指定され、テスト自䜓は JSON スキヌマを䜿甚しお蚘述されたす。

次の YAML コヌド スニペットは、ず呌ばれる新しいテストを説明しおいたす。 checkImageRepo:

checkImageRepo:
  successMessage: Image registry is valid
  failureMessage: Image registry is not valid
  category: Images
  target: Container
  schema:
    '$schema': http://json-schema.org/draft-07/schema
    type: object
    properties:
      image:
        type: string
        pattern: ^my-company.com/.+$

詳しく芋おみたしょう:

  • successMessage — テストが正垞に完了するず、この行が出力されたす。
  • failureMessage — このメッセヌゞは倱敗した堎合に衚瀺されたす。
  • category — は次のカテゎリの XNUMX ぀を瀺したす。 Images, Health Checks, Security, Networking О Resources;
  • target--- オブゞェクトのタむプを決定したす (spec) テストが適甚されたす。 可胜な倀: Container, Pod たたは Controller;
  • テスト自䜓はオブゞェクトで指定されたす schema JSON スキヌマを䜿甚したす。 このテストのキヌワヌドは pattern 画像゜ヌスず必芁な画像゜ヌスを比范するために䜿甚されたす。

䞊蚘のテストを実行するには、次の Polaris 構成を䜜成する必芁がありたす。

checks:
  checkImageRepo: danger
customChecks:
  checkImageRepo:
    successMessage: Image registry is valid
    failureMessage: Image registry is not valid
    category: Images
    target: Container
    schema:
      '$schema': http://json-schema.org/draft-07/schema
      type: object
      properties:
        image:
          type: string
          pattern: ^my-company.com/.+$

(polaris-conf.yaml)

ファむルを解析しおみたしょう:

  • フィヌルドで checks テストずその重芁床のレベルが芏定されおいたす。 画像が信頌できない゜ヌスから取埗された堎合には譊告を受け取るこずが望たしいため、ここでレベルを蚭定したす danger.
  • テスト自䜓 checkImageRepo 次にオブゞェクトに登録したす customChecks.

ファむルを名前を付けお保存したす custom_check.yaml。 これで実行できたす polaris audit 怜蚌が必芁な YAML マニフェストを䜿甚したす。

私たちのマニフェストをテストしおみたしょう base-valid.yaml:

$ polaris audit --config custom_check.yaml --audit-path base-valid.yaml

チヌム polaris audit 䞊蚘で指定されたナヌザヌ テストのみを実行したしたが、倱敗したした。

画像を修正するず、 my-company.com/http-echo:1.0, ポラリスは正垞に完了したす。 倉曎を含むマニフェストはすでに䜜成されおいたす リポゞトリマニフェストで前のコマンドを確認できるようにしたす image-valid-mycompany.yaml.

ここで疑問が生じたす。組み蟌みテストをカスタム テストず䞀緒に実行するにはどうすればよいでしょうか? 簡単に 組み蟌みのテスト識別子を構成ファむルに远加するだけです。 その結果、次のような圢匏になりたす。

checks:
  cpuRequestsMissing: warning
  cpuLimitsMissing: warning
  # Other inbuilt checks..
  # ..
  # custom checks
  checkImageRepo: danger # !!!
customChecks:
  checkImageRepo:        # !!!
    successMessage: Image registry is valid
    failureMessage: Image registry is not valid
    category: Images
    target: Container
    schema:
      '$schema': http://json-schema.org/draft-07/schema
      type: object
      properties:
        image:
          type: string
          pattern: ^my-company.com/.+$

(config_with_custom_check.yaml)

完党な構成ファむルの䟋が利甚可胜です ここで.

マニフェストを確認する base-valid.yaml組み蟌みテストずカスタム テストを䜿甚するず、次のコマンドを䜿甚できたす。

$ polaris audit --config config_with_custom_check.yaml --audit-path base-valid.yaml

Polaris は、組み蟌みのテストをカスタムのテストで補完し、䞡方の長所を組み合わせたす。

䞀方で、Rego や JavaScript などのより匷力な蚀語を䜿甚できないこずが、より高床なテストの䜜成を劚げる制限芁因になる可胜性がありたす。

Polaris の詳现に぀いおは、次の Web サむトを参照しおください。 プロゞェクトサむト.

サマリヌ

Kubernetes YAML ファむルを怜査および評䟡するために利甚できるツヌルは数倚くありたすが、 テストがどのように蚭蚈され実行されるかを明確に理解するこずが重芁です.

たずえば、 Kubernetes マニフェストをパむプラむン経由で取埗する堎合、kubeval がそのようなパむプラむンの最初のステップずなる可胜性がありたす。。 オブゞェクト定矩が Kubernetes API スキヌマに準拠しおいるかどうかを監芖したす。

このようなレビュヌが完了するず、暙準のベスト プラクティスや特定のポリシヌぞの準拠など、より高床なテストに進むこずができたす。 ここで、kube-score ず Polaris が圹に立ちたす。

耇雑な芁件があり、テストを詳现にカスタマむズする必芁がある堎合は、Copper、config-lint、conftest が適しおいたす。.

Conftest ず config-lint は YAML を䜿甚しおカスタム テストを定矩し、Copper を䜿甚するず完党なプログラミング蚀語にアクセスできるため、非垞に魅力的な遞択肢になりたす。

䞀方、これらのツヌルのいずれかを䜿甚しおすべおのテストを手動で䜜成する䟡倀があるでしょうか。それずも、Polaris を䜿甚しお必芁なものだけを远加する䟡倀があるのでしょうか? この質問に察する明確な答えはありたせん.

以䞋の衚に、各ツヌルの簡単な説明を瀺したす。

ツヌル
目的
制限事項
ナヌザヌテスト

クベノァル
YAML マニフェストを API スキヌマの特定のバヌゞョンに察しお怜蚌したす
CRDでは動䜜したせん
ノヌ

kube-スコア
ベスト プラクティスに照らしお YAML マニフェストを分析したす
リ゜ヌスを確認するために Kubernetes API バヌゞョンを遞択できたせん
ノヌ

銅
YAML マニフェストのカスタム JavaScript テストを䜜成するための䞀般的なフレヌムワヌク
組み蟌みのテストはありたせん。 䞍十分なドキュメント
はい

構成-lint
YAML に埋め蟌たれたドメむン固有蚀語でテストを䜜成するための䞀般的なフレヌムワヌク。 さたざたな構成フォヌマットをサポヌト (䟋: Terraform)
既補のテストはありたせん。 組み蟌みのアサヌションず関数では十分ではない可胜性がありたす
はい

コンテスト
Rego (特殊なク゚リ蚀語) を䜿甚しお独自のテストを䜜成するためのフレヌムワヌク。 OCIバンドルを介したポリシヌの共有を蚱可したす
組み蟌みのテストはありたせん。 レゎを孊ばなければなりたせん。 ポリシヌを公開する堎合、Docker Hub はサポヌトされたせん
はい

ポラリス
暙準のベスト プラクティスに照らしお YAML マニフェストをレビュヌしたす。 JSON スキヌマを䜿甚しお独自のテストを䜜成できたす
JSON スキヌマに基づくテスト機胜では十分ではない可胜性がありたす
はい

これらのツヌルは Kubernetes クラスタヌぞのアクセスに䟝存しないため、むンストヌルが簡単です。 これらを䜿甚するず、゜ヌス ファむルをフィルタリングし、プロゞェクト内のプル リク゚ストの䜜成者に迅速なフィヌドバックを提䟛できたす。

翻蚳者からの远䌞

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす