Kyverno選擇資源

策略配置

策略中所有規(guī)則的通用配置。

策略包含一個或多個規(guī)則屋灌,以及適用于策略中所有規(guī)則的以下常見設(shè)置:

  • validationFailureAction: 控制驗證策略規(guī)則失敗是否應(yīng)該阻止準(zhǔn)入審查請求(enforce)或允許(audit)準(zhǔn)入審查請求并在策略報告中報告策略失敗焰雕。 默認(rèn)為 audit雀扶。

  • validationFailureActionOverrides: 一個 ClusterPolicy 屬性,指定 validationFailureAction 命名空間方式。 它會覆蓋指定命名空間的 validationFailureAction幻林。

  • background: 控制是否在后臺掃描期間將規(guī)則應(yīng)用于現(xiàn)有資源。 默認(rèn)為“true”音念。

  • schemaValidation: 控制是否應(yīng)用策略驗證檢查沪饺。 默認(rèn)為“true”。 Kyverno 將嘗試驗證策略的 schema闷愤,如果無法確定它滿足該資源的 OpenAPI schema 定義整葡,則會失敗「翁罚可以在驗證或變更策略上發(fā)生掘宪。 設(shè)置為“false”以跳過模式驗證。

  • failurePolicy: 定義 webhook 無法響應(yīng)時的 API Server行為攘烛。 允許的值為“Ignore”或“Fail”魏滚。 默認(rèn)為“Fail”。

  • webhookTimeoutSeconds: 指定允許此策略執(zhí)行的最長時間(以秒為單位)坟漱。 默認(rèn)超時為 10 秒鼠次。 該值必須介于 1 到 30 秒之間。

使用 kubectl explain policy.spec 獲取有關(guān)策略 schema 的命令行幫助。

選擇資源

使用 match 和 exclude 過濾和選擇資源腥寇。

matchexclude 控制策略應(yīng)用于哪些資源成翩。

matchexclude 子句具有相同的結(jié)構(gòu),并且每個子句只能包含以下兩個元素之一:

  • any:指定資源過濾器赦役。Kyverno 選擇資源時會在多個資源過濾器直接執(zhí)行邏輯操作麻敌。

  • all:指定資源過濾器。Kyverno 選擇資源時會在多個資源過濾器直接執(zhí)行邏輯操作掂摔。

資源過濾器

可以在 any 或 all 子句下指定以下資源過濾器术羔。

  • resources:通過 names、namespaces乙漓、kinds级历、label selectors、annotations 和 namespace selectors 來選擇資源

  • subjects:選擇用戶叭披、用戶組和 service accounts

  • roles:選擇 namespace 級的角色

  • clusterRoles:選擇集群級的角色

注意:直接在 matchexclude 下指定資源過濾器已被標(biāo)記為棄用寥殖,并將在未來的版本中刪除。 強烈建議您在 anyall 塊下指定它們涩蜘。

必須在 match.(any/all).resources.kindsexclude 塊中指定至少一個元素嚼贡。使用 resources 元素時必須指定 kind 屬性。在 match.(any/all).resources.kinds 字段中可以指定通配符(*)皱坛。

此外编曼,用戶可以在策略規(guī)則的 match / exclude 聲明中使用 kind 指定 group 和 apiVersion。

支持的格式:

  • Group/Version/Kind
  • Version/Kind
  • Kind

為了解決 kind 命名沖突剩辟,需指定 API group 和 version掐场。例如,Kubernetes API贩猎、Calico 和 Antrea 都注冊了一個名為 NetworkPolicy 的 Kind熊户。

這些可以區(qū)分為:

  • networking.k8s.io/v1/NetworkPolicy
  • crd.antrea.io/v1alpha1/NetworkPolicy

通配符支持的格式:

  • Group/*/Kind
  • */Kind
  • *

注意:

  • matchexclude 中使用通配符的策略不允許在后臺模式中使用。
  • 使用通配符的策略不支持 generateverifyImages 規(guī)則類型吭服,也不支持 forEach 聲明嚷堡。
  • 對于 validate 規(guī)則類型,策略只能處理 patternanyPattern 塊中的 deny 語句和 metadata 對象艇棕。
  • 對于 mutate 規(guī)則類型蝌戒,策略只能處理 metadata 對象。

可以使用 /. 作為父資源和子資源之間的分隔符沼琉。例如北苟,Pods/statusPods.status 會匹配到子資源。

