쿠버네티스

[클라우드] 2. Kubernetes namespace

트리스탄1234 2022. 8. 27. 10:01
728x90
반응형

이번 포스팅에서는 Kubernetes에서 가상 클러스터 기능인 Namespace에 대해서 포스팅을 해보겠습니다.

위의 그림에서 보면, 서로 같은 색깔의 Pod들은 같은 Namespace에 존재를 하게 됩니다. 하나의 node안에서 namespce를 이용해 여러개의 클러스터를 만들고. 각 Node간에 같은 namespace끼리는 통신이 되는, 즉 가상의 cluster의 기능을 제공 합니다.

즉 가상의 클러스터로 분류가 가능하게 만들어 주는것이 Namespace 입니다 그럼 Namespace를 어떻게 생성하고 생성된 Namespace에 어떻게 Pod를 배포를 하는지 한번 알아 보겠 습니다.

우선 Kubernetes를 설치를 하고 나면 아래와 같이 기본 Napespace가 생성이 됩니다.

설치방법은 이전 글을 참고 하시기 바랍니다 .

root@master-VirtualBox:~# kubectl get namespaces
NAME STATUS AGE
default Active 4h35m
kube-node-lease Active 4h35m
kube-public Active 4h35m
kube-system Active 4h35m

각각의 기능을 살펴 보면 아래와 같습니다.

  • degault : Object를 생성할때 namespace의 값을 주지 않으면 할당되는 namespace 입니다.
  • kube-system : Kubernetes Contorl Node로 부터 생성된 객체의 Namespace 입니다.
  • kube-node-lease: 각 노드와 연관된 lease 오브젝트를 갖습니다. 노드 리스는 kubelet이 heart bit를 보내서 컨트롤 플레인이 노드의 장애를 탐지할 수 있게 해줍니다.
  • kube-public: 네임스페이스는 자동으로 생성되며 모든 사용자(인증되지 않은 사용자 포함)가 읽기 권한으로 접근할 수 있다. 이 네임스페이스는 주로 전체 클러스터 중에 공개적으로 드러나서 읽을 수 있는 리소스를 위해 사용 됩니다.

그럼 이제 namespace를 어떻게 생성하고 관리하는지 알아 보겠 습니다.

Kubernetes에서는 Object를 생성하는 방법에는 아래와 같이 3가지가 있습니다.

  • API를 통해 Requst 메서드를 이용해 Object 생성
  • kubectl 명령어를 이용한 Object 생성
  • kubectl 명령어와 YAML 파일을 이용한 Object 생성

여기서는 YAML 파일을 이용해 생성하는 방벙으로 진해을 해보겠습니다.

YAML 파일의 구조나 각 파라메터에 대한 설명은 추후 포스팅 하도록 하겠습니다.

그럼 개발 시스템을 수용할수 있는 클러스터인 Deployment와 실제 서비스를 제공하는 production namespace를 생성하고 여기에 Pod를 배포 하는 순서로 진행 하겠 습니다.

우선 test 디렉토리 밑에 namespace 디렉토리를 만들고, 거기에 dev.yaml파일과 prod.yaml 파일을 만들어 보겠습니다.

root@master-VirtualBox:~# mkdir /test/namespace
root@master-VirtualBox:~# cd /test/namespaces/
root@master-VirtualBox:~/namespaces# vi namespace-dev.yaml

namespac-dev.yaml 파일에 아래 내용을 vi를 사용하여 입력 후 저장 합니다.

apiVersion: v1 ==> API Version 1을 이요
kind: Namespace ==> 생성하는 Object가 namespace 임을 정의
metadata:
name: development ==> namespace의 이름을 deployment로 정의
labels:
name: development ==> namespace의 관리 level의 이름을 정의

이제 namespace-prod-yaml 파일을 vi를 통해 생성하고 파일에 아래의 내용을 입력 후 저장 합니다.

root@master-VirtualBox:~/namespaces# vi namespace-prod.yaml
apiVersion: v1 ==> API Version 1을 이요
kind: Namespace ==> 생성하는 Object가 namespace 임을 정의
metadata:
name: production ==> namespace의 이름을 deployment로 정의
labels:
name: production ==> namespace의 관리 level의 이름을 정의

이제 kubernetes 명령을 사용해 yaml 파일을 사용하여 Object를 생성 합니다.

root@master-VirtualBox:~# kubectl apply -f namespaces/
namespace/development created
namespace/production created

Kubectl 명령을 사용하여 생성된 namespace를 조회해 봅니다.

