✔️ 오브젝트 이름과 ID
오브젝트 이름과 ID | Kubernetes
클러스터의 각 오브젝트는 해당 유형의 리소스에 대하여 고유한 이름을 가지고 있다.
또한, 모든 쿠버네티스 오브젝트는 전체 클러스터에 걸쳐 고유한 UID를 가지고 있다.
vagrant@k8s-node1:~/pod$ kubectl get pods -o yaml
uid: daecb2af-ef5c-4531-8855-f6706346c6cd
오브젝트를 리소스를 만들때 k8s의 controll manager는 해당되는 리소스에 id를 붙인다.
해당 id는 k8s 클러스터 전체에 걸쳐서 유일하다.
해당 오브젝트를 완전하게 구분할 수 있는 이름이다.
이름은 Namespace 내에서 하나만 존재할 수 있다.
다른말로 Namespace가 다르면 같은 이름이 있을 수 있다는 것이다.
이와 반대로 uid는 클러스터 전체에서 유일해야 한다.
- 이름 : Namespace에서 유일해야 한다.
- UID : 클러스터 전체에서 유일해야 한다.
✔️ 오브젝트 이름 지정 조건
일부 리소스 유형은 RFC 1123 또는 RFC 1035에 정의된 대로 DNS 레이블 표준을 따라야 한다.
리소스 이름 지정 조건
- RFC 1123 레이블 이름
- 최대 63자이다.
- 소문자와 영숫자 또는
-
만 포함한다. - 영숫자로 시작한다.
- 영숫자로 끝난다
- RFC 1035 레이블 이름
- 최대 63개 문자를 포함
- 소문자 영숫자 또는 '-'만 포함
- 알파벳 문자로 시작
- 영숫자로 끝남
RFC 1123은 영숫자로 시작하고 RFC 1035는 알파벳 문자로 시작한다는 단 하나의 차이점이 있다.
일반적으로는 RFC 1035 레이블 이름
을 사용한다.
✔️ Namespace
Namespace는 리소스를 분리한다.
- 서비스 별
- 사용자 별
- 환경 : 개발, 스테이징, 프로덕션 별
가장 일반적인 사용 방식은 거대한 클러스터 내에 NS를 여러개 두어 A, B, C 서비스를 분리시키는 것이다.
드물지만 NS를 사용하지 않고 Cluster 자체를 여러대 두는 방식을 사용하기도 한다.
완벽하게 분리가 가능하지만 비용이 많이 든다는 단점이 있다.
서비스 : DNS 이름이 분리되는 용도
RBAC : 권한을 Namespace에 설정
특정 사용자는 특정 NS만 사용 가능하도록 할 수 있다.
특정 NS는 읽기만 특정 NS는 권한이 없고 특정 NS은 읽기/쓰기 모두 가능하도록 할 수 있다.
✔️ Namespace 확인
kubectl get ns
kubectl get namespaces
vagrant@k8s-node1:~$ kubectl get namespaces
NAME STATUS AGE
default Active 21h
kube-node-lease Active 21h
kube-public Active 21h
kube-system Active 21h
k8s에는 기본적으로 4개의 namespace가 있다.
- kube-system : 쿠버네티스의 핵심 컴포넌트
- kube-node-lease : 모든 사용자가 읽기 권한을 가진다.
- kube-public : 노드의 HeartBeat 체크를 위한 Lease 리소스가 존재
- default : 기본 작업 공간
실습 상에서 우리는 인증을 받은 사용자로 해당 인증 내용은 ~/.kube/config 파일에 정의되어 있으며 k8s의 슈퍼 유저이다.
그래서 어떤 NS던 상관없이 모두 읽고 쓸 수 있다.
vagrant@k8s-node1:~$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default myweb 1/1 Running 0 5m48s
kube-system calico-kube-controllers-5788f6558-t5k9z 1/1 Running 3 (9h ago) 25h
kube-system calico-node-ft9lf 1/1 Running 2 (9h ago) 25h
kube-system calico-node-pkcl8 1/1 Running 2 (9h ago) 25h
kube-system calico-node-r257f 1/1 Running 3 (9h ago) 25h
kube-system coredns-8474476ff8-4bmms 1/1 Running 2 (9h ago) 25h
kube-system coredns-8474476ff8-q7svm 1/1 Running 3 (9h ago) 25h
kube-system dns-autoscaler-5ffdc7f89d-r45qt 1/1 Running 3 (9h ago) 25h
kube-system kube-apiserver-node1 1/1 Running 4 (9h ago) 25h
kube-system kube-controller-manager-node1 1/1 Running 4 (9h ago) 25h
kube-system kube-proxy-69vb8 1/1 Running 3 (9h ago) 25h
kube-system kube-proxy-hmxbq 1/1 Running 2 (9h ago) 25h
kube-system kube-proxy-xgvg8 1/1 Running 2 (9h ago) 25h
kube-system kube-scheduler-node1 1/1 Running 5 (150m ago) 25h
kube-system nginx-proxy-node2 1/1 Running 2 (9h ago) 25h
kube-system nginx-proxy-node3 1/1 Running 2 (9h ago) 25h
kube-system nodelocaldns-gztbc 1/1 Running 2 (9h ago) 25h
kube-system nodelocaldns-mq9nm 1/1 Running 2 (9h ago) 25h
kube-system nodelocaldns-qc6vf 1/1 Running 3 (9h ago) 25h
모든 NS의 파드를 확인하는 명령이다.
myweb은 default에 있고 나머지는 모두 kube-system에 있다.
✔️ default NS
vagrant@k8s-node1:~$ kubectl get pods --namespace default
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 123m
vagrant@k8s-node1:~$ kubectl get pods -n default
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 124m
vagrant@k8s-node1:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 124m
기본 작업 공간은 즉, 기본 Namespace는 default
이다.
k8s에서는 namespace 옵션을 붙이지 않으면 default이다.
✔️ kube-system NS
vagrant@k8s-node1:~/pod$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
calico-kube-controllers-5788f6558-t5k9z 1/1 Running 3 (9h ago) 25h
calico-node-ft9lf 1/1 Running 2 (9h ago) 25h
calico-node-pkcl8 1/1 Running 2 (9h ago) 25h
calico-node-r257f 1/1 Running 3 (9h ago) 25h
coredns-8474476ff8-4bmms 1/1 Running 2 (9h ago) 25h
coredns-8474476ff8-q7svm 1/1 Running 3 (9h ago) 25h
dns-autoscaler-5ffdc7f89d-r45qt 1/1 Running 3 (9h ago) 25h
kube-apiserver-node1 1/1 Running 4 (9h ago) 25h
kube-controller-manager-node1 1/1 Running 4 (9h ago) 25h
kube-proxy-69vb8 1/1 Running 3 (9h ago) 25h
kube-proxy-hmxbq 1/1 Running 2 (9h ago) 25h
kube-proxy-xgvg8 1/1 Running 2 (9h ago) 25h
kube-scheduler-node1 1/1 Running 5 (153m ago) 25h
nginx-proxy-node2 1/1 Running 2 (9h ago) 25h
nginx-proxy-node3 1/1 Running 2 (9h ago) 25h
nodelocaldns-gztbc 1/1 Running 2 (9h ago) 25h
nodelocaldns-mq9nm 1/1 Running 2 (9h ago) 25h
nodelocaldns-qc6vf 1/1 Running 3 (9h ago) 25h
-n
옵션으로 kube-system NS의 파드를 확인하면 쿠버네티스의 핵심 서비스들이 있다.
✔️ kube-public NS
vagrant@k8s-node1:~/pod$ kubectl get pods -n kube-public
No resources found in kube-public namespace.
✔️ kube-node-lease NS
vagrant@k8s-node1:~/pod$ kubectl get pods -n kube-node-lease
No resources found in kube-node-lease namespace.
vagrant@k8s-node1:~/pod$ kubectl get leases -n kube-node-lease
NAME HOLDER AGE
node1 node1 25h
node2 node2 25h
node3 node3 25h
vagrant@k8s-node1:~/pod$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 25h v1.22.8
node2 Ready <none> 25h v1.22.8
node3 Ready <none> 25h v1.22.8
vagrant@k8s-node1:~/pod$ kubectl api-resources | grep leases
leases coordination.k8s.io/v1 true Lease
leases
는 node의 목록과 같다.
leases
의 역할은 Heart Beat (핫빗) - 노드가 살아있는지 죽어있는지 체크한다.
노드에 장애가 발생했을 때 lease라는 오브젝트 리소스에 의해 HB을 주기적으로 체크하다가 죽어있다면 Ready 상태가 되지 않는다.
✔️ Namespace 생성
vagrant@k8s-node1:~/pod$ kubectl create namespace developments
namespace/developments created
vagrant@k8s-node1:~/pod$ kubectl get ns
NAME STATUS AGE
default Active 25h
developments Active 10s
kube-node-lease Active 25h
kube-public Active 25h
kube-system Active 25h
✔️ Namespace 삭제
vagrant@k8s-node1:~/pod$ kubectl delete ns developments
namespace "developments" deleted
삭제 시에는 해당 NS에 리소스가 없어야 한다.
vagrant@k8s-node1:~/pod$ kubectl explain namespaces.
vagrant@k8s-node1:~/pod$ kubectl explain namespaces.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으로 Namespace 생성
vagrant@k8s-node1:~/pod/namespace$ cat dev-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
vagrant@k8s-node1:~/pod/namespace$ kubectl create -f dev-ns.yaml
namespace/dev created
vagrant@k8s-node1:~/pod/namespace$ kubectl get ns
NAME STATUS AGE
default Active 25h
dev Active 4s
kube-node-lease Active 25h
kube-public Active 25h
kube-system Active 25h
✔️ -n 옵션으로 Namespace 생성
vagrant@k8s-node1:~/pod/namespace$ kubectl run myweb --image httpd -n dev
pod/myweb created
리소스를 만들 때 -n
: namespace 옵션을 붙일 수 있다.
옵션을 붙이지 않으면 default namespace에 생성된다.
✔️ 파드의 Namespace 확인
vagrant@k8s-node1:~/pod/namespace$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 3h10m
이 myweb은 방금 생성한 pod가 아니다.
방금 -n
옵션을 이용해 dev
namespace에 생성했기 때문에
vagrant@k8s-node1:~/pod/namespace$ kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 3m10s
-n dev 옵션을 붙여 확인해야 한다.
default namespace에서 확인한 파드와 -n
옵션으로 확인한 파드의 생성 시간이 다름을 확인할 수 있다.
또한 이름은 namespace에서 유일하다는 것을 확인할 수 있다.
✔️ Namespace로 분리된 파드 삭제
vagrant@k8s-node1:~/pod/namespace$ kubectl delete pods myweb -n dev
pod "myweb" deleted
vagrant@k8s-node1:~/pod/namespace$ kubectl get pods -n dev
No resources found in dev namespace.
vagrant@k8s-node1:~/pod/namespace$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 3h25m
파드를 삭제할 때도 마찬가지로 따로 옵션을 지정하지 않으면 default NS에 있는 파드를 지우는 것이다.
✔️ YAML으로 파드를 Namespace에 배치하기
vagrant@k8s-node1:~/namespace$ ls
dev-ns.yaml
vagrant@k8s-node1:~/namespace$ cp ../pod/myweb.yaml .
vagrant@k8s-node1:~/namespace$ ls
dev-ns.yaml myweb.yaml
vagrant@k8s-node1:~/namespace$ vi myweb.yaml
vagrant@k8s-node1:~/namespace$ kubectl explain namespace.metadata
namespace <string>
Namespace defines the space within which each name must be unique. An empty
namespace is equivalent to the "default" namespace, but "default" is the
canonical representation. Not all objects are required to be scoped to a
namespace - the value of this field for those objects will be empty.
Must be a DNS_LABEL. Cannot be updated. More info:
http://kubernetes.io/docs/user-guide/namespaces
yaml 파일을 보면 metadata에는 namespace라는 필드가 있다.
vagrant@k8s-node1:~/namespace$ kubectl get pods myweb -o yaml | more
apiVersion: v1
kind: Pod
metadata:
annotations:
cni.projectcalico.org/containerID: fddbfbff9990a8b16d2294e36d85a56e42d9758388b302f86bc19d314cebe335
cni.projectcalico.org/podIP: 10.233.92.7/32
cni.projectcalico.org/podIPs: 10.233.92.7/32
creationTimestamp: "2022-05-17T09:05:54Z"
name: myweb
namespace: default
resourceVersion: "114994"
uid: 924ca7d8-e68d-4591-94a0-0acba68244d4
우리가 선언한 적은 없지만 namespace에 이미 default라고 세팅돼 있다.
이러한 기본값들은 controller manager가 알아서 채운다.
vagrant@k8s-node1:~/namespace$ cat myweb.yaml
apiVersion: v1
kind: Pod # kubectl api-resources
metadata:
name: myweb
namespace: dev
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80
protocol: TCP
vagrant@k8s-node1:~/namespace$ kubectl create -f myweb.yaml
pod/myweb created
vagrant@k8s-node1:~/namespace$ kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
myweb 0/1 ContainerCreating 0 3s
원하면 아예 namespace 선언을 해서 어디에 배치할 것인지 정할 수 있다.
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Annotation (어노테이션) (0) | 2022.05.18 |
---|---|
[Kubernetes] Label, LabelSelector (레이블, 레이블셀렉터) (0) | 2022.05.18 |
[Kubernetes] Pod Design (0) | 2022.05.17 |
[Kubernetes] Workload - Pod (파드) (0) | 2022.05.17 |
[Kubernetes] Object의 정의와 관리 (0) | 2022.05.17 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!