GitLab CI/CD 구축

김신영·2024년 8월 12일

Kubernetes

목록 보기
3/6
post-thumbnail

1. Settings - CI/CD부분에서 variables를 설정해준다 (그룹단위 or 프로젝트단위 등등 나누어서 적용 할 수 있다) (프로젝트단위에 가까워질 수록 우선적용)

Typekeyvaluedescription
VariableCI_ORACLE_REGISTRY****Docker Image 셋팅을 위한 오라클 클라우드 레지스트리 주소
VariableCI_REGISTRY_USER****Docker Image 셋팅을 위한 오라클 클라우드 레지스트리 접속 계정
VariableCI_REGISTRY_PASSWORD****Docker Image 셋팅을 위한 오라클 클라우드
레지스트리 접속 비밀번호
VariableTENANCY_NAMESPACE****Docker Image 셋팅을 위한 오라클 클라우드
레지스트리 테넌시 네임스페이스 정보
VariableDEV_NAMESPACEworker2-dev배포할 K8S Namespace 정보 (DEV)
VariableTEST_NAMESPACEworker3-test배포할 K8S Namespace 정보 (TEST)
FileK8S_CONFIGconfig파일 내용rke2 설치된 서버에서 확인 가능
서버 접속
cat /home/root/.kube/config
복사 후 붙여넣기
server: https://127.0.0.1:6443
Localhost로 지정되어있는데 서버 IP로 수정
VariablePROJECT_PORTex)8080프로젝트 별 설정할 PORT(내부포트)

2. deployment-template.yml 작성

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-PROJECT_IMAGENM-service
  namespace: APPLY_NAMESPACE
spec:
  replicas: 1
  strategy:
    type: RollingUpdate
  selector:
    matchLabels:
      app: PROJECT_IMAGENM-service
  template:
    metadata:
      name: PROJECT_IMAGENM-service-pod
      labels:
        app: PROJECT_IMAGENM-service
    spec:
      containers:
        - name: container-PROJECT_IMAGENM-service
          image: PROJECT_IMAGE_ADDR/TENANCY_NAMESPACE/PROJECT_IMAGENM:PROJECT_IMAGE_TAG
          imagePullPolicy: Always
          ports:
            - containerPort: PROJECT_PORT
      imagePullSecrets:
        - name: regcred
 
---
apiVersion: v1
kind: Service
metadata:
  name: service-PROJECT_IMAGENM-service
  namespace: APPLY_NAMESPACE
spec:
  ports:
    - name: PROJECT_IMAGENM-service-port
      port: PROJECT_PORT
      targetPort: PROJECT_PORT
  selector:
    app: PROJECT_IMAGENM-service
  type: ClusterIP

3. Dockerfile 작성

FROM maven:3.8.3-jdk-8

ENV TZ=Asia/Seoul

ADD 프로젝트위치/target/프로젝트명-1.0-SNAPSHOT-spring-boot.jar app.jar

RUN useradd [추가할 도커유저]
USER [추가할 도커유저]

ENTRYPOINT ["java",  "-jar","/app.jar"]

4. gitlab-ci.yml 작성

variables:
  # repository name
  PROJECT: "[레포지토리 이름]"
  PROJECT_IMAGE_NM: "[kubernetes-service이름]"

  # gitlab login 계정
  REG_LOGIN_USER: "${CI_REGISTRY_USER}"
  # CI_REGISTRY_PASSWORD는 gitlab project setting의 variables에서 정의했다.
  REG_LOGIN_PWD: "${CI_REGISTRY_PASSWORD}"
  # CI_ORACLE_REGISTRY=registry.gitlab.com
  REG_REGISTRY_BASE: '${CI_ORACLE_REGISTRY}/${TENANCY_NAMESPACE}/${PROJECT_IMAGE_NM}'

# 본 작업 수행 전에 실행할 script 이다.
before_script:
  - env

stages:
  - build_jar
  - docker_build
  - deploy_target

# 아래 부분 maven 일때와 gradle일때 다름 (image랑 script부분 다르게 줘야함)
# ex) image: maven:3.8.3-jdk-8
#	   script:
#    	- mvn clean install
        
jar_build:
  image: gradle:6.9-jdk11-alpine
  stage: build_jar
  script:
    - gradle clean build
  tags:
    - high
  artifacts:
    paths:
      - [프로젝트명]/build/libs/[프로젝트명]-0.0.1-SNAPSHOT.jar
  only:
    - master
    - test
    - dev

# 작업 이름이다. pipeline에서 현 단계를 보여줄 때 사용된다. stage와는 다른 개념이다.
build_post_server:
  # docker 이미지 빌드를 위해 사용할 docker container 이다.
  # https://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-an-image
  #   "The image keyword is the name of the Docker image the Docker executor will run to perform the CI tasks."
  image: docker:latest
  # https://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-a-service
  services:
    - docker:dind

  # stages 에서 열거한 stage 중 현 stage를 나타낸다.
  stage: docker_build_user_service
  when: manual
  script:
    # login gitlab to push docker images later
    - echo "- docker login -u '${REG_LOGIN_USER}' -p '${REG_LOGIN_PWD}' '${CI_ORACLE_REGISTRY}'"
    - docker login -u "${REG_LOGIN_USER}" -p "${REG_LOGIN_PWD}" "${CI_ORACLE_REGISTRY}"

    # docker 이미지를 빌드한다.
    - docker build -t "${REG_REGISTRY_BASE}:${CI_PIPELINE_ID}" .

    # docker 이미지를 gitlab의 container registry에 push한다.
    - docker push "${REG_REGISTRY_BASE}:${CI_PIPELINE_ID}"
  only:
    - master
    - test
    - dev

