네임스페이스를 사용한 워크로드 격리

KubernetesBeginner
지금 연습하기

소개

Kubernetes 는 클러스터 내에서 워크로드와 리소스를 격리하는 방법으로 네임스페이스 (namespace) 를 제공합니다. 이 랩에서는 네임스페이스를 사용하여 워크로드와 리소스를 격리하는 방법을 배우게 됩니다. 네임스페이스를 생성하고, 해당 네임스페이스에 간단한 웹 애플리케이션을 배포하며, 웹 애플리케이션이 클러스터의 다른 리소스와 격리되었는지 확인합니다.

Minikube 클러스터 시작

리소스를 생성하기 전에, 실행 중인 Kubernetes 클러스터가 필요합니다. Minikube 는 로컬 머신에서 실행되는 경량 Kubernetes 환경입니다.

  1. 작업 디렉토리로 이동:

    터미널을 열고 기본 프로젝트 폴더로 이동합니다:

    cd /home/labex/project
    
  2. Minikube 시작:

    Kubernetes 클러스터를 초기화하기 위해 Minikube 를 시작합니다:

    minikube start
    
    • 이 명령어는 로컬 머신에 단일 노드 Kubernetes 클러스터를 설정합니다.
    • Minikube 는 시스템 성능에 따라 시작하는 데 몇 분 정도 걸릴 수 있습니다.
  3. Minikube 가 실행 중인지 확인:

    Minikube 클러스터의 상태를 확인합니다:

    minikube status
    
    • kubeletapiserver와 같은 구성 요소가 Running으로 나열되어 있는지 확인합니다.
    • 클러스터가 실행 중이지 않으면 minikube start를 다시 실행합니다.

Minikube 를 시작하는 데 문제가 발생하면, 필요에 따라 minikube delete를 사용하여 환경을 재설정하십시오.

네임스페이스 생성

이 단계에서는 클러스터의 다른 리소스에서 웹 애플리케이션을 격리하기 위해 webapp이라는 네임스페이스를 생성합니다.

다음 내용으로 namespace.yaml이라는 파일을 생성합니다:

apiVersion: v1
kind: Namespace
metadata:
  name: webapp

다음 명령을 사용하여 네임스페이스를 클러스터에 적용합니다:

kubectl apply -f namespace.yaml

다음 명령을 사용하여 네임스페이스가 생성되었는지 확인합니다:

kubectl get namespaces

네임스페이스 목록에서 webapp 네임스페이스를 볼 수 있습니다.

웹 애플리케이션 배포

이 단계에서는 webapp 네임스페이스에 간단한 웹 애플리케이션을 배포합니다.

다음 내용으로 web-app.yaml이라는 파일을 생성합니다:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
  namespace: webapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

이 파일은 최신 버전의 Nginx 웹 서버를 실행하는 컨테이너의 레플리카 (replica, 복제본) 가 하나인 Deployment 를 생성합니다.

다음 명령을 사용하여 Deployment 를 클러스터에 적용합니다:

kubectl apply -f web-app.yaml

다음 명령을 사용하여 웹 애플리케이션이 webapp 네임스페이스에서 실행 중인지 확인합니다:

kubectl get pods -n webapp

webapp 네임스페이스에서 실행 중인 파드 (pod) 목록에서 web-app 파드를 볼 수 있습니다.

웹 애플리케이션 노출 (Expose)

이 단계에서는 Kubernetes Service 를 사용하여 웹 애플리케이션을 외부 세계에 노출합니다.

다음 내용으로 web-app-service.yaml이라는 파일을 생성합니다:

apiVersion: v1
kind: Service
metadata:
  name: web-app
  namespace: webapp
spec:
  selector:
    app: web-app
  ports:
    - name: http
      port: 80
      targetPort: 80
  type: ClusterIP

이 파일은 ClusterIP 를 사용하여 웹 애플리케이션을 클러스터에 노출하는 Service 를 생성합니다.

다음 명령을 사용하여 Service 를 클러스터에 적용합니다:

kubectl apply -f web-app-service.yaml

다음 명령을 사용하여 Service 가 webapp 네임스페이스에서 실행 중인지 확인합니다:

kubectl get services -n webapp

webapp 네임스페이스에서 실행 중인 서비스 목록에서 web-app 서비스를 볼 수 있습니다.

네임스페이스 격리 확인

이 단계에서는 웹 애플리케이션이 클러스터의 다른 리소스와 격리되어 있는지 확인합니다.

다음 내용으로 other-app.yaml이라는 파일을 생성합니다:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: other
spec:
  replicas: 1
  selector:
    matchLabels:
      app: other
  template:
    metadata:
      labels:
        app: other
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80

이 파일에서는 nginx 이미지를 사용하는 컨테이너를 실행하는 default 네임스페이스에 other라는 다른 Deployment 를 생성합니다.

다음 명령을 사용하여 Deployment 를 클러스터에 적용합니다:

kubectl apply -f other-app.yaml

다음 명령을 사용하여 Deployment 가 default 네임스페이스에서 실행 중인지 확인합니다:

kubectl get pods | grep other

default 네임스페이스에서 실행 중인 파드 목록에서 other 파드를 볼 수 있습니다.

네임스페이스 간 접근 확인

먼저, 다음 명령을 실행하여 애플리케이션이 실행 중인 파드의 이름을 찾습니다.

kubectl get pods -l app=other

other 파드를 확인해야 합니다. 파드의 이름을 기록해 두십시오.

다음으로, 애플리케이션이 실행 중인 컨테이너에서 셸 세션을 열기 위해 다음 명령을 실행합니다.

kubectl exec -it pod-name -- /bin/sh

<pod-name>을 앞서 기록해 둔 파드의 이름으로 바꿉니다.

셸 세션에 접속한 후, 다음 명령을 실행하여 web-app Deployment 에 접근합니다.

curl web-app.webapp

Nginx 웹 서버에서 HTML 응답을 확인해야 합니다.

요약

이 랩에서는 Kubernetes 클러스터에서 네임스페이스를 사용하여 워크로드 (workload) 와 리소스를 격리하는 방법을 배웠습니다. 네임스페이스를 생성하고, 해당 네임스페이스에 간단한 웹 애플리케이션을 배포했으며, Kubernetes Service 를 사용하여 웹 애플리케이션을 외부 세계에 노출하고, 웹 애플리케이션이 클러스터의 다른 리소스와 격리되어 있는지 확인했습니다.