쿠버네티스(k8s)에 대해

쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 자동 배포, 스케일링, 운영을 관리하기 위한 오픈소스 플랫폼입니다. Google에서 시작하여 CNCF(Cloud Native Computing Foundation)에서 관리하고 있으며, 복잡한 애플리케이션 환경을 효율적으로 운영할 수 있게 해줍니다.

 

왜 등장했는가?

컨테이너 기술(예: Docker)은 애플리케이션과 그 의존성을 패키징하여 어디서나 일관되게 실행할 수 있게 해줍니다. 하지만 여러 컨테이너를 관리하거나 서비스를 확장하고 장애를 복구하는 작업은 매우 복잡합니다. 이러한 문제를 해결하기 위해 쿠버네티스가 등장했습니다.

주요 목적:

  1. 확장성: 사용자가 증가할 때 자동으로 인스턴스를 늘리거나 줄여 자원을 효율적으로 사용.
  2. 복구 자동화: 장애가 발생한 컨테이너를 자동으로 재시작하거나 교체.
  3. 애플리케이션의 이식성: 클라우드 환경이나 온프레미스 등 다양한 환경에서 일관된 동작 보장.
  4. 운영 간소화: 복잡한 컨테이너화 애플리케이션을 자동으로 관리.

 

쿠버네티스의 주요 기능

  1. 컨테이너 오케스트레이션:
    • 여러 컨테이너를 그룹화하고 조정하여 서비스 운영.
  2. 자동 스케일링:
    • 애플리케이션 부하에 따라 컨테이너를 자동으로 늘리거나 줄임.
  3. 서비스 복구:
    • 문제가 있는 컨테이너를 자동으로 교체하거나 종료.
  4. 로드 밸런싱:
    • 여러 컨테이너로 들어오는 요청을 분산 처리.
  5. 컨피그 및 시크릿 관리:
    • 환경 변수, 설정 파일, 보안 정보(비밀번호 등)를 안전하게 관리.

 

클러스터 구성

쿠버네티스는 클러스터(cluster) 구조로 작동하며, 다음과 같은 컴포넌트로 구성됩니다:

  • Master Node: 클러스터의 제어를 담당.
  • Worker Node: 실제 애플리케이션 컨테이너가 실행되는 노드.

 

쿠버네티스 사용 방법

쿠버네티스 설치

🔗 기본환경 설치 Links:

Install Minikube (Mac, Linux and Windows): https://bit.ly/38bLcJy
Install Kubectl: https://bit.ly/32bSI2Z
맥 환경에서 가이드: https://bit.ly/3oZzuHY

 

설치 작업

Homebrew 최신화

brew update

 

hyperkit(macOS 환경에서 경량화된 하이퍼바이저(Hypervisor)를 제공하기 위해 설계된 툴) 설치

brew install hyperkit

#hyperkit 설치가 안된다면 qemu 설치
brew install qemu

 

minikube 설치

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64
sudo install minikube-darwin-amd64 /usr/local/bin/minikube

 

minikube 시작

minikube start --vm-driver=hyperkit

 

기본 명령어

쿠버네티스 클러스터에서 현재 등록된 노드(Node) 목록을 조회

$kubectl get nodes

NAME       STATUS   ROLES           AGE   VERSION

minikube   Ready    control-plane   13m   v1.31.0

 

Minikube 클러스터의 현재 상태를 확인

$minikube status

minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

 

쿠버네티스 버전 확인

$kubectl version

Client Version: version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.0", GitCommit:"4ce5a8954017644c5420bae81d72b09b735c21f0", GitTreeState:"clean", BuildDate:"2022-05-03T13:46:05Z", GoVersion:"go1.18.1", Compiler:"gc", Platform:"darwin/amd64"}
Kustomize Version: v4.5.4


Deployment 리소스를 생성, Nginx 이미지를 사용하는 Pod 배포

kubectl create deployment nginx-depl --image=nginx

 

쿠버네티스 Pod 목록 조회

$kubectl get pod

 

Deployment를 편집할 수 있는 인터페이스 열기

$kubectl edit deployment nginx-depl

 

현재 클러스터에 있는 ReplicaSet 리소스를 조회

kubectl get replicaset

 

Pod 디버깅

쿠버네티스  Pod 로그 조회

kubectl logs <Pod name>

 

쿠버네티스 Pod 상세 보기

kubectl describe pod

 

결과)

 

 

쿠버네티스 Pod에 접속

kubectl exec -it <Pod name> -- bin/bash

 

쿠버네티스 deployment 삭제

kubectl delete deployment <dep name>

 

 

