네임스페이스(namespace)
리소스(pod, replicaset, deployment, service, node, …)를 논리적으로 구분하는 기준
YAML 파일의 메타데이터 아래 namespace 속성으로 지정
네임스페이스 조회
vagrant@ubuntu:~/kub01$ kubectl get namespaces
NAME STATUS AGE
default Active 3d1h
kube-node-lease Active 3d1h
kube-public Active 3d1h
kube-system Active 3d1h
기본적으로 kube-* 네임스페이스를 가진다.
default : 쿠버네티스를 설치하면 자동으로 사용하도록 설정되는 네임스페이스
특정 네임스페이스에 생성된 pod 확인
vagrant@ubuntu:~/kub01$ kubectl get pods --namespace default
NAME READY STATUS RESTARTS AGE
hostname-deployment-7dfd748479-7zdv7 1/1 Running 0 106m
hostname-deployment-7dfd748479-pp8x4 1/1 Running 0 106m
hostname-deployment-7dfd748479-rtgzv 1/1 Running 0 106m
vagrant@ubuntu:~/kub01$ kubectl get pods --namespace kube-system
NAME READY STATUS RESTARTS AGE
coredns-f9fd979d6-lsnmk 1/1 Running 2 3d1h
etcd-minikube 1/1 Running 1 3d1h
kube-apiserver-minikube 1/1 Running 1 3d1h
kube-controller-manager-minikube 1/1 Running 2 3d1h
kube-proxy-sbghs 1/1 Running 2 3d1h
kube-scheduler-minikube 1/1 Running 2 3d1h
storage-provisioner 1/1 Running 4 3d1h
특정 네임스페이스에 생성된 service 확인
vagrant@ubuntu:~/kub01$ kubectl get service --namespace kube-system
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 3d1h
네임스페이스 사용
- YAML 파일 생성
vagrant@ubuntu:~/kub01$ vi production-namespace.yml
`YAML
apiVersion: v1
kind: Namespace
metadata:
name: production
`
- 다른방법. 명령어로 생성
kubectl create namespace mynamespace
1.1 네임스페이스 조회
vagrant@ubuntu:~/kub01$ kubectl get namespaces
NAME STATUS AGE
default Active 3d1h
kube-node-lease Active 3d1h
kube-public Active 3d1h
kube-system Active 3d1h
mynamespace Active 8s
production Active 2m4s
특정 네임스페이스에 리소스를 생성하는 방법
vagrant@ubuntu:~/kub01$ cp deployment-hostname.yml hostname-deploy-svc-ns.yml
vagrant@ubuntu:~/kub01$ vi hostname-deploy-svc-ns.yml
`YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: hostname-deployment-ns
namespace: production
spec:
replicas: 3
selector:
matchLabels:
app: webserver
template:
metadata:
name: my-webserver
labels:
app: webserver
spec:
containers:
- name: my-webserver
image: alicek106/rr-test:echo-hostname
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: hostname-svc-clusterip-ns
namespace: production
spec:
ports:
- name: web-port
port: 8080
targetPort: 80
selector:
app: webserver
type: ClusterIP
`
vagrant@ubuntu:~/kub01$ kubectl apply -f hostname-deploy-svc-ns.yml
deployment.apps/hostname-deployment-ns created
service/hostname-svc-clusterip-ns created
vagrant@ubuntu:~/kub01$ kubectl get pods,services --namespace production
NAME READY STATUS RESTARTS AGE
pod/hostname-deployment-ns-7dfd748479-4mg2b 1/1 Running 0 50s
pod/hostname-deployment-ns-7dfd748479-jgzg6 1/1 Running 0 50s
pod/hostname-deployment-ns-7dfd748479-rg8lw 1/1 Running 0 50s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/hostname-svc-clusterip-ns ClusterIP 10.97.13.64 <none> 8080/TCP 50s
서로 다른 네임스페이스에서 이름으로 접근하려면 .NAMESPACE.svc 붙여 명시해줘야한다.
vagrant@ubuntu:~/kub01$ kubectl run -it --rm debug --image=alicek106/ubuntu:curl --restart=Never -- bash
If you don't see a command prompt, try pressing enter.
root@debug:/#
root@debug:/# curl http://hostname-svc-clusterip-ns:8080
curl: (6) Could not resolve host: hostname-svc-clusterip-ns
# default 네임스페이스에서는 접근 못함
root@debug:/# curl http://hostname-svc-clusterip-ns.production.svc:8080
<!DOCTYPE html>
<meta charset="utf-8" />
# <이하생략>
네임스페이스 삭제
vagrant@ubuntu:~/kub01$ kubectl delete namespace production
namespace "production" deleted
네임스페이스에 속하는 오브젝트 종류
vagrant@ubuntu:~/kub01$ kubectl api-resources --namespaced=true
네임스페이스에 속하지 않는 오브젝트 종류
vagrant@ubuntu:~/kub01$ kubectl api-resources --namespaced=false