zaki work log

作業ログやら生活ログやらなんやら

[kubectl / oc] ネームスペースの作成と削除と切り替え (コマンドメモ)

kubectxを使わずkubectlで済ます方法。

namespaceを作る

kubectl create

kubectl create namespace <namespace-name>で作る。

[zaki@k8s-master01 ~]$ kubectl create namespace sample1
namespace/sample1 created
[zaki@k8s-master01 ~]$ kubectl get namespace sample1
NAME      STATUS   AGE
sample1   Active   7s
[zaki@k8s-master01 ~]$ kubectl get namespace sample1 -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: "2020-04-20T21:54:27Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:status:
        f:phase: {}
    manager: kubectl
    operation: Update
    time: "2020-04-20T21:54:27Z"
  name: sample1
  resourceVersion: "3454403"
  selfLink: /api/v1/namespaces/sample1
  uid: cb61dafd-3cc0-4ab0-a75f-3da006822a69
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

dry-run

dry-run -o yamlマニフェストファイルの素を作る。

[zaki@k8s-master01 ~]$ kubectl create namespace sample2 --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: sample2
spec: {}
status: {}

※ 1.18だと--dry-runだけだと警告出る

[zaki@k8s-master01 ~]$ kubectl create namespace sample2 --dry-run -o yaml
W0421 06:55:44.596609  125716 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
kind: Namespace
metadata:
  creationTimestamp: null
  name: sample2
spec: {}
status: {}

マニフェストから

apiVersion: v1
kind: Namespace
metadata:
  name: sample2
[zaki@k8s-master01 namespace]$ kubectl apply -f namespace-sample2.yml 
namespace/sample2 created
[zaki@k8s-master01 namespace]$ kubectl get ns sample2
NAME      STATUS   AGE
sample2   Active   4s
[zaki@k8s-master01 namespace]$ kubectl get ns sample2 -o yaml
apiVersion: v1
kind: Namespace
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"name":"sample2"}}
  creationTimestamp: "2020-04-20T21:56:51Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:kubectl.kubernetes.io/last-applied-configuration: {}
      f:status:
        f:phase: {}
    manager: kubectl
    operation: Update
    time: "2020-04-20T21:56:51Z"
  name: sample2
  resourceVersion: "3454838"
  selfLink: /api/v1/namespaces/sample2
  uid: 51bfd092-2028-4e9f-b029-b5b0dcf1626a
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

namespace切り替え

ネームスペース一覧

[zaki@k8s-master01 namespace]$ kubectl get ns
NAME              STATUS   AGE
default           Active   14d
kube-node-lease   Active   14d
kube-public       Active   14d
kube-system       Active   14d
sample1           Active   13m
sample2           Active   11m

現在はdefaultネームスペースで、そこのpod一覧

[zaki@k8s-master01 namespace]$ kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
sockserv-7d8777b75b-tpqdv   1/1     Running   0          14d
[zaki@k8s-master01 namespace]$ kubectl get pod -n default
NAME                        READY   STATUS    RESTARTS   AGE
sockserv-7d8777b75b-tpqdv   1/1     Running   0          14d

namespace切り替え

[zaki@k8s-master01 namespace]$ kubectl config set-context --current --namespace=sample1
Context "kubernetes-admin@kubernetes" modified.
[zaki@k8s-master01 namespace]$ kubectl get pod
No resources found in sample1 namespace.

namespace確認

[zaki@k8s-master01 namespace]$ kubectl config get-contexts
CURRENT   NAME                          CLUSTER      AUTHINFO           NAMESPACE
*         kubernetes-admin@kubernetes   kubernetes   kubernetes-admin   sample1

sample1ネームスペースでサンプルpodをデプロイ