dev_deploy:
  stage: deploy_target
  when: manual
  image: dtzar/helm-kubectl
  before_script:
    - sed -i "s/PROJECT_IMAGE_ADDR/$CI_ORACLE_REGISTRY/g" deployment-template.yml
    - sed -i "s/TENANCY_NAMESPACE/$TENANCY_NAMESPACE/g" deployment-template.yml
    - sed -i "s/APPLY_NAMESPACE/$DEV_NAMESPACE/g" deployment-template.yml
    - sed -i "s/PROJECT_NM/${PROJECT}/g" deployment-template.yml
    - sed -i "s/PROJECT_IMAGE_TAG/$CI_PIPELINE_ID/g" deployment-template.yml
    - sed -i "s/PROJECT_PORT/$PROJECT_PORT/g" deployment-template.yml
    - sed -i "s/PROJECT_IMAGENM/${PROJECT_IMAGE_NM}/g" deployment-template.yml
    - cat deployment-template.yml
  script:
    - kubectl apply -f deployment-template.yml --insecure-skip-tls-verify --kubeconfig $K8S_CONFIG
    - kubectl rollout restart deployment --namespace=$DEV_NAMESPACE deployment-${PROJECT}-service --insecure-skip-tls-verify --kubeconfig $K8S_CONFIG

test_deploy:
  stage: deploy_target
  when: manual
  image: dtzar/helm-kubectl
  before_script:
    - sed -i "s/PROJECT_IMAGE_ADDR/$CI_ORACLE_REGISTRY/g" deployment-template.yml
    - sed -i "s/TENANCY_NAMESPACE/$TENANCY_NAMESPACE/g" deployment-template.yml
    - sed -i "s/APPLY_NAMESPACE/$TEST_NAMESPACE/g" deployment-template.yml
    - sed -i "s/PROJECT_NM/${PROJECT}/g" deployment-template.yml
    - sed -i "s/PROJECT_IMAGE_TAG/$CI_PIPELINE_ID/g" deployment-template.yml
    - sed -i "s/PROJECT_PORT/$PROJECT_PORT/g" deployment-template.yml
    - sed -i "s/PROJECT_IMAGENM/${PROJECT_IMAGE_NM}/g" deployment-template.yml
    - cat deployment-template.yml
  script:
    - kubectl apply -f deployment-template.yml --insecure-skip-tls-verify --kubeconfig $K8S_CONFIG
    - kubectl rollout restart deployment --namespace=$TEST_NAMESPACE deployment-${PROJECT}-service --insecure-skip-tls-verify --kubeconfig $K8S_CONFIG
  • 1번에서 생성한 Gitlab CI/CD Variables를 ${variable_name}으로 호출 가능
  • stages 항목으로 Pipeline 단계 설정
  • Image는 Docker Hub에서 확인가능 (https://hub.docker.com/)
  • only는 해당 Stage를 특정 Branch에서만 실행하게끔 조건을 설정하는 것

5. Secret 설정

-- secret 확인
root@master1:~/.kube$ kubectl get secret --namespace worker2-dev
NAME                  TYPE                                  DATA   AGE
default-token-hphvk   kubernetes.io/service-account-token   3      5d4h
regcred               kubernetes.io/dockerconfigjson        1      19h
$ kubectl get secret regcred  -o yaml
apiVersion: v1
data:
  .dockerconfigjson: 데이터
kind: Secret
metadata:
  creationTimestamp: "2023-11-16T07:38:48Z"
  name: regcred
  namespace: worker3-test
  resourceVersion: "77963021"
  selfLink: /api/v1/namespaces/worker3-test/secrets/regcred
  uid: 7afa8017-18fe-4ade-a43c-f1be5133b7a6
type: kubernetes.io/dockerconfigjson
(oracle-cli)
$
 
 
# 위 정보를 이용하여 세팅하고자 하는 클러스터로 이동하여 파일을 만든다.
 
test@test-temp:~/test/k8s/secrets$ vi secret-regcred.yaml
# kubectl apply -f /home/test-temp/test/k8s/secrets/secret-regcred.yaml
# kubectl delete -f /home/test-temp/test/k8s/secrets/secret-regcred.yaml
 
apiVersion: v1
kind: Secret
metadata:
  name: regcred
  namespace: dev
data:
  .dockerconfigjson: 
  [토큰 정보]
type: kubernetes.io/dockerconfigjson
 
~
"secret-regcred.yaml" 13L, 503C written                                                                         
test@test-temp:~/test/k8s/secrets$
test@test-temp:~/test/k8s/secrets$ kubectl apply -f /home/test-temp/test/k8s/secret-regcred.yaml
secret/regcred created
test@test-temp:~/test/k8s/secrets$ kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-4g4k8   kubernetes.io/service-account-token   3      20m
regcred               kubernetes.io/dockerconfigjson        1      3s
test@test-temp:~/test/k8s/secrets$

6. Rancher에서 확인

profile
공부합시다.

0개의 댓글