當(dāng) Kyverno 收到 AdmissionReview 請求(即打瘪,來自 validation 或 mutation webhook)時友鼻,它首先檢查資源和用戶信息是否匹配或是否應(yīng)從處理中排除傻昙。如果兩項檢查都通過,則將規(guī)則邏輯應(yīng)用于變更彩扔、驗證或生成資源妆档。

match 聲明

在任意 rule 聲明中,必須有一個 match 語句作為即將應(yīng)用的規(guī)則的過濾器虫碉。盡管 match 聲明可能會很復(fù)雜贾惦,并有多個不同的元素,但至少要有一個蔗衡。match 聲明中最常見的元素類型是 Kubernetes 類型過濾器纤虽,例如 Pods, Deployments, Services, Namespaces 等。matchexclude聲明中還不支持變量替換绞惦。match 聲明也需要一個 anyall 表達(dá)式來實現(xiàn)更靈活的多條件處理。

在這個片段中洋措,match 語句匹配所有名稱為“staging”或在“prod”命名空間中的 Service济蝉。

spec:
  rules:
  - name: no-LoadBalancer
    match:
      any:
      - resources:
          kinds: 
          - Service
          names: 
          - "staging"
      - resources:
          kinds: 
          - Service
          namespaces:
          - "prod"

通過 match 聲明中多個元素組合,您可以更有選擇性地選擇要處理的資源菠发。此外王滤,還支持通配符以實現(xiàn)更好的控制。例如滓鸠,通過添加 resources.names 字段雁乡,前面的 match 聲明可以進一步篩選名稱以“prod-”開頭名稱是“staging”的Service。resources.names 可接收一組名稱糜俗,

將匹配所有具有任何一個這些名稱的資源踱稍。

spec:
  rules:
  - name: no-LoadBalancer
    match:
      any:
      - resources:
          names: 
          - "prod-*"
          - "staging"
          kinds:
          - Service
      - resources:
          kinds:
          - Service
        subjects:
        - kind: User
          name: dave

match.any[0] 會匹配到名稱以“prod-”開頭是“staging”的、而不是以“dev-”或其它前綴開頭的 Service悠抹。match.any[1] 會匹配到所有由用戶 dave 創(chuàng)建的 Service珠月,而不管 Service 名稱。由于這兩個是在 any 關(guān)鍵字下指定的楔敌,所以啤挎,整個規(guī)則會作用在所有名稱以“prod-”開頭是“staging”的由用戶 dave 創(chuàng)建的 Service。matchexclude 聲明中都支持通配符卵凑,從而使選擇更加靈活庆聘。

注意:Kyverno 也支持 resources.name ,允許你傳入單個名稱勺卢,而不是一個列表伙判,但是 resources.name 已被棄用,取而代之的是 resources.names值漫,并將在未來的版本中刪除澳腹。

在這個片段中织盼,match 聲明只會匹配 group 為 networking.k8s.io,version 是 v1酱塔,kind 是 NetworkPolicy 的資源沥邻。通過在 match 聲明中添加 Group、Version羊娃、Kind唐全,您可以更有選擇性地選擇要處理的資源。

spec:
  rules:
  - name: no-LoadBalancer
    match:
      any:
      - resources:
          kinds:
          - networking.k8s.io/v1/NetworkPolicy

通過在 version/kind 格式中指定 kind蕊玷,僅匹配資源種類的特定版本邮利。

spec:
  rules:
  - name: no-LoadBalancer
    match:
      any:
      - resources:
          kinds:
          - v1/NetworkPolicy

Kyverno 1.5.0之后,kinds 字段支持通配符垃帅,允許您匹配集群中的每種資源類型延届。選擇器標(biāo)簽支持以下路徑中的鍵和值的通配符(* 或?)贸诚。

  • match.resources.selector.matchLabels
  • exclude.resources.selector.matchLabels
  • match.any.resources.selector.matchLabels
  • match.all.resources.selector.matchLabels
  • exclude.any.resources.selector.matchLabels
  • exclude.all.resources.selector.matchLabels

支持的格式:

  • *
  • *pattern*
  • *pattern
  • pattern?
  • patte?rn

