Kyvernoはポリシー管理にどのように役立つか


もともと公開mccricardo.com .
クラウドとKubernetesの増殖は、新しい環境を動的に提供することを「容易に」しました.それは課題の独自のセットが付属していますいくつかの役割を果たすロールとロールバックを動的に提供します.Kubernetesの名前空間として新しい「環境」を考えるなら、それぞれの独自のロールとローディングを持っています.
我々はいくつかのアプローチでこの問題を攻撃することができましたKyverno そして、我々のためにそれを管理するその先進の特徴のうちの1つ.Kyverno Kubernetes用に設計されたポリシーエンジンですKyvernoポリシーは、クバーネッツ資源を検証し、変異して、生成することができます.Kyverno

  • validate -ポリシーコンプライアンスのリソース構成を確認する

  • mutate -アドミッションコントロール中にリソースを変更する

  • 生成-リソースの作成または更新に基づいて追加のリソースを作成します.
  • 新しい名前空間が作成されるたびに、Kyvernoの生成機能を使用してロールとローディングを作成します.

    転がる
    我々は、ローカルKubernetesクラスタを回転させますk3d また、以下のツールが必要になります.
  • kubectl
  • k3d
  • 我々は、ローカルKubernetesクラスタを作成することから始めますk3d :
    k3d cluster create -a 2 kyverno
    k3d kubeconfig merge kyverno --switch-context
    
    次にKyvernoをクラスタに配備します.
    kubectl create -f https://raw.githubusercontent.com/kyverno/kyverno/main/definitions/release/install.yaml
    
    リソースを生成しているので、Kyverno権限を与えなければなりません.
    # kyverno.yaml
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: kyverno:generatecontroller
    rules:
    - apiGroups:
      - "*"
      resources:
      - namespaces
      - networkpolicies
      - secrets
      - configmaps
      - resourcequotas
      - limitranges
      - pods
      - roles
      - rolebindings
      verbs:
      - create 
      - get
      - update
      - delete
      - watch
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: kyverno-admin-generate
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: kyverno:generatecontroller
    subjects:
    - kind: ServiceAccount
      name: kyverno-service-account
      namespace: kyverno
    
    必要以上のものがありますが、これらのアクセス許可を適用できます.
    kubectl apply -f kyverno.yaml
    
    今、Kyvernoは、必要なものを作成する必要があるロールとrolebindingsを管理するために必要なアクセス許可を備えていますpolicies そのハンドル
    # role-policy.yaml
    apiVersion: kyverno.io/v1
    kind: ClusterPolicy
    metadata:
      name: role
    spec:
      rules:
      - name: role
        match:
          resources:
            kinds:
            - Namespace
        exclude:
          resources:
            namespaces:
            - "kube-system"
            - "default"
            - "kube-public"
            - "kyverno"
        generate:
          kind: Role
          name: pod-reader
          namespace: "{{request.object.metadata.name}}"
          data:  
            rules:
              - apiGroups: [""] # "" indicates the core API group
                resources: ["pods"]
                verbs: ["get", "watch", "list"]
    ---
    # rolebinding-policy.yaml
    apiVersion: kyverno.io/v1
    kind: ClusterPolicy
    metadata:
      name: rolebinding
    spec:
      rules:
      - name: rolebinding
        match:
          resources:
            kinds:
            - Namespace
        exclude:
          resources:
            namespaces:
            - "kube-system"
            - "default"
            - "kube-public"
            - "kyverno"
        generate:
          kind: RoleBinding
          name: read-pods
          namespace: "{{request.object.metadata.name}}"
          data:  
            subjects:
              - kind: User
                name: "{{request.object.metadata.labels.user}}"
                apiGroup: rbac.authorization.k8s.io
            roleRef:
              kind: Role
              name: pod-reader
              apiGroup: rbac.authorization.k8s.io
    
    我々の目標を達成するために、我々は2つの方針、役割を作成する1つを作ります、そして、Kyvernoが名前空間資源(それが気にかけないものを除いて)の変化のために「聞く」ことであるrolebindingのためにもう一つ.The { {要求オブジェクト} } 名前空間リソースとKyvernoのフィールドを含み、名前空間を識別し、許可が与えられているかどうかを決定します.
    kubectl apply -f role-policy.yaml
    kubectl apply -f rolebinding-policy.yaml
    
    我々が現在適切なフィールドで名前空間をつくるならば、Kyvernoはそれを魔法にします
    apiVersion: v1
    kind: Namespace
    metadata:
      labels:
        user: jane
      name: test-namespace
    
    ➜ kubectl -n test-namespace get role                   
    NAME         CREATED AT
    pod-reader   2020-12-27T20:09:49Z
    ➜ kubectl -n test-namespace get rolebinding 
    NAME       ROLE              AGE
    read-pods   Role/pod-reader   11s
    

    どのように、Kyvernoはこれをしましたか?
    Kubernetes社のコンセプトAdmission Controller これはAPIサーバへのリクエストを傍受できるソフトウェアであり、その作成前に何かを行う.また、の概念を持ってDynamic Admission Control これは、同じような機能を提供するHTTPコールバックです.我々自身のダイナミックな入場コントロールを開発することができた間、Kyvernoは我々が捜している能力をすでに持っていて、それを狂気させません.