HomeAbout
[DevOps] Helm을 활용한 Kubernetes 매니페스트(Manifest) 파일 관리 및 배포 자동화 최적화 파이프라인 구축
DevOps
[DevOps] Helm을 활용한 Kubernetes 매니페스트(Manifest) 파일 관리 및 배포 자동화 최적화 파이프라인 구축
NASA1515
NASA1515
August 07, 2021
1 min

사용 할 툴을 다음과 같습니다.

  • GITHUB
  • ArgoCD
  • Helm
  • kompose


✔ DVWA MSA 생성


DVMN JAVA 링크 해당 주소에서 JAVA기반의 DVWA앱을 확인했습니다!!

  • 이번 포스트에서 Helm을 사용해서 Build 및 Deploy 할 Application으로 DVWA를 사용합니다.
    그러나 기본 JAVA 배포판은 Docker.compose.yaml만 존재하기 때문에Kubernetes에 MSP로 각각 배포할 수 있는 Manifest를 직접 만들어줘야 했습니다.

kompose 툴 사용기

  • 구글링 중 docker.compose를 yaml 파일로 변환해주는 툴을 발견해서 사용해봤습니다.
    자세한 사항은 공식 GITHUB 확인!

kompose 설치

root@nasa1515:/home/kompose# curl -L https://github.com/kubernetes/kompose/releases/download/v1.22.0/kompose-linux-amd64 -o kompose
% Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                    Dload  Upload   Total   Spent    Left  Speed
100   643  100   643    0     0   1391      0 --:--:-- --:--:-- --:--:--  1388
100 23.8M  100 23.8M    0     0  3411k      0  0:00:07  0:00:07 --:--:-- 4968k
root@nasa1515:/home/kompose# ls 
kompose

root@nasa1515:/home/kompose# chmod +x kompose
root@nasa1515:/home/kompose# sudo mv ./kompose /usr/local/bin/kompose

DWWA의 docker.compose.yml 파일은 아래와 같습니다.

version: '2'
services:
mysql:
    image: mysql:5.5
    volumes:
    - mysql:/var/lib/mysql
    environment:
    MYSQL_ROOT_PASSWORD: ec95c258266b8e985848cae688effa2b
app:
    build: .
    depends_on:
    - mysql
    ports:
    - "8080:8080"
    environment:
    MYSQL_USER: root
    MYSQL_PASSWORD: ec95c258266b8e985848cae688effa2b
volumes:
mysql:

위의 docker.compose.yml 파일을 kompose 변환기로 변환해보겠습니다.

root@nasa1515:/home/kompose# kompose convert -f docker-compose.yaml
WARN Unsupported root level volumes key - ignoring 
WARN Unsupported depends_on key - ignoring        
INFO Kubernetes file "app-service.yaml" created   
INFO Kubernetes file "app-deployment.yaml" created 
INFO Kubernetes file "mysql-deployment.yaml" created 
INFO Kubernetes file "mysql-persistentvolumeclaim.yaml" created 
  • 총 4개의 파일이 yaml 파일이 생성되었습니다.

간단하게 app을 배포하는 deployement yaml을 하나만 확인 해보겠습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
    annotations:
        kompose.cmd: kompose convert -f docker-compose.yaml
        kompose.version: 1.22.0 (955b78124)
creationTimestamp: null
labels:
     io.kompose.service: app
 name: app
spec:
    replicas: 1
     selector:
            matchLabels:
            io.kompose.service: app
 strategy: {}
 template:
    metadata:
     annotations:
        kompose.cmd: kompose convert -f docker-compose.yaml
        kompose.version: 1.22.0 (955b78124)
     creationTimestamp: null
     labels:
      io.kompose.service: app
    spec:
      containers:
         - env:
              - name: MYSQL_PASSWORD
                value: ec95c258266b8e985848cae688effa2b
              - name: MYSQL_USER
                value: root
         image: app
         name: app
        ports:
            - containerPort: 8080
         resources: {}
    restartPolicy: Always
status: {}
  • 위와 같이 매니페스트 파일들이 생성되어 MSA를 만드는데 조금 더 시간을 절약 할 수 있었습니다.

이제 k8s 클러스터에 알맞게 배포하기 위해서 Manifest 파일들을 수정, 생성했습니다.

  • ArgoCD에서 github 웹훅으로 배포하기 위해 github에 관련 Manifest 파일들을 모두 올려놓았습니다.

스크린샷, 2020-11-12 15-09-11



✌ Manifest 하나씩 내용을 살펴보겠습니다.

  • 우선 Manifest들의 가변적으로 바뀌는 설정들을 일일히 바꾸는 작업을 간소화 하기 위해서 Helm Chart 기반으로 Manifest를 배포하기로 했습니다.
    즉 Jenkins 서버에서는 values.yaml 파일의 이미지 tag값을 빌드 넘버로 바꾸어 배포가 되게 만든 아키텍처 입니다.

values.yaml

# Default values for ghost.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

replicaCount: 3

image:
repository: nasa1515/dvwa-web-was
tag: 13     <<--해당 값이 바뀌면 배포가 이루어진다.
pullPolicy: ""

value: ec95c258266b8e985848cae688effa2b

namespace: cd-test

name: 
app: app

