네임스페이스 워크스루
네임스페이스 워크스루 (Namespaces Walkthrough)
쿠버네티스 네임스페이스는 서로 다른 프로젝트, 팀, 또는 고객이 쿠버네티스 클러스터를 공유하도록 도와줘요. 다음을 제공함으로써 이 역할을 해요.
- 이름(Name)의 범위
- 클러스터의 일부에 인가와 정책을 부착하는 메커니즘
여러 네임스페이스의 사용은 선택적이에요. 이 예시는 쿠버네티스 네임스페이스를 사용해 클러스터를 세분화하는 방법을 보여드려요.
출처: 문서
본문
시작하기 전에 (Before you begin)
쿠버네티스 클러스터가 필요하고, kubectl 명령줄 도구가 클러스터와 통신하도록 구성돼 있어야 해요. 이 튜토리얼은 컨트롤 플레인 호스트가 아닌 노드가 두 개 이상 있는 클러스터에서 실행하는 것을 권장해요. 아직 클러스터가 없다면 minikube로 만들거나 다음 쿠버네티스 플레이그라운드 중 하나를 사용할 수 있어요.
- iximiuz Labs
- Killercoda
- KodeKloud
버전을 확인하려면 kubectl version을 입력하세요.
전제 조건 (Prerequisites)
이 예시는 다음을 가정해요.
- 기존 쿠버네티스 클러스터가 있음
- 쿠버네티스 Pod, Service, Deployment에 대한 기본 이해가 있음
기본 네임스페이스 이해하기 (Understand the default namespace)
기본적으로 쿠버네티스 클러스터는 클러스터가 사용하는 기본 Pod, Service, Deployment 집합을 담기 위해 프로비저닝할 때 default 네임스페이스를 만든다. 새 클러스터가 있다고 가정하면 다음으로 사용 가능한 네임스페이스를 검사할 수 있어요.
kubectl get namespaces
NAME STATUS AGE
default Active 13m
새 네임스페이스 만들기 (Create new namespaces)
이 실습에서는 콘텐츠를 담을 두 개의 추가 쿠버네티스 네임스페이스를 만들 거예요.
조직에서 개발과 프로덕션 사용 사례에 공유 쿠버네티스 클러스터를 사용하는 시나리오를 상상해 보죠.
- 개발 팀은 애플리케이션을 빌드하고 실행하는 데 사용하는 Pod, Service, Deployment 목록에 대한 보기를 얻을 수 있는 클러스터 공간을 유지하고 싶어해요. 이 공간에서는 쿠버네티스 리소스가 생겼다 사라지고, 리소스를 수정할 수 있는지에 대한 제한은 민첩한 개발을 가능하게 하기 위해 완화돼 있어요.
- 운영 팀은 프로덕션 사이트를 실행하는 Pod, Service, Deployment 집합을 조작할 수 있는 사람을 엄격한 절차로 강제할 수 있는 클러스터 공간을 유지하고 싶어해요.
이 조직이 따를 수 있는 한 패턴은 쿠버네티스 클러스터를 development와 production 두 네임스페이스로 분할하는 것이에요.
작업을 담을 두 개의 새 네임스페이스를 만들어 보죠.
development 네임스페이스를 설명하는 namespace-dev.yaml 파일을 사용해요.
apiVersion: v1
kind: Namespace
metadata:
name: development
labels:
name: development
admin/namespace-dev.yaml — kubectl을 사용해 development 네임스페이스를 생성해요.
kubectl create -f https://k8s.io/examples/admin/namespace-dev.yaml
production 네임스페이스를 설명하는 다음 내용을 namespace-prod.yaml 파일에 저장해요.
apiVersion: v1
kind: Namespace
metadata:
name: production
labels:
name: production
admin/namespace-prod.yaml — 그리고 kubectl을 사용해 production 네임스페이스를 생성해요.
kubectl create -f https://k8s.io/examples/admin/namespace-prod.yaml
확실히 하기 위해 클러스터의 모든 네임스페이스를 나열해 보죠.
kubectl get namespaces --show-labels
NAME STATUS AGE LABELS
default Active 32m <none>
development Active 29s name=development
production Active 23s name=production
각 네임스페이스에 파드 만들기 (Create pods in each namespace)
쿠버네티스 네임스페이스는 클러스터의 Pod, Service, Deployment의 범위를 제공해요. 한 네임스페이스와 상호작용하는 사용자는 다른 네임스페이스의 콘텐츠를 보지 못해요.
이것을 보여주기 위해 development 네임스페이스에 간단한 Deployment와 Pod를 띄워 보죠.
먼저 현재 컨텍스트가 무엇인지 확인해요.
kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: REDACTED
server: https://130.211.122.180
name: lithe-cocoa-92103_kubernetes
contexts:
- context:
cluster: lithe-cocoa-92103_kubernetes
user: lithe-cocoa-92103_kubernetes
name: lithe-cocoa-92103_kubernetes
current-context: lithe-cocoa-92103_kubernetes
kind: Config
preferences: {}
users:
- name: lithe-cocoa-92103_kubernetes
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
token: 65rZW78y8HbwXXtSXuUw9DbP4FLjHi4b
- name: lithe-cocoa-92103_kubernetes-basic-auth
user:
password: h5M0FtUUIflBSdI7
username: admin
kubectl config current-context
lithe-cocoa-92103_kubernetes
다음 단계는 kubectl 클라이언트가 각 네임스페이스에서 동작하도록 컨텍스트를 정의하는 것이에요. "cluster"와 "user" 필드의 값은 현재 컨텍스트에서 복사돼요.
kubectl config set-context dev --namespace=development \
--cluster=lithe-cocoa-92103_kubernetes \
--user=lithe-cocoa-92103_kubernetes
kubectl config set-context prod --namespace=production \
--cluster=lithe-cocoa-92103_kubernetes \
--user=lithe-cocoa-92103_kubernetes
기본적으로 위 명령은 파일 .kube/config에 저장되는 두 컨텍스트를 추가해요. 이제 컨텍스트를 볼 수 있고, 작업하려는 네임스페이스에 따라 두 개의 새 요청 컨텍스트를 오가며 사용할 수 있어요.
새 컨텍스트를 보려면:
kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: REDACTED
server: https://130.211.122.180
name: lithe-cocoa-92103_kubernetes
contexts:
- context:
cluster: lithe-cocoa-92103_kubernetes
user: lithe-cocoa-92103_kubernetes
name: lithe-cocoa-92103_kubernetes
- context:
cluster: lithe-cocoa-92103_kubernetes
namespace: development
user: lithe-cocoa-92103_kubernetes
name: dev
- context:
cluster: lithe-cocoa-92103_kubernetes
namespace: production
user: lithe-cocoa-92103_kubernetes
name: prod
current-context: lithe-cocoa-92103_kubernetes
kind: Config
preferences: {}
users:
- name: lithe-cocoa-92103_kubernetes
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
token: 65rZW78y8HbwXXtSXuUw9DbP4FLjHi4b
- name: lithe-cocoa-92103_kubernetes-basic-auth
user:
password: h5M0FtUUIflBSdI7
username: admin
development 네임스페이스에서 동작하도록 전환해요.
kubectl config use-context dev
다음을 실행해 현재 컨텍스트를 확인할 수 있어요.
kubectl config current-context
dev
이 시점부터 우리가 명령줄에서 쿠버네티스 클러스터에 하는 모든 요청은 development 네임스페이스로 범위가 지정돼요.
콘텐츠를 조금 만들어 보죠.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: snowflake
name: snowflake
spec:
replicas: 2
selector:
matchLabels:
app: snowflake
template:
metadata:
labels:
app: snowflake
spec:
containers:
- image: registry.k8s.io/serve_hostname
imagePullPolicy: Always
name: snowflake
admin/snowflake-deployment.yaml — 매니페스트를 적용해 Deployment를 만들어요.
kubectl apply -f https://k8s.io/examples/admin/snowflake-deployment.yaml
호스트네임을 서빙하는 기본 컨테이너가 있는 snowflake라는 파드를 실행하는, 복제본 크기 2의 디플로이먼트를 만들었어요.
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
snowflake 2/2 2 2 2m
kubectl get pods -l app=snowflake
NAME READY STATUS RESTARTS AGE
snowflake-3968820950-9dgr8 1/1 Running 0 2m
snowflake-3968820950-vgc4n 1/1 Running 0 2m
이것은 좋아요. 개발자들은 원하는 것을 할 수 있고, production 네임스페이스의 콘텐츠에 영향을 줄 걱정을 하지 않아도 돼요.
production 네임스페이스로 전환해 한 네임스페이스의 리소스가 다른 네임스페이스로부터 어떻게 숨겨지는지 보여드릴게요.
kubectl config use-context prod
production 네임스페이스는 비어 있어야 하고, 다음 명령은 아무것도 반환하지 않아야 해요.
kubectl get deployment
kubectl get pods
Production은 소(cattle)를 실행하는 것을 좋아해요. 소 파드를 조금 만들어 보죠.
kubectl create deployment cattle --image=registry.k8s.io/serve_hostname --replicas=5
kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
cattle 5/5 5 5 10s
kubectl get pods -l app=cattle
NAME READY STATUS RESTARTS AGE
cattle-2263376956-41xy6 1/1 Running 0 34s
cattle-2263376956-kw466 1/1 Running 0 34s
cattle-2263376956-n4v97 1/1 Running 0 34s
cattle-2263376956-p5p3i 1/1 Running 0 34s
cattle-2263376956-sxpth 1/1 Running 0 34s
이 시점에서 사용자가 한 네임스페이스에서 만든 리소스는 다른 네임스페이스로부터 숨겨진다는 것이 분명해요. 쿠버네티스의 정책 지원이 발전함에 따라, 각 네임스페이스에 서로 다른 인가 규칙을 제공하는 방법을 보여주도록 이 시나리오를 확장할 거예요.