Kubernetes namespace

Namespace

namespaceはKubernetesリソースの領域であり、1つのクラスタを複数の論理単位に分けて使用し、権限とポリシーをclusterの下位sectionに適用するメカニズムを提供する。 つまり、リソースをグループ化して管理できる機会を提供する。

namespaceの使用

namespaceは用途に応じて実行するアプリを区分するときに使用する。

整理すると次のとおりである。

  • 1つのクラスタを複数チームやユーザーが共有するときの領域区分
  • 開発環境、テスト環境、本番環境のようなソフトウェア環境の区分
  • インフラチームが見られる区域と開発チームが見られる区域の区分
    • 権限のboundary
    • リソースのboundary

namespaceを使用する

  • namespace作成

    • CLI
      kubectl create namespace blue
      kubectl get namespaces
      
    • YAML
      kubectl create namespace green --dry-run=client -o yaml > green-ns.yaml
      kubectl create -f green-ns.yaml
      
  • namespace管理

    kubectl get namespaces
    kubectl delete namespace
    

namespaces取得

登録されたnamespacesの取得は次のとおりである。

kubectl get namespace

初回インストール直後にnamespaces一覧を取得すると次のようになる。

% kubectl get namespaces
NAME              STATUS   AGE
default           Active   5m30s
kube-node-lease   Active   5m31s
kube-public       Active   5m31s
kube-system       Active   5m31s

デフォルトでnamespaceは4つ存在する。

Cluster作成時に使われる基本namespace

default

  • 他のnamespaceがないobjectのための基本namespace
  • container、pod、service、replicasetなどのリソースに対する領域を提供する。

kube-system

  • kubernetes systemが作成したobjectのためのnamespace

kube-public

  • 自動で作成され、すべてのユーザー(認証されていないユーザーを含む)が読み取り権限でアクセスできる。
  • 主にcluster全体の中で公開的に見えて読み取れるresourceのために予約されている。
  • 公開的な性格は単なる慣例であり、必須要件ではない。

default namespace

何もない状態でPodを取得してみる。

% kubectl get pod
No resources found in default namespace.

この内容から、namespaceを指定しない場合はdefaultが基本で使用されていることが分かる。

次のコマンドはすべて同じ動作をする。

kubectl get pod
kubectl get pod --namespace default
kubectl get pod -n default

特定namespaceでPodを取得する

kubectl get pods -n [取得するnamespace名]

次のコマンドはkube-system namespaceにあるPodを取得したものである。

% kubectl get pods -n kube-system
NAME                               READY   STATUS    RESTARTS        AGE
coredns-6d4b75cb6d-7shzf           1/1     Running   0               6m13s
etcd-minikube                      1/1     Running   0               6m28s
kube-apiserver-minikube            1/1     Running   0               6m26s
kube-controller-manager-minikube   1/1     Running   0               6m26s
kube-proxy-dbd6p                   1/1     Running   0               6m13s
kube-scheduler-minikube            1/1     Running   0               6m26s

すべてのnamespaceでPodを取得する

すべてのnamespaceでPodを取得するコマンドは次のとおりである。

kubectl get pods --all-namespaces

実際に実行してみる。

% kubectl get pods --all-namespaces
NAMESPACE     NAME                               READY   STATUS    RESTARTS      AGE
kube-system   coredns-6d4b75cb6d-7shzf           1/1     Running   0             10m
kube-system   etcd-minikube                      1/1     Running   0             11m
kube-system   kube-apiserver-minikube            1/1     Running   0             11m
kube-system   kube-controller-manager-minikube   1/1     Running   0             11m
kube-system   kube-proxy-dbd6p                   1/1     Running   0             10m
kube-system   kube-scheduler-minikube            1/1     Running   0             11m
kube-system   storage-provisioner                1/1     Running   1 (10m ago)   11m

ここではkube-systemしかないが、これは別途Podを作成していないためである。

namespaceを作成する

CLIでnamespaceを作成する

CLIでnamespaceを作成するコマンドは次のとおりである。

kubectl create namespace [作成するnamespace名]

実際にblueというnamespaceを作成してみる。

% kubectl create namespace blue
namespace/blue created

作成されたか確認する。

