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
- CLI
-
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名]