前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用Kyverno自动标记Kubernetes资源

使用Kyverno自动标记Kubernetes资源

作者头像
CNCF
发布2021-01-12 11:10:24
5770
发布2021-01-12 11:10:24
举报
文章被收录于专栏:CNCFCNCF

客座文章作者:Nirmata业务发展和客户成功副总裁Anubhav Sharma,最初在Nirmata的博客上发表。

https://nirmata.com/2020/10/30/auto-labeling-kubernetes-resources-with-kyverno/

介绍

随着Kubernetes已经成为企业转向云原生的基本构建块,过去几年已经出现了许多简化集群创建过程的解决方案。但是,Kubernetes周边的Day-2运营仍然是一个复杂的过程,会减缓采用速度,增加运营成本。Kubernetes的复杂性和技能差距仍然是阻碍企业采用Kubernetes的最大因素。

许多Day-2操作用例包括要求中央平台团队尽可能有效地向开发人员交付安全和兼容的环境,并预先配置必要的服务和最佳实践。这类用例的一些例子包括使用Kubernetes最佳实践(如资源配额、网络策略和pod安全性)来配置环境。这需要工具在环境创建时进行评估,然后按照中央平台团队定义的标准对环境进行配置。

Kyverno:一个针对K8s的灵活的操作工具

Kubernetes提供了强大的构造,如准入控制webhook,可以用于验证和更改资源。Nirmata的Kyverno是专门设计用来使用声明式范式处理这些类型的用例的。Kyverno是一个为Kubernetes设计的开源策略引擎,它为用户提供了熟悉的结构来编写定制规则,并可根据需要轻松实现验证、修改和生成新资源。

大规模地管理Kubernetes需要遵循最佳实践和跨配置应用标准化。其中一种模式是使用Kubernetes标签。在Kubernetes中,每个资源都可以有一个或多个标签,Kubernetes使使用标签查找和管理资源变得很容易。

Day-2操作的一个非常常见的用例是跨命名空间和pod管理标签,以便其他Kubernetes控制器和操作人员可以轻松地实现证书更新、自助日志/监控、备份等用例。

自动标记命名空间

下面是一个使用Kyverno在Kubernetes集群中创建命名空间时如何实现命名空间标记的示例。

在集群中安装Kyverno:

代码语言:javascript
复制
kubectl create -f https://github.com/kyverno/kyverno/raw/master/definitions/install.yaml

这里有详细的安装说明。

https://kyverno.io/docs/installation/

下面是一个向命名空间添加标签的示例Kyverno策略:

代码语言:javascript
复制
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata: 
  name: add-labels
spec: 
  background: false
  rules:
  - name: add-ns-label
    match:
      resources:
        kinds: 
        - Namespace
    exclude:
      clusterroles: ["cluster-admin"]
    mutate: 
      patchStrategicMerge:
        metadata:
          labels:
            kyverno/user: "{{ request.userInfo.username }}"
            +(kyverno/network): "default"

该策略插入一个标签'kyverno/user',其中包含发出API请求以创建命名空间的用户的值。该策略还会插入一个标签'kyverno/network',但只有在用户尚未指定标签时才会如此。这个简单的策略演示了Kyverno中的一些强大功能,如变量替换和条件锚。

https://kyverno.io/docs/writing-policies/writing-policies-variables/

https://kyverno.io/docs/writing-policies/writing-policies-validate/

在集群中配置了策略之后,创建一个新的命名空间,并自动验证标签已经添加到该命名空间。

创建一个新的命名空间:

代码语言:javascript
复制
kubectl create ns test

查看命名空间:

代码语言:javascript
复制
kubectl get ns test -o yaml

这应该显示类似于:

代码语言:javascript
复制
apiVersion: v1
kind: Namespace
metadata:
  labels:
    kyverno/network: default
    kyverno/user: docker-for-desktop

现在,如果你想确保用户不能更新特定的标签,该怎么办呢?

Kyverno也让这很容易做到!以下是一个阻止“kyverno/network”标签更新的策略:

代码语言:javascript
复制
apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: protect-label
spec:
  validationFailureAction: enforce
  background: false
  rules:
  - name: block-updates-for-label
    match:
      resources:
        kinds:
           - Namespace
  validate:
    message: Updating label `kyverno/network` is not allowed
    deny:
    - key: "{{ request.operation }}"
      operator: "EQUALS"
      value: UPDATE

总结

管理Kubernetes配置可能很复杂,策略引擎提供了标准化、自动验证以及更改和生成配置的能力。

Kyverno是一个为Kubernetes设计的开源政策引擎。它具有最小的学习曲线,并为Kubernetes管理员提供了极大的灵活性,可以使用Kubernetes强大的声明式管理功能和原生工具解决Day-2操作挑战。

了解Kyverno还可以做什么请到:

https://kyverno.io

点击【阅读原文】阅读网站原文。

扫描二维码联系我们!


CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux Foundation,是非营利性组织。

CNCF(云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请长按以下二维码进行关注。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-01-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CNCF 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档