ArgoCD 소개

ArgoCD는 CD(Continuous Delivery) 도구로서, Kubernetes에서 CI/CD 파이프라인을 구축하고 운영할 수 있도록 설계되었습니다. GitOps의 핵심 원칙을 따르며 Git 리포지토리에 저장된 애플리케이션의 상태를 Kubernetes 클러스터에 자동으로 동기화합니다. 이를 통해 인프라와 애플리케이션 상태의 일관성을 유지하고 배포 과정을 자동화하여 신속하게 반영할 수 있습니다.

설치 방법

공식문서(https://argo-cd.readthedocs.io/en/stable/#getting-started)에서 제공하는 yaml파일 설치

kubectl create namespace argocd
kubectl apply -n argocd -f <https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml>

 

설치 확인

 

초기 패스워드 확인

kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo

 

WEB 접속

kubectl port-forward svc/argocd-server -n argocd 8080:443

 

APP 배포

왼쪽 상단에 [NEW APP] 버튼을 누른다.

 

아래 그림에 내용을 입력한다.

 

 

argocd는 application이라는 단위로 배포할 리소스를 관리한다.

project는 관련된 application을 그룹화하고 구성하는 방법을 정의하는 개념이다.

 

옵션 설명

  • SYNC POLICY : 배포 동기화 정책을 설정하는 옵션
  • SET DELETION FINALIZER : 리소스를 삭제할 때 finalizer를 설정하여 삭제를 완료하기 전에 추가 작업을 수행할 수 있게 한다.
  • SKIP SCHEMA VALIDATION : Kubernetes 리소스의 스키마 유효성 검사를 건너뛴다.
  • AUTO-CREATE NAMESPACE : 자동으로 Kubernetes 네임스페이스를 생성합니다.
  • PRUNE LAST :필요하지 않은 리소스를 제거한다.
  • APPLY OUT OF SYNC ONLY : 현재 상태가 아닌 경우에만 변경 사항을 적용한다.
  • RESPECT IGNORE DIFFERENCES : 배포된 애플리케이션과 git과 차이를 무시하며 적용한다.
  • SERVER-SIDE APPLY : Kubernetes API 서버에서 직접 리소스를 적용한다.

 

추가로 동기화 할 저장소 정보를 입력한다

 

동기화

[SYNC] - [SYNCHRONIZE] 동기화 진행한다.

위에서 SYNC POLICY를 수동으로 설정했기 때문에 수동으로 동기화 해야 한다.

 

확인

상세 페이지에서 SYNC STATUS를 확인하면 동기화 상태를 알 수 있고 배포된 리소스도 확인해 볼 수 있다.

 

kubectl 명령어로 배포된 pod를 확인 가능하다.

 

마치며

 

ArgoCD는 Kubernetes 환경에서 안정적이고 효율적인 CI/CD를 구현하기 위한 필수 도구입니다. 더 많은 기능과 옵션이 있지만 오늘은 ArgoCD의 기본 개념과 실습을 다루어 보았습니다. GitOps를 통한 애플리케이션 배포와 관리를 경험하고 Kubernetes 클러스터에서의 작업 효율성을 크게 향상시킬 수 있을 것입니다.

Kubernetes와 GitOps 방식이 프로덕션 환경에서 애플리케이션 배포와 관리에서 중요한 역할을 하고 있습니다. ArgoCD는 GitOps를 실현하기 위한 도구 중 하나로, Kubernetes 클러스터에서의 애플리케이션 배포를 자동화하고 관리하는 데 큰 도움이 된다.

환경 및 설치 버전

  • Server : PJTL2M01
  • OS : Ubuntu 22.04.2 LTS
  • kubernetes version : 1.29.5
  • containerd version : 1.6.32
  • crictl : v1.28.0
  1. 시스템 업데이트 및 필수 패키지 설치
sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release

 

Docker GPG 키 추가 및 Docker 저장소 설정

sudo mkdir -p /etc/apt/keyrings
curl -fsSL <https://download.docker.com/linux/ubuntu/gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo \\
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] <https://download.docker.com/linux/ubuntu> \\
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

 

 

