Jenkins + Ansible + Kubernetes

이상훈·2023년 6월 18일
0

CICD

목록 보기
7/10

docker desktop의 minikube 사용

Kubernetes Cluster

  Kubernetes Cluster은 Master node와 worker node로 구성되어있다.

  • Master Node : Kubernetes 클러스터의 중앙 관리 노드다. 주요 컨트롤 플레인 구성 요소인 kube-api server, kube-controller-manager, kube-scheduler, etcd 등이 실행된다. 마스터 노드는 클러스터의 상태를 관리하고, 클러스터 설정 정보를 유지하며, 스케줄링, 모니터링, 로깅 등의 작업을 처리한다. 또한, 클러스터의 API 서버를 통해 개발자와 상호작용한다.

  • Worker Node : Kubernetes 클러스터의 실제 작업을 수행하는 노드다. 각각의 워커 노드에는 컨테이너 실행을 위한 컨테이너 런타임(Docker, containerd 등), kubelet(노드에서 컨테이너와 상호작용하는 에이전트), kube-proxy(서비스 디스커버리와 로드 밸런싱을 위한 네트워크 프록시) 등의 구성 요소가 실행된다. 워커 노드는 마스터 노드의 지시에 따라 컨테이너를 스케줄링하고 실행하며, 노드 상태를 마스터 노드에 보고한다.

    • Services : Replicated 된 PODS 그룹 간에 로드 밸런싱을 제공.
    • Pods : 애플리케이션을 위해 서로 상호 작용해야 하는 컨테이너들의 논리적인 집합.

 Kubernetes를 사용하여 CI/CD 파이프라인을 통해 애플리케이션을 배포할 때, 컨테이너 형태로 애플리케이션을 패키징하고 관리한다. 이를 위해 컨테이너를 Pod이라는 단위로 감싸고, 이 Pod를 외부와 연결하기 위해 Services 오브젝트를 사용한다.


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

예제

kubectl run sample-nginx --image=nginx --port=80 : Kubernetes 클러스터에서 "sample-nginx"라는 이름의 pod가 생성되며, 해당 팟은 nginx 이미지를 사용하고 80번 포트를 열어서 애플리케이션을 실행한다.

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

kubectl create deployment sample-nginx --image=nginx

nginx 이미지를 이용해서 deployment를 하나 생성했는데 pod도 같이 생성됨을 확인할 수 있다.

다음은 deployment의 scailing 작업을 해보자.

kubectl scale deployment sample-nginx --replicas=2

pods가 2개로 늘어났다.

위와 같이 작업한 내용들을 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

  앞서 Kubernetes를 docker desktop의 minikube로 기동시켰다. docker 컨테이너로 운영되고 있는 Ansible-server에서 module, playbook을 이용해서 kubernetes를 제어해보려한다.

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

  1. Ansible 접속

    docker exec -it ansible-server bash

  1. k8s폴더 아래 hosts 파일 생성
[ansible-server]
localhost

[kubernetes]
host-pc ip address
  1. ansible-server에서 kubernetes 핑 테스트

    ansible -i ./k8s/hosts kubernetes -m ping

    ansible-server에서 host-pc에 로그인을 하지 않았기때문에 에러가 떴다.

  1. ssh 키 복사

    ssh-copy-id [Host name]@[Host PC IP]

    하지만 그래도 에러가 뜬다.. docker 컨테이너로 기동하고 있는 ansible-server에서 Windows PC(HOST)로 ssh-copy-id 명령어는 정상적인 실행이 안될 수 있다고 한다. 아래 글을 따라 참고하자.

    참고 : ssh-copy-id 에러, windows에서 ansible playbook으로 kubernetes script 실행 오류

  2. Ansible에서 K8s 접속 테스트

    ansible windows -m win_ping

    연결 테스트가 성공했다.

  3. Ansible-server에 playbook 작성

  4. kubernetes에서 script 파일 작성

  5. ansible-server에서 playbook 실행

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

    정상적으로 kubernetes의 script 파일이 실행되어서 deployment와 pods가 생성되었다.

+ Jenkins

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

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


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

Item 생성

  • CI

    • 빌드 후 조치탭에서 Send build artifacts over SSH의 Exec command에 아래 커멘드를 입력

      ansible-playbook -i /etc/ansible/hosts create-cicd-devops-image.yml --limit ansible-server
      -> ansible server에서만 playbook 실행. 해당 playbook에는 이미지 빌드, docker hub에 푸시, 기존 이미지 삭제하는 CI 작업이 명시되어 있음.

  • CD

    • 빌드 후 조치탭에서 Build other projects에 My-K8s-Project-using-Ansible 추가

      Build other projects는 build가 정상적으로 수행된 다음 동작함, My-K8s-Project-using-Ansible는 docker hub로부터 image를 가져와서 kubernetes에 적용하기 위한 playbook 실행등 CD 작업이 수행됨,

profile
Problem Solving과 기술적 의사결정을 중요시합니다.

0개의 댓글

관련 채용 정보