ネストしたHierarchical Namespaceの作成時エラーを回避する方法
Version
ネストしたSubnamespace Anchorでの作成時エラー
以下のようにマニフェストでSubnamespaceAnchorを定義し、ネストしたHierarchical Namespaceを作成しようとするとエラーが発生します。
apiVersion: v1
kind: Namespace
metadata:
name: parent
---
apiVersion: hnc.x-k8s.io/v1alpha2
kind: SubnamespaceAnchor
metadata:
name: child
namespace: parent
---
apiVersion: hnc.x-k8s.io/v1alpha2
kind: SubnamespaceAnchor
metadata:
name: grandchild
namespace: child
$ kubectl apply -f subnamespaceanchor.yaml
namespace/parent created
subnamespaceanchor.hnc.x-k8s.io/child created
Error from server (NotFound): error when creating "subnamespaceanchor.yaml": namespaces "child" not found
このように、grandchild subnamespaceanchorを作成しようとしたタイミングでchild namespaceがまだ作成されていないため、初回のapplyではnot foundエラーになります。
もう一度applyすると成功します。
$ kubectl apply -f subnamespaceanchor.yaml
namespace/parent unchanged
subnamespaceanchor.hnc.x-k8s.io/child unchanged
subnamespaceanchor.hnc.x-k8s.io/grandchild created
$ kubectl hns tree parent
parent
└── [s] child
└── [s] grandchild
エラー回避方法
今のところはSubnamespace Anchorの代わりにNamespaceとHierarchy Configurationをそれぞれ定義する方法しかないようです。
apiVersion: v1
kind: Namespace
metadata:
name: parent
---
apiVersion: v1
kind: Namespace
metadata:
name: child
---
apiVersion: v1
kind: Namespace
metadata:
name: grandchild
---
apiVersion: hnc.x-k8s.io/v1alpha2
kind: HierarchyConfiguration
metadata:
name: hierarchy # 名前は"hierarchy"で固定
namespace: child
spec:
parent: parent
---
apiVersion: hnc.x-k8s.io/v1alpha2
kind: HierarchyConfiguration
metadata:
name: hierarchy
namespace: grandchild
spec:
parent: child
$ kubectl apply -f hierarchyconfiguration.yaml
namespace/parent created
namespace/child created
namespace/grandchild created
hierarchyconfiguration.hnc.x-k8s.io/hierarchy created
hierarchyconfiguration.hnc.x-k8s.io/hierarchy created
$ kubectl hns tree parent
parent
└── child
└── grandchild
Subnamespace Anchorがないため、Subnamespaceの識別子[s]
がありませんがpropagationは正常に機能します。
$ kubectl hns config set-resource configmaps --mode Propagate
$ kubectl create configmap sample-config --from-literal=key1=config1 -n parent
configmap/sample-config created
$ kubectl get configmap -A | grep -E "NAME|sample-config"
NAMESPACE NAME DATA AGE
child sample-config 1 1s
grandchild sample-config 1 1s
parent sample-config 1 1s
課題
この方法でもpropagionには問題ないですが、Namespaceの権限なしにSubnamespaceの作成権限を委譲できないという課題があります。
Hierarchical Namespacesのモチベーションのひとつとして、Namespaceの作成に必要とされるClusterレベルの強い権限を付与せずに、限定的なNamespaceの管理権限の委譲を可能にするという目的がありました。
Similarly, you might want to allow some teams to create namespaces themselves as isolation units for their own services. However, namespace creation is a privileged cluster-level operation, and you typically want to control this privilege very closely.
しかし、今回の方法ではNamespaceの権限を必要とするため、こちらの記事で示したようなSubnamespaceの権限委譲はできなくなります。
GitOps/CIOpsであれば問題ありませんが、このような前提に立ったときには開発者自身が気軽にNamespaceのマニフェストを書いてapplyを試すことはできなくなるでしょう。(とはいえ、それほど頻度は多くないとは思いますが)
参考リンク
Discussion