将 `ClusterRoleBinding` 转换为 `RoleBinding` 并使用 `kustomize` 为其设置命名空间和额外的 `Deployment` 资源

时间:2021-04-02 18:11:35

标签: kubernetes kustomize

我想使用 ClusterRoleBinding 转换 RoleBinding 中的 kustomize-v4.0.5,并为 RoleBinding 和额外的 Deployment 设置命名空间字段具有相同值的资源。

我使用以下文件成功做到了这一点:

cat <<EOF > kustomization.yaml 
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
patchesJson6902:
- patch: |-
    - op: replace
      path: /kind
      value: RoleBinding
    - op: add
      path: /metadata/namespace
      value: 
        <NAMESPACE>
  target:
    group: rbac.authorization.k8s.io
    kind: ClusterRoleBinding
    name: manager-rolebinding
    version: v1
resources:
- role_binding.yaml 
- service_account.yaml
namespace: <NAMESPACE>
EOF

cat <<EOF > role_binding.yaml 
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: manager-rolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: manager-role
subjects:
- kind: ServiceAccount
  name: controller-manager
  namespace: system 
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: controller-manager
  namespace: system
spec:
  selector:
    matchLabels:
      control-plane: controller-manager
  replicas: 1
  template:
    metadata:
      labels:
        control-plane: controller-manager
    spec:
      containers:
      - command:
        - /manager
        args:
        - --enable-leader-election
        image: controller:latest
        name: manager
EOF

cat <<EOF > service_account.yaml 
apiVersion: v1
kind: ServiceAccount
metadata:
  name: controller-manager
  namespace: system
EOF

但是,在上面的示例中,我必须在 <NAMESPACE> 的多个位置对 kustomization.yaml 进行硬编码。有没有办法在不使用 sed 的情况下更改这些字段的命名空间值,在“纯”kustomize 中并且无需手动更改 kustomization.json 中的值?

1 个答案:

答案 0 :(得分:1)

这是一个社区维基答案。随意扩展它。

我分析了您的问题并得出以下结论。

TL;DR:不幸的是,答案是:“不可能如您所愿”。您使用 sed 的当前解决方法是可行的方法。归根结底,即使有点不典型,也是一个实用的解决方案。

首先,Kustomize 的重点是从文件或包含文件的目录中应用不同的配置,以针对多个环境或类似环境进行自定义。因此,如果您知道要应用哪些值,那么您只需将它们包含在相应的覆盖目录中并应用您想要的任何值。例如,作为“开发”和“生产”叠加的一部分included here。这意味着对每个叠加层的命名空间进行硬编码。

但是有一个问题:“您从哪里获得命名空间值”?而且,因此,它是多么动态——如果根本不是动态的,只是一组值中的一个,这只是使用我刚刚描述的方法的问题。

假设它是完全动态的:

有一个用于动态替换值的命令:kustomize edit set 但不幸的是它只需要这些参数:imagelabelnameprefixnamespacenamesuffix, replicas 所以我们不能在这里使用它(有关更多信息,请参阅该命令的帮助)。这也表明尚未实现对任意值的动态替换。

我还研究了其他方法,我想不出“纯粹”的 Kustomize 解决方案。