쿠버네티스에 Jira 설치하기

쿠버네티스 클러스터(IKS)에 네임스페이스를 생성하고 Jira, MySQL 애플리케이션을 배포합니다.

이 포스팅은 쿠버네티스에서 Jira를 활용한 CI/CD 파이프라인 구축 방법에 관한 연재글로 다음 순서로 진행합니다.

사전 준비 사항

  • IBM CLI (IKS)

쿠버네티스 클러스터 config를 설정해준 상태에서 진행합니다.
IBM CLI에서 클러스터 설정에 대한 자세한 내용을 다음 링크를 참조해주세요.

먼저 Jira를 올리기 위한 네임스페이스를 생성해줍니다.

kubectl create namespace jira-cicd

Steps

  1. 퍼시스턴트클레임볼륨 및 퍼시스트볼륨 생성
  2. MySQL 패스워드 설정을 위한 시크릿파일 생성
  3. Jira-MySQL 설치 및 초기 설정
  4. Gitlab, Jenkins 연동
  5. Gitlab Webhook 설정
  6. Jira 이슈 생성 및 Git Commit, Build 확인

1. 퍼시스턴트클레임볼륨 및 퍼시스트볼륨 생성

쿠버네티스의 pod에 이상이 생겨 재시작이 될 경우 데이터가 모두 손실될 수 있습니다. 이런 상황을 방지하기 위해서 데이터베이스를 올릴 경우 퍼시스트볼륨을 설정해주어야 합니다. 퍼시스턴트볼륨 개념에 대한 자세한 내용은 쿠버네티스 공식문서를 참고하세요.

먼저 PersistentVolume을 생성합니다. volume 이름은 jira-mysql-pv로 지정하고, hostPath타입으로 worker node의 /mnt/data/ 경로에 mysql 파일이 저장되도록 설정합니다. 이어서 --- 을 두고 한 파일에 PersistentVolumeClaim을 설정합니다.

jira-mysql-pv.yaml


apiVersion: v1
kind: PersistentVolume
metadata:
  name: jira-mysql-pv
  namespace: jira-cicd
  labels:
    type: local
spec:
  storageClassName: mysql
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/var/lib/mysql"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jira-mysql-pvc
  namespace: jira-cicd
spec:
  storageClassName: mysql
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi

작성한 yaml파일을 바탕으로 퍼시스트볼륨 및 퍼시스트볼륨클레임을 생성합니다.


kubectl create -f jira-mysql-pv.yaml

위와 같은 방식으로 설정값만 다르게 적용해 jira-pv를 생성합니다.

jira-pv.yaml


apiVersion: v1
kind: PersistentVolume
metadata:
  namespace: jira-cicd
  name: jira-pv
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  hostPath:
    path: "/var/atlassian/application-data/jira"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: jira-pvc
  namespace: jira-cicd
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 5Gi

작성한 yaml파일을 바탕으로 퍼시스트볼륨 및 퍼시스트볼륨클레임을 생성합니다.


kubectl create -f jira-pv.yaml

2. MySQL 패스워드 설정을 위한 시크릿파일 생성

쿠버네티스 환경에서 MySQL의 패스워드를 활용하기 위해 미리 secret 파일을 작성해줍니다. 쿠버네티스 공식문서를 참고했습니다.
텍스트 파일을 불러와 SecreteGenereatorjira-mysql-pass 를 만들어보겠습니다.


cat <./kustomization.yaml
namespace: jira-cicd
secretGenerator:
- name: jira-mysql-pass
  literals:
  - password={YOUR_PASSWORD}
EOF

kustomization.yaml 파일 디렉토리에서 다음 명령을 수행합니다.


kubectl apply -k .

3. Jira-MySQL 설치 및 초기 설정

3.1 MySQL 인스턴스 배포

MySQL 컨테이너 퍼시스트 볼륨을 var/lib/mysql에 마운트해줍니다. MYSQL_ROOT_PASSWORD는 시크릿에서 가져와 데이터베이스 암호로 지정합니다.