app-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
    io.kompose.service: {{ .Values.name.app }}
name: {{ .Values.name.app }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
    matchLabels:
    io.kompose.service: {{ .Values.name.app }}
strategy: {}
template:
    metadata:
    annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.21.0 (992df58d8)
    creationTimestamp: null
    labels:
        io.kompose.service: {{ .Values.name.app }}
    spec:
    containers:
    - env:
        - name: MYSQL_PASSWORD
        value: {{ .Values.value }}
        - name: MYSQL_USER
        value: root
        image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
        imagePullPolicy: {{ .Values.image.pullPolicy }}
        name: {{ .Values.name.app }}
        ports:
        - containerPort: 8080
        resources: {}
    restartPolicy: Always
    serviceAccountName: ""
    volumes: null
status: {}
  • 간단하게 설명하면 Jenkins 에서 수정하고 빌드한 DVWA 이미지의 빌드넘버를 받아와 배포합니다.

app-service.yaml

apiVersion: v1
kind: Service
metadata:
annotations:
    cloud.google.com/neg: '{"ingress":true}'
    field.cattle.io/publicEndpoints: '[{"addresses":["35.223.27.28"],"port":8080,"protocol":"TCP","serviceName":"cd-test:app","allNodes":true}]'
    kompose.cmd: kompose convert
    kompose.version: 1.21.0 (992df58d8)
labels:
    io.kompose.service: {{ .Values.name.app }}
name: app-lb
namespace: {{ .Values.namespace }}
spec:
externalTrafficPolicy: Cluster
ports:
- name: "8080"
    port: 8080
    protocol: TCP
    targetPort: 8080
selector:
    io.kompose.service: {{ .Values.name.app }}
sessionAffinity: ClientIP
type: LoadBalancer
loadBalancerIP: 35.223.27.28
  • GCP에서 서비스 하다보니 LBIP를 임의로 지정해주어서 서비스를 설정했습니다.

mysql-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
    io.kompose.service: mysql
name: mysql
spec:
replicas: 1
selector:
    matchLabels:
    io.kompose.service: mysql
strategy:
    type: Recreate
template:
    metadata:
    annotations:
        kompose.cmd: kompose convert
        kompose.version: 1.21.0 (992df58d8)
    creationTimestamp: null
    labels:
        io.kompose.service: mysql
    spec:
    containers:
    - env:
        - name: MYSQL_ROOT_PASSWORD
        value: ec95c258266b8e985848cae688effa2b
        image: mysql:5.5
        imagePullPolicy: IfNotPresent
        name: mysql
        resources: {}
        volumeMounts:
        - mountPath: /var/lib/mysql
        name: mysql-vol
    restartPolicy: Always
    serviceAccountName: ""
    volumes:
    - name: mysql-vol
        persistentVolumeClaim:
        claimName: mysql-pvc
status: {}

mysql-service.yaml

apiVersion: v1
kind: Service
metadata:
annotations:
    kompose.cmd: kompose convert
    kompose.version: 1.21.0 (992df58d8)
creationTimestamp: null
labels:
    io.kompose.service: mysql
name: mysql
spec:
ports:
- name: "3306"
    port: 3306
    targetPort: 3306
selector:
    io.kompose.service: mysql

mysql-pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
creationTimestamp: null
labels:
    io.kompose.service: mysql
name: mysql-pvc
namespace: cd-test
spec:
accessModes:
- ReadWriteMany
storageClassName: ""
volumeName: dbserver
resources:
    requests:
    storage: 5Gi
status: {}
  • GCP의 FILE STORE를 사용해서 PVC를 만들었습니다.

mysql-pv-nfscreate.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
name: dbserver
namespace: cd-test
spec:
capacity:
    storage: 10Gi
volumeMode: Filesystem
accessModes:
    - ReadWriteMany
persistentVolumeReclaimPolicy: Retain
storageClassName: ""
nfs:
    path: /nfs_share
    server: 10.254.194.122
  • PV 생성과 이런저런 설정들은 모두 포스트를 나눠 정리했습니다.

namespace.yaml

kind: Namespace
apiVersion: v1
metadata:
annotations:
    field.cattle.io/projectId: c-dcn6h:p-8scft
name: {{ .Values.namespace }}
labels:
    name: {{ .Values.namespace }}
    field.cattle.io/projectId: p-8scft
  • 간단한 앱 배포를 위한 네임스페이스를 생성하는 매니페스트 파일입니다.


결론적으로 GITHUB에 헬름 저장소를 넣어둔 뒤 해당 저장소의 값이 바뀌면 Argo-CD 가 SYNC를 맞춰주면서 배포를 하는 프로세스입니다..

image


Tags

#DevOps#Jenkins#ArgoCD
NASA1515

NASA1515

Data Engineer

Hello I'M Wonseok aka NASA1515

Expertise

Public Cloud
k8s/Docker
Python

Social Media

instagramwebsitelinkedingithub

Related Posts

[DevOps] Maven을 사용한 Java Application 빌드 및 배포 & DevSecOps Pipeline 통합 및 자동화 고도화
[DevOps] Maven을 사용한 Java Application 빌드 및 배포 & DevSecOps Pipeline 통합 및 자동화 고도화
2021-08-20
1 min

Topics

CloudDevelop

Social Media