Containerd 설치 및 설정

# 설치
sudo apt-get update
sudo apt-get install -y containerd.io=1.7.2-1

# 설정
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml  

# 재시작
sudo systemctl restart containerd
sudo systemctl enable containerd

# 버전 확인
containerd --version

 

 

Kubernetes 설치

패키지 설치 시 에러가 발생해 방법2. 바이너리 다운로드 후 설치

 

방법1. 패키지 설치

# kubernetes 패키지 저장소 추가
curl -s <https://packages.cloud.google.com/apt/doc/apt-key.gpg> | sudo apt-key add -
echo "deb <https://apt.kubernetes.io/> kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

# Kubernetes 1.29.5 버전을 설치
sudo apt-get install -y kubelet=1.29.5-00 kubeadm=1.29.5-00 kubectl=1.29.5-00
sudo apt-mark hold kubelet kubeadm kubectl

# containerd를 컨테이너 런타임으로 사용하는 클러스터를 초기화
sudo kubeadm init --pod-network-cidr=192.168.0.0/16 --cri-socket /run/containerd/containerd.sock --kubernetes-version 1.29.5

 

방법2. 바이너리 설치

cd /usr/local/bin

# kubeadm 다운로드
sudo curl -LO "<https://dl.k8s.io/release/v1.29.5/bin/linux/amd64/kubeadm>"

# kubectl 다운로드
sudo curl -LO "<https://dl.k8s.io/release/v1.29.5/bin/linux/amd64/kubectl>"

# kubelet 다운로드
sudo curl -LO "<https://dl.k8s.io/release/v1.29.5/bin/linux/amd64/kubelet>"

# 실행 권한 부여
sudo chmod +x kubeadm kubectl kubelet
# kubelet 서비스 파일 생성
sudo mkdir -p /etc/systemd/system/kubelet.service.d

cat <https://kubernetes.io/docs/
After=network-online.target

[Service]
ExecStart=/usr/local/bin/kubelet
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF
# kubelet 환경 설정 파일 생성
cat <<EOF | sudo tee /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_CONFIG_ARGS=--config=/var/lib/kubelet/config.yaml"
EnvironmentFile=-/var/lib/kubelet/kubeadm-flags.env
ExecStart=
ExecStart=/usr/local/bin/kubelet \\$KUBELET_KUBECONFIG_ARGS \\$KUBELET_CONFIG_ARGS \\$KUBELET_EXTRA_ARGS
EOF
# 시스템 데몬 리로드 및 kubelet 시작
sudo systemctl daemon-reload
sudo systemctl enable kubelet
sudo systemctl start kubelet

# 설치 확인
kubeadm version
kubectl version --client
kubelet --version

 

kubeamd 설정 및 클러스터 초기화

# crictl 설치
# 컨테이너 런타임 인터페이스(CRI)를 위한 명령어 도구

VERSION="v1.28.0" # 최신 버전으로 변경
wget <https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz>

sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
crictl --version
# conntrack 설치
# 네트워크 연결 추적을 위한 도구
sudo apt-get install -y conntrack
# socat 설치
# 네트워크와 파일 간의 이중 통신을 제공하는 도구
sudo apt-get install -y socat
# 커널 파라미터를 설정
sudo modprobe br_netfilter
echo '1' | sudo tee /proc/sys/net/bridge/bridge-nf-call-iptables
echo '1' | sudo tee /proc/sys/net/ipv4/ip_forward

# swap 비활성화
sudo swapoff -a
# Kubernetes 클러스터 초기화
sudo kubeadm init --token-ttl 0 --pod-network-cidr=192.168.0.0/16 --cri-socket unix:///run/containerd/containerd.sock

 

kubeconfig 설정

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

네트워크 플러그인 설치

# Calico
kubectl apply -f <https://docs.projectcalico.org/v3.25/manifests/calico.yaml>

 

