namespace
namespace는 k8s API 중 하나로, (물리적) 클러스터 하나를 여러 개의 논리 적인 단위로 나눠서 사용
- 쿠버네티스 클러스터 하나를 여러 팀이나 사용자가 함께 공유
- 리소스 충돌을 방지하고,다양한 팀과 프로젝트를 효율적으로 관리
- 용도에 따라 실행해야 하는 앱을 구분할 때 사용
Namespace의 주요 특징
- 리소스 분리:
- 서로 다른 팀이나 애플리케이션에 속한 리소스를 격리.
- 동일한 이름의 리소스도 서로 다른 Namespace에 존재할 수 있음.
- 접근 제어: 네트워크 정책 및 RBAC(Role-Based Access Control)를 사용하여 Namespace별 접근 권한 설정 가능
- 리소스 할당 제한: 특정 Namespace에 CPU, 메모리 등 리소스를 제한하여 과도한 사용 방지
- 스코프 제한: Namespace는 클러스터 범위에서 리소스를 격리하므로, 다른 Namespace에 영향을 미치지 않음.
# namespace 조회
default | 기본 네임스페이스 |
kube-system | 쿠버네티스 시스템에서 관리하는 리소스 배치하는 네임스페이스 (ex. 쿠버네티스 관리용 파드 / 설정 - kube-apiserver, kube-scheduler ) |
kube-public | 클러스터 내/외부 모든 사용자가 읽을 수 있는 네임스페이스 (ex. 클러스터 사용량, ConfigMap) |
kube-node-lease | 각 노드의 임대 오프젝트들을 관리하는 네임스페이스 |
# 현재 시스템에 있는 namespace 확인
# 총 4개의 namespace는 default로 깔려있는 namespace
[master ~]$ kubectl get namespaces
NAME STATUS AGE
default Active 2m14s
kube-node-lease Active 2m14s
kube-public Active 2m14s
kube-system Active 2m14s # k8s 운영환경에서 필요로 하는 pod
# Default namespace가 base namesapce로 동작한다.
[master ~]$ kubectl get pod
No resources found in default namespace.
[master ~]$ kubectl get pod --namespace default
No resources found in default namespace.
[master ~]$ kubectl get pod -n default
No resources found in default namespace.
[master ~]$ cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- image: nginx:1.14
name: nginx
ports:
- containerPort: 80
- containerPort: 443
[master ~]$ kubectl create -f nginx.yaml
pod/mypod created
[master ~]$ kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 45s
[master ~]$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-5d78c9869d-2xnhr 1/1 Running 0 11m
coredns-5d78c9869d-5jrn8 1/1 Running 0 11m
etcd-node1 1/1 Running 0 11m
kube-apiserver-node1 1/1 Running 0 11m
kube-controller-manager-node1 1/1 Running 0 11m
kube-proxy-dsgt8 1/1 Running 0 10m # 마스터 1, 워커노드 1
kube-proxy-lt4z9 1/1 Running 0 11m
kube-router-rhx2h 1/1 Running 0 10m
kube-router-t8xh6 1/1 Running 0 11m
kube-scheduler-node1 1/1 Running 0 11m
# 전체 조회
[master ~]$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default mypod 1/1 Running 0 3m30s
kube-system coredns-5d78c9869d-2xnhr 1/1 Running 0 13m
kube-system coredns-5d78c9869d-5jrn8 1/1 Running 0 13m
kube-system etcd-node1 1/1 Running 0 13m
kube-system kube-apiserver-node1 1/1 Running 0 13m
kube-system kube-controller-manager-node1 1/1 Running 0 13m
kube-system kube-proxy-dsgt8 1/1 Running 0 12m
kube-system kube-proxy-lt4z9 1/1 Running 0 13m
kube-system kube-router-rhx2h 1/1 Running 0 12m
kube-system kube-router-t8xh6 1/1 Running 0 13m
kube-system kube-scheduler-node1 1/1 Running 0 13m
# root@master:~# kubectl get pods -A 로 조회해도 동일한 결과 나온다.
서로 같은 namespace에 있다면 name으로 서로 access가 가능하다. (DNS역할)
controlplane ~ ➜ kubectl get svc -n marketing
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
blue-service NodePort 10.43.88.253 <none> 8080:30082/TCP 10m
db-service NodePort 10.43.100.230 <none> 6379:32270/TCP 10m
controlplane ~ ➜ kubectl get svc -n dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
db-service ClusterIP 10.43.62.119 <none> 6379/TCP 13m
# 같은 pod 이름이지만 다른 namespace상에 있음
# -> db-service.dev.svc.cluster.local 로 접근
# namespace 만들기
# CLI로 blue namespace 생성
[master ~]$ kubectl create namespace blue
namespace/blue created
# yaml로 orange namespace 생성
## --dry-run : 실제로 실행하지 않고 실행 가능 여부만 확인
## -o yaml: 실행 결과를 yaml 파일로 출력
[master ~]$ kubectl create namespace orange --dry-run -o yaml
W0213 08:37:28.132628 5282 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: orange
spec: {}
status: {}
[master ~]$ kubectl create namespace orange --dry-run -o yaml > orange-ns.yaml
W0213 08:38:17.381045 5393 helpers.go:692] --dry-run is deprecated and can be replaced with --dry-run=client.
# namespace 만드는데 필요한 내용만 넣기
[master ~]$ cat orange-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: orange
[master ~]$ kubectl create -f orange-ns.yaml
namespace/orange created
# 만든 namespace 확인
[master ~]$ kubectl get namespaces
NAME STATUS AGE
blue Active 6m21s
default Active 21m
kube-node-lease Active 21m
kube-public Active 21m
kube-system Active 21m
orange Active 16s
# namespace 지정해서 Pod 만들기
[master ~]$ kubectl create -f nginx.yaml -n blue
pod/mypod created
# yaml파일에 namespace 고정시키기
[master ~]$ cat nginx.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
namespace: orange
spec:
containers:
- image: nginx:1.14
name: nginx
ports:
- containerPort: 80
- containerPort: 443
[master ~]$ kubectl create -f nginx.yaml
pod/mypod created
# blue에서 실행중인 pod 확인하기
[master ~]$ kubectl get pods -n blue
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 4m50s
# 명령어
$ kubectl create deployment my-app --image=nginx -n my-namespace
# YAML
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: my-namespace
spec:
replicas: 1
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx
# 사용할 namespace switch
👉 기본으로 사용하는 namespace를 default가 아닌 다른 이름의 namespace로 스위치
방법
1) namespace를 포함한 config context 등록
- $ kubectl config --help
- $ kubectl config set-context NAME --cluster=kubernetes ...
- $ kubectl config view
2) 등록된 namespace로 context 변경
- $ kubectl config use-context NAME
# 현재 클러스터의 config 확인하기
[node1 ~]$ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.0.18:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
# set-context Set a context entry in kubeconfig
[node1 ~]$ kubectl config set-context blue@kubernetes --cluster=kubernetes --user=kubernetes-admin --namespace=blue
Context "blue@kubernetes" created.
# 현재 context 확인
root@master:~# kubectl config current-context
kubernetes-admin@kubernetes
root@master:~# kubectl config get-contexts kubernetes-admin@kubernetes
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* kubernetes-admin@kubernetes kubernetes kubernetes-admin
# NAMESPACE가 비어있는 건 default NAMESPACE라는 것이다.
# switch
[master ~]$ kubectl config use-context blue@kubernetes
Switched to context "blue@kubernetes".
[master ~]$ kubectl config current-context
blue@kubernetes
[master ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 26m
[master ~]$ kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 51m
[master ~]$ kubectl delete pods mypod -n default
pod "mypod" deleted
[master ~]$ kubectl get pods -n default
No resources found in default namespace.
# ns 안써도 blue로 불러 오는 것 확인
[master ~]$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 34m
# 다시 원복시키기
[master ~]$ kubectl config use-context kubernetes-admin@kubernetes
Switched to context "kubernetes-admin@kubernetes".
[master ~]$ kubectl get pods
No resources found in default namespace.
namespace 삭제하기
blue namespace에는 Pod, service 등의 API가 있는데, namespace가 가장 큰 단위의 API이기 때문에
namespace를 삭제하면 전부 삭제가 된다.
[master ~]$ kubectl delete namespaces blue
namespace "blue" deleted
반응형
'Container > Kubernetes' 카테고리의 다른 글
[K8S] Liveness Probe (Self-healing) Pod (1) | 2024.02.16 |
---|---|
[K8S] YAML 템플릿 및 Pod (0) | 2024.02.13 |
[K8S] 쿠버네티스 개념 및 Architecture (0) | 2024.02.09 |
[K8S] kubectl command (0) | 2024.02.06 |
Kubernetes 환경 구성 (0) | 2024.02.03 |