vSphere 7.0 U2a の新機能である、名前空間サービスを有効化してみます。これは、kubectl を利用して、開発者自身が(vSphere の管理者に依頼しなくても)セルフ サービスでスーパーバイザー名前空間を作成できるようになる、というものです。
ドキュメントでは、下記のあたりです。
今回の内容です。
今回の環境
vCenter Server 7.0 U2a + NSX-T 3.1 で、下記投稿のように構成したスーパーバイザー クラスタを利用します。(7.0 U1 での投稿ですが、U2 でも同様です)
これまでのスーパーバイザー名前空間の作成
スーパーバイザー名前空間は、これまでは kubectl ではなく、vSphere 側(vSphere Client など)から作成する必要がありました。
vSphere Clinet でのスーパーバイザー名前空間の作成
vSphere Clinet では、「ワークロード管理」→「名前空間」にある「新規名前空間」や・・・
スーパーバイザー クラスタの「新規名前空間」あたりから作成します。
従来の kubectl での名前空間作成の(エラーになる)様子
一方で、これまで、 kubectl create namespace(または ns)では、スーパーバイザー名前空間は作成できませんでした。
名前空間サービスを有効化するまえに、これまでの様子を確認しておきます。
kubectl vsphere login で、下記のようにスーパーバイザー クラスタにログインしておきます。
kubectl get namespaces で、名前空間を確認しておきます。この時点で作成されているスーパーバイザー名前空間は、lab-ns-31 だけです。
$ kubectl get ns --show-labels
NAME STATUS AGE LABELS
default Active 9d <none>
kube-node-lease Active 9d <none>
kube-public Active 9d <none>
kube-system Active 9d <none>
lab-ns-31 Active 11h vSphereClusterID=domain-c1006
svc-tmc-c1006 Active 9d tmc.cloud.vmware.com/exclude-from-detach=true
vmware-system-appplatform-operator-system Active 9d <none>
vmware-system-capw Active 9d cluster.x-k8s.io/provider=infrastructure-wcp,control-plane=capw-controller-manager
vmware-system-cert-manager Active 9d <none>
vmware-system-csi Active 9d <none>
vmware-system-kubeimage Active 9d <none>
vmware-system-license-operator Active 9d <none>
vmware-system-logging Active 9d <none>
vmware-system-nsop Active 9d <none>
vmware-system-nsx Active 9d <none>
vmware-system-registry Active 9d control-plane=controller-manager,controller-tools.k8s.io=1.0
vmware-system-tkg Active 9d control-plane=tkg-controller-manager
vmware-system-ucs Active 9d <none>
vmware-system-vmop Active 9d control-plane=controller-manager,controller-tools.k8s.io=1.0
kubectl create namespace で名前空間を作成しようとしても、エラーになります。ちなみに、Administrator@vsphere.local がログイン ユーザです。
$ kubectl create namespace lab-ns-32 Error from server (Forbidden): namespaces is forbidden: User "sso:Administrator@vsphere.local" cannot create resource "namespaces" in API group "" at the cluster scope
名前空間サービスの有効化
スーパーバイザー クラスタで、名前空間サービス(Namespace Service)を有効化することで、kubectl create namespace で名前空間を作成すると、自動的にスーパーバイザー名前空間が作成できるようになります。
スーパーバイザー クラスタの「設定」→「名前空間」→「全般」→「名前空間サービス」で、ステータスのスイッチを有効にします。
スイッチを有効にすると、「名前空間テンプレートの作成」画面が表示されます。
CPU、メモリ、ストレージのパラメータを適宜入力し、ストレージ ポリシーを選択して、「次へ」をクリックして進みます。
「権限」では、今回は administrator@vsphere.local ユーザを追加して「次へ」をクリックします。
ちなみに、本来は開発者自身が名前空間を作成するための機能なので、あらかじめ vCenter Single Sign-on の ID ソースとして登録しておいた Active Directory や LDAP を選択すべきかと思います。
確認画面で、「完了」をクリックします。
これで、名前空間サービスが有効化され、名前空間テンプレートが準備完了になりました。
kubectl でのスーパーバイザー名前空間の作成
名前空間サービスの有効化の際に権限追加したユーザで kubectl vsphere login して、名前空間を作成してみます。kubectl create namespace で、エラーなくNamespace が作成できるようになります。
$ kubectl create namespace lab-ns-32 namespace/lab-ns-32 created
作成された Namespace です。
$ kubectl get namespace lab-ns-32 --show-labels NAME STATUS AGE LABELS lab-ns-32 Active 8m7s vSphereClusterID=domain-c1006
vSphere Client でも、lab-ns-32 というスーパーバイザー名前空間が作成されたことが確認できます。そして、さきほど名前空間テンプレートで指定したパラメータが設定されています。
名前空間サービスを無効化した様子
ちなみに、名前空間サービスを無効化しても、作成されているスーパーバイザー名前空間は削除されず、そのまま利用できます。
名前空間サービスが有効な状態では、namespaces での create 権限がありますが・・・
$ kubectl auth can-i create namespaces
Warning: resource 'namespaces' is not namespace scoped
yes
$ kubectl auth can-i --list | grep namespaces
namespaces [] [] [delete get list watch create]
namespaces/status [] [] [get list watch]
名前空間サービスを無効にすると、namespaces から create 権限がなくなります。つまり、kubectl create namespace もエラーになります。
$ kubectl auth can-i create namespaces
Warning: resource 'namespaces' is not namespace scoped
no
$ kubectl auth can-i --list | grep namespaces
namespaces [] [] [delete get list watch]
namespaces/status [] [] [get list watch]
ただ、delete 権限はあるので、kubectl delete namespace で名前空間を削除することはできます。先ほど作成した lab-ns-32 Namespace を削除してみます。
$ kubectl delete namespace lab-ns-32 namespace "lab-ns-32" deleted $ kubectl get namespaces lab-ns-32 Error from server (NotFound): namespaces "lab-ns-32" not found
lab-ns-32 スーパーバイザー名前空も削除されます。タスクでは、スーパーバイザー名前空間に対応するリソース プールの削除などが見られます。
以上、kubectl でスーパーバイザー名前空間を作成してみる話でした。