root@master-VirtualBox:~# kubectl get namespaces --show-labels
NAME STATUS AGE LABELS
default Active 5h58m kubernetes.io/metadata.name=default
development Active 26s kubernetes.io/metadata.name=development,name=development
kube-node-lease Active 5h58m kubernetes.io/metadata.name=kube-node-lease
kube-public Active 5h58m kubernetes.io/metadata.name=kube-public
kube-system Active 5h58m kubernetes.io/metadata.name=kube-system
production Active 26s kubernetes.io/metadata.name=production,name=production

Kubernetes는 클러스터 정보를 관리하는 파일이 있습니다. 클러스터 정보를 조회해 보겠습니다.

root@master-VirtualBox:~# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
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: REDACTED
client-key-data: REDACTED

위의 파일 내용을 보면. 현재 클러스터 Context에는 kubernetes라는 기본 context만 생성이 되어 있습니다. 여기에 앞에 생성한 namespace인 deployment와 production을 추가해 보겠습니다.

root@master-VirtualBox:~# kubectl config set-context dev --namespace=development --cluster=kubernetes --user=kubernetes-admin
Context "dev" created.
root@master-VirtualBox:~# kubectl config set-context prod --namespace=production --cluster=kubernetes --user=kubernetes-admin
Context "prod" created.

그럼 이제 다시 클러스터 context 정보를 조회를 해보겠습니다.

root@master-VirtualBox:~# kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
name: kubernetes
contexts:
- context:
cluster: kubernetes
namespace: deployment
user: kubernetes-admin
name: dev
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
- context:
cluster: kubernetes
namespace: production
user: kubernetes-admin
name: prod
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: REDACTED
client-key-data: REDACTED

위의 파일에서 빨간색 부분과 같이 추가로 develpoment와 production이라는 2개의 namespace가 context에 추가될 것을 볼수 있습니다. 이 2개의 Context는 서로 격리된 가상의 공간을 제공을해서, develpoment에서 생성된 Object는 production context에서 생성된 Obejct와는 통신이 불가능 하게 합니다.

context간의 전환 즉. dev에 생성을 하려면 현재 context를 dev로 전환을 해야 되고, prod에 생성을 하려면 현재의 context가 prod 상태에서 yaml파일을 배포해야 합니다. context간 전환 명령은 아래와 같습니다.

root@master:/lab/namespace# kubectl config use-context dev ==> dev context로 전환
Switched to context "dev".
root@master:/lab/namespace# kubectl config current-context ==> 현재 context를 조회
dev

위의 내용과 같이 현재 사용하고 있는 context는 dev namespace이고, 이 상태에서 deployment yaml파일을 이용해 pod 2개를 생성을 해보겠습니다. vi 명령을 사용해서 development.yaml 파일을 생성하여 아래 내용을 입력 후 저장 합니다

root@master-VirtualBox:~# vi deployment.yaml
apiVersion: apps/v1 ==> API Version 1 사용
kind: Deployment ==> 배포 Object의 type은 deployment
metadata:
name: httpd-deployment
labels:
app: httpd-deployment ==> 관리 lebels 이름 정의
spec:
replicas: 2 ==> 몇개의 Object를 생성할지 정의
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: httpd-deployment
template:
metadata:
labels:
app: httpd-deployment
spec:
containers:
- image: ethos93/go-httpd:v1 ==> 생성할 컨테이너의 이미지 정의
imagePullPolicy: Always
name: httpd-deployment ==> 컨테이너 이름 정의
ports:
- containerPort: 80 ==> 사용할 port번호 정의
protocol: TCP ==> 사용할 port 번호 정의

위의 그림과 같이 생성 후 아래와 같이 yaml파일을 배포 합니다.

root@master-VirtualBox:~/replicaset# kubectl apply -f deployment.yaml
deployment.apps/httpd-deployment created

그럼 이제 생성된 Pod에 대한 상태를 조회해 보겠습니다.

root@master-VirtualBox:~/replicaset# kubectl get pods
NAME READY STATUS RESTARTS AGE
httpd-deployment-d7977cc69-hnjg9 1/1 Running 0 2m17s ==> run 상태로 정상 운영
httpd-deployment-d7977cc69-mvn8t 1/1 Running 0 2m17s ==> run 상태로 정상 운영

여기서, 어느 pod가 어느 node에서 운영 중인지 조회를 해보겠습니다.

root@master-VirtualBox:~/replicaset# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
httpd-deployment-d7977cc69-hnjg9 1/1 Running 0 2m34s 172.16.7.129 worknode2-virtualbox <none> <none>
httpd-deployment-d7977cc69-mvn8t 1/1 Running 0 2m34s 172.16.168.195 worknode1-virtualbox <none> <none>

위에서 생성된 pod는 앞에서 언급한것 처럼, kubectl use-context prod 명령어로 prod namespace상태에서 조회를 하면 보이지 않습니다. 즉 dev namespace에 있을 경우에만 보여지게 됩니다.

 

728x90
반응형