Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의의 41. Namespaces 챕터를 공부한 내용으로 강의 내용과 다를 수 있습니다. 정확한 내용은 강의를 들으시는 것을 추천드립니다.
1. Namespace
1) Namespace란?
Mark Smith 와 Williams Mark라는 두 소년이 있는데 이 소년들은 각자의 집 안에서 가족들은 단순히 이름 부른다. 그러나 원한다면 다른 집에 있는 Mark를 부르기 위해 성을 붙여 부를 수 있다. 집 외부 사람은 성을 붙여야한다. 각 집에는 고유한 규칙이 있어 누가 뭘 할지 정하고, 소비할 수 있는 자체 자원이 정해져 있다.
위에서 말한 각자의 집은 Kubernetes에서 namespace에 해당한다. 지금까지의 과정에서 우리는 pod, deployment, service와 같은 객체들을 생성했다. 그 동안 어떤 객체던 하나의 NameSpace안에서 만들어 졌다. 이 NameSpace는 우리가 따로 설정하지 않았기에 default namespace라고 한다. Default namespace는 클러스터가 처음 설정될 때 Kubernetes에 의해 자동으로 생성된다.
kubernetes는 네트워킹 솔루션이나 DNS 서비스 등 내부 목적으로 pod와 service들을 생성한다. Kubernetes는 이것들을 사용자가 실수로 삭제하거나 수정하는 것을 방지하기 위해 다른 namespace인 kube-system안에 service들을 생성 해 유저로부터 격리한다. 쿠버네티스가 자동으로 만든 세 번째 NameSpace는 kube-public로 모든 사용자가 사용할 수 있도록 해야하는 자원이 생성되는 곳이다.
규모가 작은 환경에서는 namespace에 대해 걱정하지 않고 default namespace에서 작업해도 된다. 그러나 Kubernetes 클러스터를 기업에서 운영 할 경우 namespace 사용을 고려해야한다. 예를 들어 개발 및 운영 두 환경에서 동일한 클러스터를 사용하려는 경우에는, 리소스를 격리하려는 목적으로 각각에 대한 고유한 namespace를 만들 수 있다. 이렇게 하면 개발 환경에서 작업하는 동안 실수로 운영 환경 자원을 수정하는 일을 방지 할 수 있다.
이러한 각 namespace는 누가 무엇을 할 수 있는지 정의하고, 자원 할당량을 할당하는 고유한 정책을 가질 수 있다. 자원 사용량을 할당하면 각 네임스페이스가 허용 한도 이상의 자원을 사용하지 않는다.
2) DNS
default namespace에서 namespace내의 자원은 서로를 이름만으로 참조 할 수 있다. 웹 애플리케이션 pod는 "db-service"라는 호스트 이름만을 통해 DB 서비스에 접근할 수 있다. 필요한 경우 "servicename.namespace.svc.cluster.local" 형식을 사용 다른 namespace의 서비스에 접근할 수 있다. 서비스 이름에 네임스페이스 이름을 추가된다. 예를 들어 default namespace 의 웹 파드의 경우, 개발 환경에서 데이터베이스에 연결하기 위해 "dbservice.dev.svc.cluster.local"으로 부르게 된다.
서비스가 생성될 때, DNS 항목은 이 형식으로 자동으로 추가되기에 다른 namespace의 pod를 참조 할 수 있다. 서비스의 DNS 이름 마지막 부분에 "cluster.local"은 kubernetes 클러스터의 default 도메인 이름이다. svc는 namespace뒤에 오며, service의 하위 도메인이다. 가장 앞에는 service 자체의 이름이 온다.
2. Namespace 다뤄보기
1) Namespace 지정하기
아래 커맨드는 모든 파드를 조회하는 데 사용하는 것으로 배웠는데, 사실은 default namespace에 있는 파드만 조회된다.
$ kubectl get pods
다른 namespace에 있는 pod를 조회하려면 커맨드에 namespace 옵션을 함께 사용하면 된다.
$ kubectl get pods --namespace=kube-system
하단 Pod 설정을 사용해 pod를 생성하면 default namespace에 생성된다.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
다른 namespace pod를 생성하고 싶으면 하단과 같이 namespace 옵션을 사용하면 된다.
$ kubectl create -f pod-definition.yml --namespace=dev
항상 커맨드에 namespace 옵션을 붙이지 않아도 pod 정의 파일의 metadata 아래에 namespace 정의를 넣으면 namespace를 지정 할 수 있다. 이는 자원이 항상 동일한 namespace 에 생성되도록 보장하는 좋은 방법이다.
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
namespace: dev
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
2) Namespace 생성하기
NameSpace를 생성 할 때 다른 객체들을 생성하는 것과 동일하게 nameSpace 정의 파일을 사용한다.
apiVersion: v1
kind: NameSpace
metadata:
name: dev
kubectl create -f 명령어로 namespace를 생성한다.
$ kubectl create -f namespace-dev.yaml
혹은 정의 파일을 만들지 않아도 아래 커맨드만 실행하면 된다.
$ kubectl create namespace dev
3) Namespace 조회하기
세 개의 Namespace에서 작업한다고 가정해보면, 우리는 기본적으로 default namespace에 있기 때문에 kuectl get pods 커맨드를 입력하면 리소스를 확인할 수 있다. 다른 namespace에 있는 리소스를 보려면 namespace 옵션을 사용해야 한다.
만약 dev namespace를 지정하지 않아도 되도록 namespace를 전환하고 싶다면 "kubectl config set-context $(kubectl config current-context) --namespace=dev" 명령어를 사용하면 된다. 이 커맨드를 실행하면 현재 컨텍스트의 Namespace를 dev로 설정한다. 이 작업 후 "kubectl get pods"를 실행하면 namespace 옵션 없이도 dev 환경에 있는 pod를 조회할 수 있다. 마찬가지로 pord namespace로 전환할 수 있다.
마지막으로 모든 namespace에서 모든 Pod를 확인하고 싶다면, "kubectl get pods --all-namespaces" 명령어를 사용하면 된다.
"kubectl config set-context $(kubectl config current-context) --namespace=dev" 명령어는 먼저 현재 context를 식별하고 현재 context 에 대해 Namespace를 원하는 것으로 설정합니다. context 는 여러 클러스터와 환경을 관리하는데 사용된다. 동일한 관리 시스템의 여러 환경을 논의하는 것은 완전히 별개의 주제라 context 에 대해서는 다른 강의에서 다룬다.
4) 자원 할당량
namespace에서 자원 사용량을 제한하려면 자원 할당량 설정 파일을 만들면 된다. 자원 할당량에 대한 설정 파일에서 할당량을 줄 namespace를 지정하고 사양에 따라 10개의 파드, 10개의 CPU 유닛,10GB 바이트의 메모리 등과 같이 할당량을 조정한다.
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: dev
spec:
hard:
pods: "10"
requests.cpu: "4"
requests.memory: 5Gi
limits.cpu: "10"
limits.memory: 10Gi
그 뒤 kubectl create 명령어를 사용하면 된다.
$ kubectl create -f compute-quota.yaml
'IT 강의 > 도커 쿠버' 카테고리의 다른 글
[NHN 교육] NHN Cloud로 kubernetes 기초 다지기 (0) | 2024.07.08 |
---|---|
[CKA 강의 요약] Practice Test - Deployments, Solution - Deployments (Optional) (0) | 2024.07.02 |
[CKA 강의 요약] Practice Test - Services (0) | 2024.06.27 |
[CKA 강의 요약] Services - Loadbalancer (0) | 2024.06.25 |
[CKA 강의 요약] Services Cluster IP (0) | 2024.06.20 |