[CI/CD Pipeline] 3. Docker + Ansible + kubernetes 설정

Kubernetes란?

ubernetes는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 플랫폼이다. Google에서 개발되었으며 현재는 CNCF(Cloud Native Computing Foundation)에서 관리하고 있다.
Kubernetes는 복잡한 애플리케이션을 쉽게 관리하고, 확장 가능하며, 복원력이 있는 방식으로 배포할 수 있도록 도와준다.

Kubernetes 구성

Kubernetes Cluster

클러스터는 Kubernetes의 기본 단위로, 여러 대의 머신(노드)으로 구성된다. 클러스터는 다음과 같은 두 가지 주요 구성 요소로 나뉜다.

  • 마스터 노드 (Master Node): 클러스터를 관리하고 제어하는 역할을 한다. API 서버, 스케줄러, 컨트롤러 매니저 등이 포함된다.
  • 워커 노드 (Worker Node): 실제로 애플리케이션이 실행되는 노드이다. 각 워커 노드는 여러 개의 파드를 호스팅할 수 있다.

파드(Pod)란?

파드는 Kubernetes에서 가장 작은 배포 단위이다. 하나 이상의 컨테이너를 포함할 수 있으며, 이 컨테이너들은 동일한 네트워크 네임스페이스를 공유한다.
파드는 일반적으로 단일 애플리케이션의 인스턴스를 나타내며, 동일한 호스트에서 실행되는 여러 컨테이너가 서로 통신해야 할 때 유용하다.

서비스 (Service)

서비스는 Kubernetes에서 파드의 네트워크 접근을 관리하는 추상화 레이어이다. 파드는 일시적이고 언제든지 재시작될 수 있기 때문에, 서비스는 파드의 IP 주소가 변경되더라도 안정적인 네트워크 엔드포인트를 제공한다.
서비스는 로드 밸런싱을 통해 여러 파드에 트래픽을 분산시킬 수도 있다.

img.png

Kubernetes 기본 명령어

기능내용
node 확인kubectl get nodes
pod 확인kubectl get pods
좀 더 자세한 pod 정보 조회(IP주소)kubectl get pod -o wide
deployments 확인kubectl get deployments
service 확인kubectl get services
컨테이너 정보 확인kubectl describe pod/xxx
pod 삭제kubectl delete pod/xxx
deployment 삭제kubectl delete deployment nginx-deployment
Scale 변경 (2개로 변경)kubectl scale deployment xxx –replicas=2
Script 실행kubectl apply -f xxx.yml
pod에 터널링으로 접속kubectl exec -it nginx-deployment-XXXX-XXXX – /bin/bash
pod 노출(외부에 공개)kubectl expose deployment nginx-deployment –port=80 –type=NodePort

예제 실습

본 실습에선 도커 데스크탑의 minikube를 사용한 스탠드언론으로 진행한다.

도커 이미지 pod로 띄우기

# kubectl run: 새로운 파드를 생성하는 명령어
# sample-nginx: 생성될 파드의 이름
# --image=nginx: 사용할 Docker 이미지를 지정. 여기서는 nginx 이미지를 사용.
# --port=80: 파드가 사용할 포트를 지정. 여기서는 80번 포트를 사용.
kubectl run sample-nginx --image=nginx --port=80

Deployment

Deployment는 pods를 replica set라고 해서 여러 형태로 scailing해서 만들거나 scheduling, historing 작업을 할때 사용할 수 있는 설치 개념으로 pod의 상위 개념이다.

kubectl create deployment sample-nginx --image=nginx
kubectl get deployments
dubectl get pods

# 위까진 pod가 하나 생성되며, scailing 작업을 진행할 수 있다.
kubectl scale deployment sample-nginx --replicas=2
script

위와 같이 작업한 내용들을 script 파일로 만들면 일괄적을 편리하게 실행할 수 있다.

kubectl apply -f sample1.yml
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.14.2
        ports:
        - containerPort: 80

Port 번호

Kubernetes 스크립트 파일에서 Port, Target Port, NodePort는 서로 다른 개념을 나타낸다. 각각의 역할과 의미는 다음과 같다.

  • NodePort : 외부에서 접속하기 위해 사용하는 포트
  • Port : Cluster 내부에서 사용할 Service 객체의 포트
  • TargetPort : Service객체로 전달된 요청을 Pod(deployment)로 전달할때 사용하는 포트
  • 전체 서비스 흐름으로 보면 NodePort –> Port –> TargetPort

Ansible+ Kubernetes

Ansible-server에서 module, playbook을 이용해서 kubernetes를 제어해보자.

Ansible-server에서 playbook 파일을 실행시켜 Kubernetes가 가지고 있는 script 파일을 실행하기

1) Ansible hosts 파일 생성

[ansible-server]
localhost

[kubernetes]
host-pc ip address

2) ssh 키 복사

아래 키 전달 후 핑테스트를 통해 확인해 보자.

# 키생성(이전에 했음)
ssh-keygen

# 생성된 키 전달
ssh-copy-id <root아이디>@<접속할 서버 IP>
  • Kubectl 명령어 위치
  • Windows) C:\Program Files\Docker\Docker\resources\bin\kubectl.exe
  • MacOS) /usr/local/bin/kubectl

3) Ansible-server에 playbook 작성

- name: Create pods using deployment
  hosts: kubernetes
  # become: true
  user: root

  tasks:
    - name: create a deployment
      command: dubectl apply -f cicd-devops-deployment.yml

4) kubernetes에서 script 파일 작성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cicd-deployment
spec:
  selector:
    matchLabels:
      app: cicd-devops-project
  replicas: 2

  template:
    metadata:
      labels:
        app: cicd-devops-project
    spec:
      containers:
      - name: cicd-devops-project
        image: edowon0623/cicd-project-ansible
        imagePullPolicy: Always
        ports:
        - containerPort: 8080

5) ansible-server에서 playbook 실행

ansible-playbook -i /etc/ansible/hosts k8s-cicd-deployment-playbook.yml

Jenkins

앞서 구성된 Ansible + Kubernetes에다가 Jenkins를 연결해보자.
Jenkins item의 빌드후 조치탭의 Send build artifacts over SSH의 Exec command를 아래와 같이 입력하면 된다.
젠킨스 구성은 CI 와 CD를 나눠서 구성한다.

CI : 지속적인 통합

  • git pull
  • create a docker image
  • push the image to the registry(docker hub)
  • remove the image from the local

CD : 지속적인 배포

  • create a deployment (replica set : 2)
  • create a service

img_1.png

Item 설정

  • CI
    • 빌드 후 조치탭에서 Send build artifacts over SSH의 Exec command에 아래 커멘드를 입력
    • ansible server에서만 playbook 실행. 해당 playbook에는 이미지 빌드, docker hub에 푸시, 기존 이미지 삭제하는 CI 작업이 명시되어 있음.
ansible-playbook -i /etc/ansible/hosts create-cicd-devops-image.yml --limit ansible-server
  • CD
    • 빌드 후 조치탭에서 Build other projects에 My-K8s-Project-using-Ansible 추가
    • Build other projects는 build가 정상적으로 수행된 다음 동작함, My-K8s-Project-using-Ansible는 docker hub로부터 image를 가져와서 kubernetes에 적용하기 위한 playbook 실행등 CD 작업이 수행됨

© 2023 Lee. All rights reserved.