👏

ネストしたHierarchical Namespaceの作成時エラーを回避する方法

2022/01/15に公開

Version

https://github.com/kubernetes-sigs/hierarchical-namespaces/releases/tag/v0.9.0

ネストしたSubnamespace Anchorでの作成時エラー

以下のようにマニフェストでSubnamespaceAnchorを定義し、ネストしたHierarchical Namespaceを作成しようとするとエラーが発生します。

subnamespaceanchor.yaml
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をそれぞれ定義する方法しかないようです。

https://github.com/kubernetes-sigs/hierarchical-namespaces/blob/master/docs/user-guide/how-to.md#organize-full-namespaces-into-a-hierarchy

hierarchyconfiguration.yaml
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.

https://github.com/kubernetes-sigs/hierarchical-namespaces/blob/master/docs/user-guide/concepts.md#why-use-hierarchical-namespaces

しかし、今回の方法ではNamespaceの権限を必要とするため、こちらの記事で示したようなSubnamespaceの権限委譲はできなくなります。
https://zenn.dev/snagasawa/articles/8c7bba139bb17d

GitOps/CIOpsであれば問題ありませんが、このような前提に立ったときには開発者自身が気軽にNamespaceのマニフェストを書いてapplyを試すことはできなくなるでしょう。(とはいえ、それほど頻度は多くないとは思いますが)

参考リンク

https://github.com/kubernetes-sigs/hierarchical-namespaces/issues/117

Discussion