jira-mysql-deployment.yaml


apiVersion: v1
kind: Service
metadata:
  name: jira-mysql
  namespace: jira-cicd
  labels: 
    name: jira
spec:
  ports:
    - port: 3306
  selector:
    name: jira
    tier: mysql
  clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata: 
  name: jira-mysql
  namespace: jira-cicd
spec:
  selector:
    matchLabels:
      name: jira-mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        name: jira-mysql
        tier: mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: jira-mysql-pass-[시크릿 생성시 만들어진 토큰]
              key: password
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: jira-mysql-pv
          mountPath: var/lib/mysql
      volumes:
      - name: jira-mysql-pv
        persistentVolumeClaim:
          claimName: jira-mysql-pvc

jira-mysql 인스턴스를 다음 명령어로 배포합니다.


kubectl create -f jira-mysql-deployment.yaml

MySQL에 접속해서 데이터베이스를 생성합니다. 먼저 default로 설정되어 있는 네임스페이스를 변경합니다.


kubectl config set-context --current --namespace=jira-cicd

mysql pod 이름을 확인하고, 접속해서 데이터베이스를 생성합니다.


kubectl get pods --namespace=jira-cicd

다음 명령어를 통해 mysql bash 창에 접속합니다.


kubectl exec -it [mysql pod 이름] bash
mysql -u root -p
Enter Password: 초기 패스워드 입력

mysql에 jiradb 데이터베이스를 생성합니다.


mysql > CREATE DATABASE jiradb CHARACTER SET utf8 COLLATE utf8_bin;

3.2 JIRA 인스턴스 배포

위와 같은 방법으로 Jira 인스턴스를 배포합니다.

jira-deployment.yaml


apiVersion: v1
kind: Service
metadata:
  name: jira
  namespace: jira-cicd
  labels:
    name: jira
spec:
  ports:
    - port: 9090
      targetPort: 8080
      protocol: TCP
  selector:
    name: jira
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jira
  namespace: jira-cicd
  labels:
    name: jira
spec:
  selector:
    matchLabels:
      name: jira
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        name: jira
    spec:
      containers:
      - image: atlassian/jira-software:latest
        name: jira
        env:
        - name: ALT_JDBC_URL
          value: jdbc:mysql://jira-mysql:3306/jiradb
        - name: ALT_JDBC_DRIVER
          value: com.mysql.jdbc.Driver
        - name: ALT_JDBC_USER
          value: root
        - name: ALT_DB_TYPE
          value: mysql
        ports:
        - containerPort: 8080
        volumeMounts:
        - mountPath: /var/atlassian/application-data/jira
          name: jira-pv
      volumes:
      - name: jira-pv
        persistentVolumeClaim:
          claimName: jira-pvc

다음 명령어로 쿠버네티스 클러스터에 배포합니다.


kubectl create -f jira-deployment.yaml

쿠버네티스 대시보드에서 jira가 배포된 노드의 외부 주소를 확인하고, 서비스 정보를 불러옵니다.


kubectl get svc -n jira-cicd 

결과창은 대략 다음과 같아야 합니다.


NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
jira         NodePort    172.21.131.209           9090:32190/TCP   11m
jira-mysql   ClusterIP   None                     3306/TCP         8h

앞서 확인한 ExportIP에 포트번호를 붙여 http://ExportIPAdress:32190으로 접속해 jira 초기 설정을 시작합니다.
jira_setup_start

참고: 정리하기

지금까지 배포한 인스턴스를 모두 삭제하고 싶다면, 네임스페이스를 삭제하면 모든 pods와 service를 한번에 삭제할 수 있습니다.


kubectl delete namespace jira-cicd

Reference

Summary and Next Step

지금까지 쿠버네티스에 Jira를 MySQL과 함께 설치하기 위한 yaml파일 작성법을 설명했습니다. 다음글에서는 Jira를 설치한 뒤, 초기 세팅을 어떻게 하는지 알아보겠습니다.