Worker join

# worker join, worker node에서 실행
kubeadm join 192.168.1.151:6443 --token h27exl.6jcxa4k6fumy3vku \\
        --discovery-token-ca-cert-hash sha256:22396246ac6d5b907651b24157fda3e37c2d7c5d70822047fec36b7625ce2dee

 

Kubernetes 환경에서 애플리케이션을 운영할 때, 자원 사용량, 애플리케이션 성능 및 시스템의 전반적인 상태를 지속적으로 모니터링하는 것은 중요합니다. 모니터링을 통해 시스템 문제를 미리 감지하고 최적화를 진행하여 안정적인 서비스를 운영할 수 있습니다. 많은 기업들이 이러한 목표를 달성하기 위해 Prometheus와 Grafana를 선택합니다.

Prometheus와 Grafana 소개

Prometheus는 오픈 소스 시스템 모니터링 및 경고 도구입니다. Kubernetes와 원활하게 통합되어 Kubernetes 클러스터의 다양한 메트릭을 수집, 저장, 쿼리할 수 있으며, 알림 설정도 가능합니다. Prometheus는 다양한 데이터 소스를 지원하며, PromQL이라는 유연한 쿼리 언어를 사용하여 이 데이터를 쿼리할 수 있습니다.

Grafana는 데이터 시각화 및 분석을 위한 오픈 소스 플랫폼입니다. Prometheus에서 수집한 메트릭을 시각화하여 보다 직관적으로 시스템의 상태를 파악할 수 있게 해줍니다.

설치

kubernetes 클러스터가 설치되어 있어야하고 Kubernetes 패키지 매니저 Helm으로 설치 진행한다.

  1. 메트릭 서버(Metrics Server) 설치
kubectl apply -f <https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml>
  1. Helm 설치
# Helm 설치
curl <https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3> | bash
  1. Prometheus 설치
helm repo add prometheus-community <https://prometheus-community.github.io/helm-charts>
helm repo update
helm install my-prometheus prometheus-community/prometheus
  1. Grafana 설치
# Grafana 설치
helm repo add grafana <https://grafana.github.io/helm-charts>
helm repo update
helm install my-grafana grafana/grafana
  1. 대시보드 접근
kubectl port-forward deploy/my-prometheus-server 9090
kubectl port-forward deploy/my-grafana 3000

Prometheus와 Grafana를 도입함으로써, Kubernetes 클러스터의 모니터링을 강화할 수 있습니다. 이를 통해 인프라와 애플리케이션의 성능을 지속적으로 모니터링하면서 시스템의 안정성을 확보할 수 있습니다. Prometheus의 유연한 쿼리 언어와 Grafana의 강력한 시각화 기능을 활용하여, 복잡한 운영 환경에서도 효과적인 모니터링 전략을 수립할 수 있습니다.

Kubernetes의 기본 스토리지 개념

1. Persistent Volume (PV)

PV는 클러스터 내의 실제 물리적 스토리지 리소스를 나타냅니다. 클러스터 관리자가 프로비저닝하며 클러스터 내 모든 사용자에게 제공됩니다.

2. Persistent Volume Claim (PVC)

PVC는 사용자가 스토리지를 요청할 때 생성됩니다. 특정 크기와 접근 모드를 지정하면, Kubernetes는 이에 맞는 PV를 찾아 PVC에 바인딩합니다.

3. StorageClass (SC)

SC는 서로 다른 유형의 스토리지를 추상화하고 제공하는 메커니즘입니다. 예를 들어, 고성능 SSD 스토리지나 저비용 HDD 스토리지를 정의할 수 있습니다. SC를 사용하면 PVC를 생성할 때 사용할 스토리지 유형을 지정할 수 있습니다.

여러 노드의 디스크를 효율적으로 사용하는 Longhorn의 필요성