[zaki@k8s-master01 namespace]$ kubectl run sample-pod --image=httpd
pod/sample-pod created
[zaki@k8s-master01 namespace]$ kubectl get pod
NAME         READY   STATUS              RESTARTS   AGE
sample-pod   0/1     ContainerCreating   0          2s
[zaki@k8s-master01 namespace]$ kubectl get pod
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          11s
[zaki@k8s-master01 namespace]$ kubectl get pod -n sample1
NAME         READY   STATUS    RESTARTS   AGE
sample-pod   1/1     Running   0          25s

namespace削除

kubectl delete

kubectl delete namespace <対象>で削除

[zaki@k8s-master01 namespace]$ kubectl delete namespace sample1
namespace "sample1" deleted
[zaki@k8s-master01 namespace]$ kubectl get ns
NAME              STATUS   AGE
default           Active   14d
kube-node-lease   Active   14d
kube-public       Active   14d
kube-system       Active   14d
sample2           Active   5m7s

マニフェストから

applyしたマニフェストファイルがあるなら

[zaki@k8s-master01 namespace]$ kubectl delete -f namespace-sample2.yml 
namespace "sample2" deleted
[zaki@k8s-master01 namespace]$ kubectl get ns
NAME              STATUS   AGE
default           Active   14d
kube-node-lease   Active   14d
kube-public       Active   14d
kube-system       Active   14d

sample1で動かしてたpodも消えているか確認

[zaki@k8s-master01 namespace]$ kubectl get pod -A | grep -v kube-system
NAMESPACE     NAME                                                READY   STATUS    RESTARTS   AGE
default       sockserv-7d8777b75b-tpqdv                           1/1     Running   0          14d

podも消える

OpenShiftだと

OpenShiftだとnamespaceを拡張したprojectというリソースがあり、これを操作すればOK。

作成

[zaki@okd4-manager ~]$ oc new-project sample
Now using project "sample" on server "https://api.okd4.naru.jp-z.jp:6443".

You can add applications to this project with the 'new-app' command. For example, try:

    oc new-app ruby~https://github.com/sclorg/ruby-ex.git

to build a new example application in Python. Or use kubectl to deploy a simple Kubernetes application:

    kubectl create deployment hello-node --image=gcr.io/hello-minikube-zero-install/hello-node

作成と同時にnamespaceも作成したprojectに切り替わる。

切り替え

切り替え単体はoc projectコマンド

[zaki@okd4-manager ~]$ oc project default
Now using project "default" on server "https://api.okd4.naru.jp-z.jp:6443".

削除

これは普通に

[zaki@okd4-manager ~]$ oc delete project sample
project.project.openshift.io "sample" deleted

namespaceと違うとこ

annotationsにpodを動作させるときのUIDとかのメタ情報が設定されている。

[zaki@okd4-manager ~]$ oc get project sample -o yaml
apiVersion: project.openshift.io/v1
kind: Project
metadata:
  annotations:
    openshift.io/description: ""
    openshift.io/display-name: ""
    openshift.io/requester: system:admin
    openshift.io/sa.scc.mcs: s0:c24,c19
    openshift.io/sa.scc.supplemental-groups: 1000590000/10000
    openshift.io/sa.scc.uid-range: 1000590000/10000
  creationTimestamp: "2020-04-20T22:09:19Z"
  name: sample
  resourceVersion: "453046"
  selfLink: /apis/project.openshift.io/v1/projects/sample
  uid: 301c3113-82bc-47d3-b0c8-df4d3fdc3577
spec:
  finalizers:
  - kubernetes
status:
  phase: Active

環境

[zaki@k8s-master01 ~]$ kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:56:40Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.0", GitCommit:"9e991415386e4cf155a24b1da15becaa390438d8", GitTreeState:"clean", BuildDate:"2020-03-25T14:50:46Z", GoVersion:"go1.13.8", Compiler:"gc", Platform:"linux/amd64"}

kubectxはこちら

github.com


OpenShiftで育ったからK8sの「ネームスペース切り替え」がまだスッと出てこない…