nayoungs
항상 끈기있게
nayoungs
  • 분류 전체보기 (274)
    • Cloud (21)
      • AWS (15)
      • Azure (3)
      • NCP (2)
      • GCP (1)
    • DevOps (68)
      • Docker (16)
      • Kubernetes (50)
      • CICD (2)
    • IaC (25)
      • Ansible (17)
      • Terraform (8)
    • Certification (4)
    • 금융 IT (5)
    • AI (3)
    • Linux (47)
    • 미들웨어 (5)
    • Programming (7)
      • GoLang (3)
      • Spring (4)
    • CS (25)
      • 네트워크 (17)
      • 운영체제 (5)
      • Web (1)
      • 개발 상식 (2)
      • 데이터베이스 (0)
    • Algorithm (59)
      • 프로그래머스 (36)
      • 백준 (18)
      • 알고리즘 정리 (5)
    • ETC (5)

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
nayoungs

항상 끈기있게

DevOps/Kubernetes

[Kubernetes] k8s Namespace (feat. 이름과 UID)

2022. 5. 17. 21:25
728x90

✔️ 이름과 UID

오브젝트 이름과 ID | Kubernetes

클러스터의 각 오브젝트는 해당 유형의 리소스에 대하여 고유한 이름을 가지고 있다. 이름은 Namespace 내에서 유일하면 된다.

Namespace는 분리하기 위한 용도와, DNS이름이 분리되는 용도를 위해 사용한다.

기본적으로는 default Namespace를 사용한다.

 

오브젝트를 리소스로 만들 때 쿠버네티스의 컨트롤러 매니저는 해당되는 리소스에 UID를 붙이게 되고,

모든 쿠버네티스 오브젝트는 전체 클러스터에 걸쳐 고유한 UID를 가지고 있다.



 

✔️ Namespace

namespace란, 쿠버네티스 클러스터 내의 논리적인 분리 단위이다.

 

다음과 같이 리소스를 분리할 수 있다.

리소스 분리

  • 서비스 별
  • 사용자 별
  • 환경: 개발, 스테이징, 프로덕션

기본 작업 공간은 default namespace이다.

 

네임스페이스 확인하기
$ kubectl get namespaces
$ kubectl get ns

--namespace 옵션을 명시하지 않으면 모두 default 네임스페이스에서 수행된다.

 

-n == --namespace

 

예시 : default 네임스페이스에서 생성된 포드 확인하기

$ kubectl get pods --namespace default
NAME    READY   STATUS    RESTARTS   AGE
myweb   1/1     Running   0          47m

 

모든 네임스페이스의 리소스 확인

-A == --all-namespaces

$ kubectl get <RESOURCE> namespaces -A
$ kubectl get <RESOURCE> --all-namespaces

예시

$ kubectl get pods --all-namespaces

 

  • kube-system: Kubernetes의 핵심 컴포넌트
  • kube-public: 모든 사용자가 읽기 권한(슈퍼유저는 어떤 Namespace든 읽고 쓸 수 있다)
  • kube-node-lease: 노드의 HeartBeat 체크를 위한 Lease 리소스가 존재
  • default: 기본 작업 공간
$ kubectl get pods -n kube-public

 

lease

leases는 HB(Heart Beat) 즉, 노드가 죽어있는지 살아있는지 체크할 때 사용하는 리소스이다.

$ kubectl get leases -n kube-node-leases

결과는 노드의 목록과 같다.

$ kubectl get leases -n kube-node-lease
NAME    HOLDER   AGE
node1   node1    20h
node2   node2    20h
node3   node3    20h
$ kubectl get nodes
NAME    STATUS   ROLES                  AGE   VERSION
node1   Ready    control-plane,master   20h   v1.22.8
node2   Ready    <none>                 20h   v1.22.8
node3   Ready    <none>                 20h   v1.22.8

 

Namespace 생성하기
  • 명령형 커맨드로 생성하기
$ kubectl create namespace developments

 

  • yaml 파일로 생성하기

 

예시 1

ns-dev.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: dev
$ kubectl create -f dev-ns.yaml 
namespace/dev created

 

예시 2

myweb-dev.yaml

apiVersion: v1
kind: Pod
metadata:
  name: myweb
  namesapce: dev
spec:
  containers:
    - name: myweb
      image: httpd
      ports:
        - containerPort: 80
          protocol: TCP

생성한 yaml 파일로 파드를 생성한다.

$ kubectl create -f myweb-dev.yaml
$ kubectl get ns
NAME              STATUS   AGE
default           Active   14h
dev               Active   3s
kube-node-lease   Active   14h
kube-public       Active   14h
kube-system       Active   14h

namespace가 다르면 pod의 이름은 같아도 되고, 아래 2개의 myweb는 서로 다른 것이다.

--> default 네임스페이스의 myweb과 dev 네임스페이스의 myweb

$ kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
myweb   1/1     Running   0          33m
$ kubectl get pods -n dev
NAME    READY   STATUS    RESTARTS   AGE
myweb   1/1     Running   0          38m

 

Namespace 삭제하기

단, 지울 때는 네임스페이스에 리소스가 없어야 한다.

$ kubectl delete ns <NAMESPACE>
$ kubectl delete pods <Pod> -n <NAMESPACE>

pod 삭제 시, -n 옵션을 붙이지 않으면 default namespace에서 삭제되므로 주의해야 한다.

 

 


👉 참고 사항 1

 

namespace.spec을 확인하면 finalizers라는 필드를 확인할 수 있다.

$ kubectl explain namespace.spec
KIND:     Namespace
VERSION:  v1

RESOURCE: spec <Object>

DESCRIPTION:
     Spec defines the behavior of the Namespace. More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

     NamespaceSpec describes the attributes on a Namespace.

FIELDS:
   finalizers   <[]string>
     Finalizers is an opaque list of values that must be empty to permanently
     remove object from storage. More info:
     https://kubernetes.io/docs/tasks/administer-cluster/namespaces/

Finalizers는 리소스를 지울 때 어떻게 할 것인지에 대한 설정을 하는 것이다.

yaml 파일을 통해 파드를 생성할 때, 아주 드물게 spec이 없는 경우가 있는데,

namespace는 Finalizers라는 필드가 없으면 spec을 설정할 이유가 없다.



👉 참고 사항2

$ kubectl api-resource
kubectl api-resources | more
NAME                              SHORTNAMES   APIVERSION                             NAMESP
ACED   KIND
bindings                                       v1                                     true  
       Binding
componentstatuses                 cs           v1                                     false 
       ComponentStatus
configmaps                        cm           v1                                     true  
       ConfigMap
endpoints                         ep           v1                                     true  
       Endpoints
events                            ev           v1                                     true  
...

여기서 NAMESPACED 는 네임스페이스의 사용 여부이다.

true는 네임스페이스를 사용하는 것이고,

false는 네임스페이스를 사용하지 않는 것으로 Global 리소스이다.

--->특정 네임스페이스가 아닌 클러스터 전체에 영향을 미친다.)

 

728x90
저작자표시 비영리 (새창열림)
    'DevOps/Kubernetes' 카테고리의 다른 글
    • [Kubernetes] Pod Lifecycle
    • [Kubernetes] k8s Label, LabelSelector, Annotations
    • [Kubernetes] k8s Workload : Pod
    • [Kubernetes] k8s 오브젝트(Objects)
    nayoungs
    nayoungs
    안되면 될 때까지

    티스토리툴바