기본적인 스토리지 관리 개념만으로는 여러 노드의 디스크를 효과적으로 활용하기 어려울 수 있습니다. Longhorn은 이러한 문제를 해결하기 위해 설계된 고가용성 분산 스토리지 솔루션입니다. 스토리지 분산 시스템은 Ceph, GlusterFS, Rook 등이 있지만 간편한 설치 및 UI를 통한 관리를 위해 Longhorn을 선택했습니다.

1. 디스크 자원의 최적화

Longhorn은 여러 노드에 걸쳐 데이터를 분산 저장하여 클러스터 내 모든 디스크 자원을 효율적으로 사용합니다. 이를 통해 특정 노드에 디스크 사용이 집중되는 문제를 방지할 수 있습니다.

2. 데이터 복제와 높은 가용성

Longhorn은 데이터를 여러 노드에 복제하여 저장합니다. 이를 통해 한 노드가 실패하더라도 데이터에 접근할 수 있어 고가용성을 보장합니다.

3. 자동 복구 기능

노드 장애가 발생하면 Longhorn은 자동으로 데이터를 다른 노드에 복제하여 데이터 일관성과 가용성을 자동으로 복구합니다. 이는 수동 개입 없이도 안정적인 스토리지 운영이 가능하게 합니다.

4. 손쉬운 설치 및 관리

Longhorn은 Kubernetes 환경에서 쉽게 배포할 수 있으며, 직관적인 UI를 통해 스토리지 상태를 모니터링하고 관리할 수 있습니다. Helm 차트를 통해 간편하게 설치 및 업그레이드가 가능합니다.

5. 고급 스토리지 관리 기능

Longhorn은 스냅샷, 백업, 복제본 관리 등 고급 스토리지 관리 기능을 제공합니다. 이를 통해 데이터 백업과 복구 작업이 더욱 간편해집니다.

Longhorn 설치

  1. Helm 리포지토리 추가
helm repo add longhorn <https://charts.longhorn.io>
helm repo update
  1. Longhorn 설치
kubectl create namespace longhorn-system
helm install longhorn longhorn/longhorn --namespace longhorn-system
  1. 설치 확인
kubectl get pods -n longhorn-system
  1. Longhorn UI 접근
# 노드포트 설정
kubectl -n longhorn-system patch svc longhorn-frontend -p '{"spec": {"type": "NodePort", "ports": [{"port": 80, "nodePort": 32000}]}}'
  1. 스토리지 클래스 설정
# longhorn-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: longhorn
provisioner: driver.longhorn.io
parameters:
  numberOfReplicas: "3" #데이터 복제본 수 
  staleReplicaTimeout: "30"
kubectl apply -f longhorn-storageclass.yaml
  1. PVC 생성 및 사용
# longhorn-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  storageClassName: longhorn
kubectl apply -f longhorn-pvc.yaml

이제 Kubernetes 클러스터에서 Longhorn을 사용한 동적 볼륨 프로비저닝이 설정되었습니다. PVC가 정상적으로 생성되면, 이를 사용하는 애플리케이션에서 해당 PVC를 참조할 수 있습니다. Longhorn UI를 통해 볼륨을 관리하고 모니터링할 수 있습니다.

 


안녕하세요! 오늘은 제가 최근에 Amazon EKS(Elastic Kubernetes Service)를 이용한 클러스터 구성에 대한 후기를 공유하려고 합니다. 이전에는 Ansible을 사용하여 Kubernetes 클러스터를 구성했었는데, 이번에 EKS를 통해 클러스터를 구성해보며 느낀 점들을 솔직하게 나누고자 합니다.


개요

kubernetes는 컨테너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈소스 시스템입니다. AWS의 Elastic Kubernetes Service(EKS)는 AWS 클라우드에서 쿠버네티스를 쉽고 빠르게 실행할 수 있도록 해주는 관리형 서비스입니다. 

 

간단한 커맨드라인으로 쿠버네티스 클러스터의 구성요소들의 설치와 설정이 자동으로 이루어지기 때문에, 개발자는 이미 안정적으로 만들어진 클러스터에 어플리케이션만 배포하면 된다.

 


준비사항