% kubectl get namespaces
NAME              STATUS   AGE
blue              Active   10s <<<<<<<< 作成されたblue namespace
default           Active   27m
kube-node-lease   Active   27m
kube-public       Active   27m
kube-system       Active   27m

YAMLでnamespaceを作成する

YAMLでnamespaceを作成してみる。

kubectl create namespace [作成するnamespace名] --dry-run=client -o yaml
% kubectl create namespace green --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: green
spec: {}
status: {}

green-ns.yamlファイルとして作成する。

$ kubectl create namespace green --dry-run -o yaml > green-ns.yaml

green-ns.yamlを必要なものだけ残すため、次のように修正する。

apiVersion: v1
kind: Namespace
metadata:
  name: green

作成したgreen-ns.yamlでnamespaceを作成する。

% kubectl create -f green-ns.yaml
namespace/green created

作成されたか確認する。

% kubectl get namespaces
NAME              STATUS   AGE
blue              Active   11m
default           Active   27m
green             Active   43s <<<<<<<< 作成されたgreen namespace
kube-node-lease   Active   27m
kube-public       Active   27m
kube-system       Active   27m

特定namespaceにPodを作成する

特定namespaceにCLIからPodを作成する

次のコマンドでnamespaceフラグ(--namespace)をgreenに指定してPodを作成する。

% kubectl run nginx --image=nginx:1.14 --port 80 --namespace green
pod/nginx created

green namespaceにあるPodを取得すると、正常に作成されたことが分かる。

% kubectl get pods -n green
NAME        READY   STATUS    RESTARTS   AGE
webserver   1/1     Running   0          48s

特定namespaceを削除

green namespaceに作成したPodを削除する。

% kubectl delete pod nginx -n green
pod "nginx" deleted

注意点: namespaceを削除すると、その中に入っていたPodもすべて削除される。

特定namespaceにYAMLからPodを作成する

nginx.yamlファイルを作成する。

$ kubectl run nginx --image=nginx:1.14 --port 80 --dry-run=client -o yaml > nginx.yaml

生成されたnginx.yamlファイルを次のように修正する。

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx
  name: nginx
spec:
  containers:
  - image: nginx:1.14
    name: nginx
    ports:
    - containerPort: 80

今回はnamespaceフラグを指定して作成してみる。

kubectl create -f nginx.yaml -n green

YAMLにnamespaceを指定して特定namespaceにPodを作成する

nginx.yamlファイルでmetadata > namespaceに次のようにgreenを指定する。

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: nginx
  name: nginx
  namespace: green # namespace指定
spec:
  containers:
  - image: nginx:1.14
    name: nginx
    ports:
    - containerPort: 80

今回はnamespaceフラグ(-n green)を指定せずに作成してみる。既に同じPod名がある場合は、先に削除する必要がある。

% kubectl create -f nginx.yaml
pod/nginx created

green namespaceにあるPodを取得すると、正常に作成されたことが分かる。

% kubectl get pods -n green
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          17s

使用するnamespaceを切り替える - kubectl config

基本で使用するnamespaceをdefaultではない名前のnamespaceへ切り替える。

使用方法: namespaceを含むcontextを登録する。

$ kubectl config --help
$ kubectl config set-context NAME --cluster=kubernetes ...
$ kubectl config view

登録されたnamespaceへcontextを変更する。

$ kubectl config use-context NAME

configヘルプを見る

kubectl config --help

実行すると、kubeconfigファイルを修正するためのsubcommandと使用方法が表示される。

config設定内容を見る

kubectl config view

実行結果:

% kubectl config view
apiVersion: v1
clusters:
- cluster:

... 中間省略 ...

contexts:
- context:
    cluster: minikube
    extensions:
    - extension:
        last-update: Sat, 10 Sep 2022 09:22:47 KST
        provider: minikube.sigs.k8s.io
        version: v1.26.1
      name: context_info
    namespace: default
    user: minikube
  name: minikube
current-context: minikube

... 最後省略 ...

新規context追加

kubectl config use-context green@kubenetes --cluster=minikube --user=kubernates-admin --namespace=green

現在のcontext確認

% kubectl config current-context
minikube

現在のcontext変更

kubectl config use-context [context名]