在以下策略中方庭,檢查所有資源類型是否存在具有鍵 app.kubernetes.io/name 標(biāo)簽。

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: require-labels
spec:
  validationFailureAction: audit
  background: false
  rules:
  - name: check-for-labels
    match:
      any:
      - resources:
          kinds:
          - "*"
    preconditions:
      any:
      - key: "{{ request.operation }}"
        operator: Equals
        value: CREATE
    validate:
      message: "The label `app.kubernetes.io/name` is required."
      pattern:
        metadata:
          labels:
            app.kubernetes.io/name: "?*"

注意

請記住酱固,在匹配所有類型 (*) 時械念,您編寫的策略必須適用于所有類型。這種通配符匹配的典型用途是 metadata 對象中的元素运悲。

下面是 match 聲明的其它一些示例龄减。

匹配有指定標(biāo)簽的 Deployment 或 StatefulSet

這個示例是選擇有一個有 app=critical 標(biāo)簽的 Deployment StatefulSet。

resources 塊中的條件檢查邏輯遵循“跨類型取和班眯,列表內(nèi)取或”希停。例如,如果規(guī)則匹配包含 kind 列表和 namespace 列表鳖敷,如果請求包含任何一個 (OR) kind AND 任何一個 (OR) namespace脖苏,則將評估該規(guī)則。clusterRoles定踱、roles 和 subjects 中的條件總數(shù)用邏輯 OR 評估棍潘,因為每個請求只能有這些值的一個實例。

下面的片段中崖媚,kinds 和 selector 是對等/兄弟元素亦歉,所以會被 AND 在一起。

spec:
  rules:
    - name: match-critical-app
      match:
        any:
        # kinds 和 namespaceSelector 是 AND 關(guān)系
        - resources:
            # kinds 列表內(nèi)是 OR 的關(guān)系
            kinds:
            - Deployment
            - StatefulSet
            selector:
              matchLabels:
                app: critical

可以利用此模式對資源的選擇進行非常細(xì)粒度的控制畅哑,例如肴楷,下面的片段中 match 包含了resources、subjects荠呐、roles 和 clusterRoles 多種元素赛蔫。

match 聲明進階

spec:
  # validationFailureAction 當(dāng)策略執(zhí)行失敗時砂客,控制準(zhǔn)入控制器的行為:
  # - 'enforce':中斷資源的創(chuàng)建或變更
  # - 'audit':允許資源更新并上報策略違規(guī)行為
  validationFailureAction: enforce
  # 每個策略都有一個按聲明順序應(yīng)用的規(guī)則列表
  rules:
    # Rules 必須有唯一的名稱
    - name: "check-pod-controller-labels"
      # 每個規(guī)則會匹配其 "match" 字段在聲明中指定的資源
      match:
        resources:
          kinds: # 必需,kind 列表
          - Deployment
          - StatefulSet
          # 可選的呵恢,資源名稱鞠值。 支持通配符 (* 和 ?)
          names: 
          - "mongo*"
          - "postgres*"
          # 可選的,namespace 列表渗钉。支持通配符 (* 和 ?)
          namespaces:
          - "dev*"
          - test
          # 可選的彤恶,標(biāo)簽選擇器。值支持通配符(* 和 ?)
          selector:
              matchLabels:
                  app: mongodb
              matchExpressions:
                  - {key: tier, operator: In, values: [database]}
        # 可選的鳄橘,要匹配的用戶或 service accounts
        subjects:
        - kind: User
          name: mary@somecorp.com
        # 可選的声离,要匹配的 roles
        roles:
        # 可選的,要匹配的 clusterroles
        clusterRoles: 
        - cluster-admin

注意

盡管上面的代碼片段對于顯示您可以使用的匹配類型很有用瘫怜,但大多數(shù)策略在其匹配語句中使用一個或幾個不同的元素术徊。

使用標(biāo)簽匹配命名空間中的 Deployments

這個例子使用 namespaceSelector 匹配 namespace 中包含 type=connector 或 type=compute 標(biāo)簽的Deployments。

這里宝磨, kinds 和 namespaceSelector 是 match.resources 下的對等元素弧关,并使用邏輯 AND 操作進行評估。

spec:
  rules:
    - name: check-min-replicas
      match:
        any:
        # AND across resources and selector
        - resources:
            # OR inside list of kinds
            kinds:
            - Deployment
            namespaceSelector:
              matchExpressions:
                - key: type 
                  operator: In
                  values: 
                  - connector
                  - compute

組合 match 和 exclude