윈도우 용 패키지 관리자 설치

 

Installing Chocolatey

Chocolatey is software management automation for Windows that wraps installers, executables, zips, and scripts into compiled packages. Chocolatey integrates w/SCCM, Puppet, Chef, etc. Chocolatey is trusted by businesses to manage software deployments.

chocolatey.org

# Windows PowerShell 관리자 권한으로 실행

# 설치 확인 명령어
$ choco
# eksctl 설치
$ choco install eksctl

# awscli 설치
$ choco install awscli

# kubectl 설치
choco install kubernetes-cli --version=1.29

 


 

AWS Configure 구성

# AWS 키 생성
AWS 루트 계정 로그인 -> 우측 상단 내 계정 클릭 -> 보안 자격 증명 -> 엑세스 키 만들기 


# aws configure 구성
$ aws configure

 


 

EKS IAM 설정

  • 클러스터 IAM 역할 생성

AWS Console에 접속 후&nbsp; IAM -> 역할 -> 역할 생성
서비스 선택

 

AmazonEKSServicfeRolePolicy 정책 추가

 

 

  • 워커노드 IAM 역할 생성
# 워커노드는 EC2에서 동작하기 때문에 새로운 IAM 역할 생성

서비스 : EC2
권한 정책
AmazonEKS_CNI_Policy : EKS 클러스터 내의 Pod가 AWS의 네트워킹 서비스와 통신할 수 있도록 필요한 권한
AmazonEKSWorkerNodePolicy : EKS 워커 노드가 EKS 클러스터와 통신하고 관리될 수 있도록 필요한 권한
AmazonEC2ContainerRegistryReadOnly : ECR에 저장된 컨테이너 이미지 읽기 전용 접근 권한

 


 

EKS 구성파일 준비 

# yaml
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig

metadata:
  name: my-cluster-test
  region: us-west-2
  version: "1.29"

iam:
  serviceRoleARN: arn:aws:iam::533266979611:role/cluster
  withOIDC: true
  serviceAccounts: []

nodeGroups:
  - name: my-nodes
    instanceType: c1.medium
    desiredCapacity: 2
    iam:
      instanceRoleARN: arn:aws:iam::533266979611:role/worker

 

EKS 클러스터 생성

$ eksctl create cluster -f cluster-config.yaml

활성될 때 까지 시간이 소요된다

 


kubeconfig 설정

kubectl 명령어로 클러스터에 접근하기 위해 config 파일 생성
$ aws eks --region ap-northeast-2 update-kubeconfig --name my-cluster-test
# 노드 조회
$ kubectl get node

# pod 조회
$ kubectl get pod -A

 

 

kubeconfig 설정

 

Console이나 AWS CLI로 클러스터 삭제하면 Elastic IP, NAT 등이 남아 요금이 부과될 수 있으니 클러스터 삭제할 때 eksctl을 사용해야한다.

$ eksctl delete cluster --name my-cluster-test --region ap-northeast-2

 

마치며

kubernetes 클러스터를 Ansible로 구성할 때 세밀한 설정을 할 수 있었지만 그럴수록 더 복잡했고 클러스터 구성과 관리에 있어 상당한 시간과 노력이 필요했었다. 특히 초기 설정이나 환경 변경 시에 많은 스크립트를 수정하고 테스트하는 과정이 반복했었지만 EKS 클러스터를 eksctl로 구성하니 클러스터 구성이 단순해서 편리했다.

 

추가로 EKS 클러스터는 AWS Console과 AWS CLI 명령어로 생성할 수 있지만 eksctl을 사용하면 선언적 구성으로 인프라를 코드로 관리할 수 있으며 버전관리 시스템을 통해 변경 사항 추적할 수 있고 VPC, IAM, EC2 인스턴스 타입, CloudFormation 스택, Auto Scaling Group 등을 쉽게 설정할 수 있어 클러스터를 운영하는데 필요한 다양한 서비스와 연동을 간편하게 만들 수 있다고 한다.

+ Recent posts