Kubernetes(K8s)를 활용하여 서버를 구성하는 과정을 단계별로 자세히 설명하겠습니다. 각 단계를 따라가면 Kubernetes 클러스터를 구성하고 애플리케이션을 배포할 수 있습니다.
1. Kubernetes 설치 및 클러스터 구성
Kubernetes 클러스터는 마스터 노드와 워커 노드로 구성됩니다. 먼저 클러스터를 만들기 위해 마스터 노드를 설치하고, 워커 노드를 추가하여 클러스터를 완성해야 합니다. Kubernetes 설치는 클라우드 서비스(AWS, GCP, Azure)나 Minikube 같은 로컬 환경에서도 가능합니다.
1.1 클러스터 설정 도구
- Kubeadm: Kubernetes 클러스터를 쉽게 설치하고 초기화할 수 있는 도구입니다.
- Minikube: 로컬에서 Kubernetes 클러스터를 생성해 테스트 환경을 만들 수 있습니다.
1.2 설치 단계
- 컨테이너 런타임 설치: 먼저, 각 노드에 Docker나 containerd와 같은 컨테이너 런타임을 설치합니다.
- Kubeadm 설치: 마스터 노드와 워커 노드에 kubeadm, kubelet, kubectl을 설치합니다.
- Ubuntu에서는 다음 명령어를 사용해 설치할 수 있습니다:
sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl
- Ubuntu에서는 다음 명령어를 사용해 설치할 수 있습니다:
- 클러스터 초기화: 마스터 노드에서 kubeadm init 명령어를 사용하여 클러스터를 초기화합니다.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
- kubectl 설정: 마스터 노드에서 kubectl 명령어를 사용할 수 있도록 설정합니다.
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 워커 노드 추가: 마스터 노드에서 워커 노드를 추가할 수 있는 kubeadm join 명령어를 생성하고, 이를 워커 노드에서 실행해 클러스터에 노드를 추가합니다.
2. 네트워크 플러그인 설치
Kubernetes는 클러스터 내에서 각 Pod가 서로 통신할 수 있도록 네트워크 플러그인을 설치해야 합니다. 가장 많이 사용되는 네트워크 플러그인 중 하나는 Flannel입니다.
설치 명령어:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
네트워크 플러그인은 Pod 간 통신을 설정하고, 여러 노드에 걸쳐 애플리케이션을 배포할 수 있도록 해줍니다.
3. 애플리케이션 배포
Kubernetes에서 애플리케이션은 Pod라는 컨테이너 단위로 배포됩니다. Pod는 하나 이상의 컨테이너를 포함하고 있으며, 이를 효율적으로 관리할 수 있는 Deployment 리소스를 사용해 애플리케이션을 배포할 수 있습니다.
3.1 배포 설정 파일 작성
YAML 파일을 통해 애플리케이션 배포 설정을 정의합니다. 아래는 간단한 Nginx 웹 서버 배포 YAML 예시입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.17
ports:
- containerPort: 80
3.2 배포 실행
위 YAML 파일을 적용하여 애플리케이션을 배포합니다:
kubectl apply -f nginx-deployment.yaml
배포 상태를 확인하려면 다음 명령어를 사용할 수 있습니다:
kubectl get deployments
kubectl get pods
4. 서비스 노출 (Service 설정)
클러스터 외부에서 애플리케이션에 접근하려면 Service 리소스를 설정해야 합니다. 서비스는 로드 밸런서를 제공하여, 외부 트래픽을 적절한 Pod로 라우팅합니다.
서비스 YAML 예시:
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
이 YAML 파일을 적용하여 Nginx 서버를 외부에서 접근할 수 있도록 설정합니다:
kubectl apply -f nginx-service.yaml
5. 자동 확장 설정 (Horizontal Pod Autoscaler)
Kubernetes는 Horizontal Pod Autoscaler(HPA) 기능을 제공하여 트래픽에 따라 자동으로 애플리케이션을 확장할 수 있습니다. CPU 사용량 등을 기준으로 Pod 수를 동적으로 늘리거나 줄일 수 있습니다.
HPA 설정 명령어:
kubectl autoscale deployment nginx-deployment --cpu-percent=50 --min=1 --max=10
이 명령어는 CPU 사용량이 50%를 초과할 때, 최소 1개에서 최대 10개까지 Pod를 자동으로 확장합니다.
6. 로그 및 모니터링
애플리케이션이 배포된 후에는 Kubernetes에서 제공하는 로그 확인 및 모니터링 도구를 사용해 상태를 점검할 수 있습니다.
로그 확인 명령어:
kubectl logs <pod-name>
모니터링 도구:
- Prometheus: Kubernetes 리소스 사용량을 모니터링하는 도구입니다.
- Grafana: Prometheus와 연동하여 실시간 대시보드를 제공합니다.
7. 애플리케이션 업데이트 및 롤백
Kubernetes에서는 무중단 배포가 가능하여, 애플리케이션을 쉽게 업데이트하고 문제가 발생하면 자동으로 롤백할 수 있습니다.
업데이트 명령어:
kubectl set image deployment/nginx-deployment nginx=nginx:1.18
롤백 명령어:
kubectl rollout undo deployment/nginx-deployment
결론
Kubernetes는 자동화, 확장성, 복구 기능 등을 제공하는 강력한 서버 구성 도구입니다. 위 단계를 따라가며 클러스터를 구성하고 애플리케이션을 배포하면, 복잡한 서버 환경도 효율적으로 관리할 수 있습니다. Kubernetes의 다양한 기능을 활용해 클라우드 환경에서 안정적인 애플리케이션 운영을 경험해 보세요!