YAML 파일 작성

YAML 파일 기본 구조

apiVersion: <API 버전>
kind: <리소스 종류>
metadata:
  name: <리소스 이름>
  namespace: <네임스페이스> # (선택 사항)
spec:
  <리소스의 세부 사양>

 

nginx 기본 yaml 파일 참고

더보기
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16
        ports:
        - containerPort: 8080

 

Yaml 파일 deployment 적용 및 삭제

kubectl apply -f <yaml file>

#삭제
kubectl delete -f <yaml file>

 

 

 

 

키워드 요약 설명

* SSL (Secure Sockets Layer)

인터넷 통신에서 데이터를 암호화하여 안전하게 전송하는 프로토콜. SSL은 TLS로 대체되었으며, 현재는 더 이상 사용되지 않음.

 

* TLS (Transport Layer Security)

SSL의 후속 버전으로 더 안전하고 효율적인 암호화 프로토콜.

 

 

적용 환경

버전 : Amazon Linux release 2023.5.20240722 (Amazon Linux)

 

Python기반의 웹 애플리케이션 프레임워크인 'Reflex'를 AWS에 셀프호스팅을 진행중이다.

Reflex 소스코드를 받아 환경설정을 하고 production모드 실행까지 성공했으나, https 적용을 위해 TLS를 적용해야 하는 단계.

 

Reflex에서 직접 https를 다룰 수 있는 기능은 없으며, reverse proxy구조를 이용하여 Nginx를 거쳐서 인증하도록 해야한다.

 

nginx 설치

sudo yum install nginx

 

Nginx 설치 후 설정 진행

 

Nginx 명령어

sudo systemctl start nginx  // 실행
sudo systemctl status nginx  // 상태 조회
sudo systemctl stop nginx  // 중지

 

Nginx 설정파일 경로 : /etc/nginx/nginx.conf

* /etc/nginx/nginx.conf 파일에 오류가 있다면 아래 메시지 발생

Job for nginx.service failed because the control process exited with error code.
See "systemctl status nginx.service" and "journalctl -xeu nginx.service" for details.

 

 

EPEL, Certbot 설치

아마존(AMI3)의 보안정책이 바뀌면서 amazone linux에서는 certbot만 설치 하지 못하고 nginx를 이용해서 설치해야 한다.

 

인증서 구조

Browser <-- HTTPS --> Nginx <-- HTTP --> Reflex App

 

시스템 종속성 설치

sudo dnf install python3 augeas-libs

 

가상환경 설정

sudo python3 -m venv /opt/certbot/

sudo /opt/certbot/bin/pip install --upgrade pip

 

Certbot그리고 Certbot Nginx 플러그인 을 가상환경에 설치

/opt/certbot/bin/pip install certbot certbot-nginx

 

 

certbot을 이용해서 nginx에 SSL 인증서를 적용

/etc/nginx/nginx.conf 수정

server {
    listen 80;
    # 구입한 도메인 이름을 기입한다. ex) www.localstorybe.site
    server_name my.domain.com;

    # 기본 경로에 대해 localhost:3000으로 프록시
    location / {
    proxy_pass http://localhost:3000;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    location /_next/webpack-hmr {
            proxy_pass http://localhost:3000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header X-Forwarded-Proto $scheme;
    }

    # /_event 경로에 대해 localhost:8000으로 프록시
    location /_event {
            proxy_pass http://localhost:8000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
            proxy_set_header X-Forwarded-Proto $scheme;
    }
}

 

체크리스트

1)웹서버 실행 종료 확인 

2)80번 포트 사용중 확인

3)80번 포트 포트포워딩 해제(필자는 포트포워딩 중이었음)

  • iptables -t nat -L --line-numbers -v -n
  • sudo iptables -t nat -D PREROUTING <규칙 번호>
sudo certbot certonly --standalone

 

 

 

추가 정보

인증서 경로 : /etc/letsencrypt/live/cookeng.site

 

 

인증서 자동 갱신

TLS 인증서는 90일동안만 유효하기 때문에 이후 재발급을 진행해야 한다.

crontab을 통해 인증서 재발급을 자동화 하자.

 

crontab 설치

sudo yum install cronie -y

 

cronie 서비스 활성화

sudo systemctl start crond
sudo systemctl enable crond

 

crontab 편집

crontab -e

 

인증서 갱신 스케줄 추가

 

service nginx stop

sudo certbot renew

 

 

인증서 재발급

 

 

sudo certbot --nginx -d example.com

 

참고 자료

1) https://certbot.eff.org/instructions?ws=other&os=pip

 

 

+ Recent posts