策略規(guī)則選擇的資源唤锉,必須滿足所有 match 和 exclude 條件。換句話說别瞭,match 和 exclude 條件是按邏輯 AND 評估的窿祥。exclude 塊中的元素遵循與 match 塊中相同的規(guī)范。

排除 cluster-admin ClusterRole

這是一個匹配所有非 cluster-admin ClusterRole 創(chuàng)建的 Pod 的規(guī)則蝙寨。

spec:
  rules:
    - name: match-pods-except-cluster-admin
      match:
        any:
        - resources:
            kinds:
            - Pod
      exclude:
        any:
        - clusterRoles:
          - cluster-admin

排除 kube-system namespace

這個規(guī)則會匹配除 kube-system namespace 外的所有 Pod晒衩。

注意:從 Kyverno 1.3.0 開始支持按名稱排除指定的 namespace。

spec:
  rules:
    - name: match-pods-except-admin
      match:
        any:
        - resources:
            kinds:
            - Pod
      exclude:
        any:
        - resources:
            namespaces:
            - kube-system

匹配標(biāo)簽并排除用戶和角色

下面的示例會匹配所有包含 app=critical 標(biāo)簽墙歪、并排除有 ClusterRole cluster-admin 或用戶 John 創(chuàng)建的資源听系。

注意

由于 roles 和 clusterRoles 是由 Kyverno 從 AdmissionReview 內(nèi)部構(gòu)建的,包含這些聲明的規(guī)則必須定義 background: false虹菲,因為 AdmissionReview 在 background 模式不可用靠胜。

spec:
  rules:
    - name: match-criticals-except-given-rbac
      match:
        any:
        - resources:
            kind:
            - Pod
            selector:
              matchLabels:
                app: critical
      exclude:
        any:
        - clusterRoles:
          - cluster-admin
        - subjects:
          - kind: User
            name: John

匹配標(biāo)簽并排除用戶

上述示例的變體,此代碼段使用 any 和 all 聲明來排除多個用戶毕源。

spec:
  validationFailureAction: enforce
  background: false
  rules:
    - name: match-criticals-except-given-users
      match:
        all:
        - resources:
            kinds:
            - Pod
            selector:
              matchLabels:
                app: critical
      exclude:
        any:
        - subjects:
          - kind: User
            name: susan
          - kind: User
            name: dave

使用 Annotation 匹配所有 Pod

匹配所有包含 imageregistry: "https://hub.docker.com/" 注解的 Pod浪漠。

spec:
  rules:
    - name: match-pod-annotations
      match:
        any:
        - resources:
            annotations:
              imageregistry: "https://hub.docker.com/"
            kinds:
              - Pod
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市霎褐,隨后出現(xiàn)的幾起案子址愿,更是在濱河造成了極大的恐慌,老刑警劉巖冻璃,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件响谓,死亡現(xiàn)場離奇詭異损合,居然都是意外死亡,警方通過查閱死者的電腦和手機娘纷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門嫁审,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人失驶,你說我怎么就攤上這事土居。” “怎么了嬉探?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵擦耀,是天一觀的道長。 經(jīng)常有香客問我涩堤,道長眷蜓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任胎围,我火速辦了婚禮吁系,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘白魂。我一直安慰自己汽纤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布福荸。 她就那樣靜靜地躺著蕴坪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敬锐。 梳的紋絲不亂的頭發(fā)上背传,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音台夺,去河邊找鬼径玖。 笑死,一個胖子當(dāng)著我的面吹牛颤介,可吹牛的內(nèi)容都是我干的梳星。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼买窟,長吁一口氣:“原來是場噩夢啊……” “哼丰泊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起始绍,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤瞳购,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后亏推,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體学赛,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡年堆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盏浇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片变丧。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖绢掰,靈堂內(nèi)的尸體忽然破棺而出痒蓬,到底是詐尸還是另有隱情,我是刑警寧澤滴劲,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布攻晒,位于F島的核電站,受9級特大地震影響班挖,放射性物質(zhì)發(fā)生泄漏鲁捏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一萧芙、第九天 我趴在偏房一處隱蔽的房頂上張望给梅。 院中可真熱鬧,春花似錦双揪、人聲如沸动羽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽曹质。三九已至,卻和暖如春擎场,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背几莽。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工迅办, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人章蚣。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓站欺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親纤垂。 傳聞我的和親對象是個殘疾皇子矾策,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容