我想使用 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 中的值?
答案 0 :(得分:1)
这是一个社区维基答案。随意扩展它。
我分析了您的问题并得出以下结论。
TL;DR:不幸的是,答案是:“不可能如您所愿”。您使用 sed
的当前解决方法是可行的方法。归根结底,即使有点不典型,也是一个实用的解决方案。
首先,Kustomize 的重点是从文件或包含文件的目录中应用不同的配置,以针对多个环境或类似环境进行自定义。因此,如果您知道要应用哪些值,那么您只需将它们包含在相应的覆盖目录中并应用您想要的任何值。例如,作为“开发”和“生产”叠加的一部分included here。这意味着对每个叠加层的命名空间进行硬编码。
但是有一个问题:“您从哪里获得命名空间值”?而且,因此,它是多么动态——如果根本不是动态的,只是一组值中的一个,这只是使用我刚刚描述的方法的问题。
假设它是完全动态的:
有一个用于动态替换值的命令:kustomize edit set
但不幸的是它只需要这些参数:image
、label
、nameprefix
、namespace
、 namesuffix
, replicas
所以我们不能在这里使用它(有关更多信息,请参阅该命令的帮助)。这也表明尚未实现对任意值的动态替换。
我还研究了其他方法,我想不出“纯粹”的 Kustomize 解决方案。