
| Type | key | value | description |
|---|---|---|---|
| Variable | CI_ORACLE_REGISTRY | **** | Docker Image 셋팅을 위한 오라클 클라우드 레지스트리 주소 |
| Variable | CI_REGISTRY_USER | **** | Docker Image 셋팅을 위한 오라클 클라우드 레지스트리 접속 계정 |
| Variable | CI_REGISTRY_PASSWORD | **** | Docker Image 셋팅을 위한 오라클 클라우드 레지스트리 접속 비밀번호 |
| Variable | TENANCY_NAMESPACE | **** | Docker Image 셋팅을 위한 오라클 클라우드 레지스트리 테넌시 네임스페이스 정보 |
| Variable | DEV_NAMESPACE | worker2-dev | 배포할 K8S Namespace 정보 (DEV) |
| Variable | TEST_NAMESPACE | worker3-test | 배포할 K8S Namespace 정보 (TEST) |
| File | K8S_CONFIG | config파일 내용 | rke2 설치된 서버에서 확인 가능 서버 접속 cat /home/root/.kube/config 복사 후 붙여넣기 server: https://127.0.0.1:6443 Localhost로 지정되어있는데 서버 IP로 수정 |
| Variable | PROJECT_PORT | ex)8080 | 프로젝트 별 설정할 PORT(내부포트) |
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
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"]
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

-- 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$