HomeAbout
[DevOps] Private Docker Registry Harbor 도입으로 DevOps 고도화 & Jenkins와 ArgoCD에 연동 및 통합
DevOps
[DevOps] Private Docker Registry Harbor 도입으로 DevOps 고도화 & Jenkins와 ArgoCD에 연동 및 통합
NASA1515
NASA1515
August 12, 2021
1 min

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

  • Jenkins
  • OWASP ZAP

✔ Harbor 설치 (Docker)


Harbor 설치의 경우 이미 많은 분들이 더 쉽게 설명해놓으셔서 간단히 넘어가겠습니다.

  • 우선 Harbor는 특정 OS에 맞는 docker, docker-compose가 요구됩니다 [Centos 7을 기반으로 진행하였습니다.]

docker-compose

sudo curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose -v

Harbor - 관련 링크

wget https://github.com/goharbor/harbor/releases/download/v1.9.4/harbor-online-installer-v1.9.4.tgz
tar xvfz harbor-online-installer-v1.9.4.tgz
cd harbor
vi harbor.yml // port 변경가능
./install.sh

위의 간단한 명령어로 설치가 완료되면 설정한 Public IP로 접근됩니다.

ID : admin / Pass : Harbor12345


사용 및 수정한 Harvor.xml은 다음과 같습니다.

  • Harbor conf

vi harbor.xml
# hostname
# https 주석(미사용시)
./prepare
#docker-compose reset
docker-compose down -v
docker-compose up -d

✌ Harbor는 HTTPS가 기본 Protocol 입니다.


  • 저는 기능을 우선으로 두었고, SSL 인증서를 연동하는데 많은 시간을 쓰고 싶지 않아 아래와 같은 방법으로 HTTP로 Harbor를 사용했습니다.

Harbor를 설치한 서버와 연결할 node들에 해당 명령어를 일일히 기입해야합니다.

ke-c-dcn6h-default-0-41c99d2b-zkp7 ~ # vim /etc/default/docker 
gke-c-dcn6h-default-0-41c99d2b-zkp7 ~ # 
gke-c-dcn6h-default-0-41c99d2b-zkp7 ~ # systemctl restart docker
gke-c-dcn6h-default-0-41c99d2b-zkp7 ~ # 
gke-c-dcn6h-default-0-41c99d2b-zkp7 ~ # 
gke-c-dcn6h-default-0-41c99d2b-zkp7 ~ # cat /etc/default/docker 
DOCKER_OPTS="-p /var/run/docker.pid --iptables=false --ip-masq=false --log-level=warn --bip=
169.254.123.1/24 --registry-mirror=https://mirror.gcr.io --log-driver=json-file --log-opt=ma
x-size=10m --log-opt=max-file=5 --insecure-registry 34.64.237.112"


gke-c-dcn6h-default-0-41c99d2b-zkp7 ~ # docker info | grep Insecure -A2
Insecure Registries:
34.64.237.112
127.0.0.0/8
  • /etc/default/docker 파일의 —insecure-registry 구문을 수정한 뒤 Docker를 재시작 시켜주면 되는 간단한 작업입니다.


👀 로그인이 안되는 문제가 발생했습니다.


아래와 같이 Harbor 저장소를 HTTP로 연결하려하는데 실패했습니다.

gke-c-dcn6h-default-0-41c99d2b-zkp7 ~ # docker login http://34.64.237.112
Username: admin
Password: 
Error response from daemon: Get http://34.64.237.112/v2/: Get http://jenkins/service/token?a
ccount=admin&client_id=docker&offline_token=true&service=harbor-registry: dial tcp: lookup j
enkins on 169.254.169.254:53: no such host
  • lookup jenkins on 169.254.169.254:53: no such host 로그내용을 보니 DNS or HOSTS의 문제인 것으로 판단됩니다.

다음과 같이 hosts에 추가해줘봅시다.

gke-c-dcn6h-default-0-41c99d2b-zkp7 ~ # cat /etc/hosts | grep jenkins
34.64.237.112   jenkins

그럼 아래와 같이 정상적으로 저장소에 로그인이 가능해집니다.

gke-c-dcn6h-default-0-41c99d2b-b3hf ~ # docker login http://34.64.237.112
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Error saving credentials: mkdir /root/.docker: read-only file system

물론 이미지를 가져오는 것도 자유롭습니다.

[root@rancher ~]# docker pull 34.64.237.112/nasa1515/centos:latest
latest: Pulling from nasa1515/centos
e4c3d3e4f7b0: Pull complete 
101c41d0463b: Pull complete 
8275efcd805f: Pull complete 
751620502a7a: Pull complete 
a59da3a7d0e7: Pull complete 
5ad32ac1e527: Pull complete 
50f250ce9768: Pull complete 
3dd70b2a7b06: Pull complete 
8c2eed4e2f48: Pull complete 
724b4bfec817: Pull complete 
61ae8c03d512: Pull complete 
9a94fab24995: Pull complete 
da240281d421: Pull complete 
a3770e71565d: Pull complete 
e1c790c868f5: Pull complete 
70b50f1bf238: Pull complete 
Digest: sha256:cc72b06299df2ca6ed89a93190f062cb918185742afe270a5e179b2ab52c1d17
Status: Downloaded newer image for 34.64.237.112/nasa1515/centos:latest
34.64.237.112/nasa1515/centos:latest
[root@rancher ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
34.64.237.112/nasa1515/centos   latest              d35d713b85e5        12 days ago         892M
B

Argcod 인증


쿠버네티스 클러스터에 아래와 같이 시크릿을 추가해줘야 정상적으로 연동이 됩니다.

kubectl get secret regcred --output=yaml
apiVersion: v1
data:
.dockerconfigjson: eyJhdXRocyI6eyJodHRwOi8vMzQuNjQuMjM3LjExMiI6eyJ1c2VybmFtZSI6ImFkbWluIiwicGFzc3dvcmQiOiJIYXJib3IxMjM0NSIsImF1dGgiOiJZV1J0YVc0NlNHRnlZbTl5TVRJek5EVT0ifX19
kind: Secret
metadata:
creationTimestamp: "2020-11-12T09:29:40Z"
name: regcred
namespace: default
resourceVersion: "13089794"
selfLink: /api/v1/namespaces/default/secrets/regcred
uid: 50cc6a2d-0f39-4fed-96e7-d5edde4e0f37
type: kubernetes.io/dockerconfigjson
> 
> 
> kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode
base64: unrecognized option: decode
BusyBox v1.31.1 () multi-call binary.

Usage: base64 [-d] [FILE]

Base64 encode or decode FILE to standard output
        -d      Decode data
> 
> 
> kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 -d
{"auths":{"http://34.64.237.112":{"username":"admin","password":"Harbor12345","auth":"YWRtaW46SGFyYm9yMTIzNDU="}}}>


Jenkins에서 다음과 같이 연결합니다.


  • Harbor의 경우 별 다른 APP 설치 없이 파이프라인 스크립트에서 바로 연결이 가능합니다.

저의 경우 스크립트 환경변수에 다음과 같이 할당했습니다.

pipeline {
    environment {
        slack_channel = '#studying'
        REGISTRY = 'nasa1515/wonseok'
        REGISTRY_IP = '34.64.237.112'       <<-- Harbor IP
        REGISTRYCREDENTIAL = 'harbor'       <<-- Credential
        DOCKER_IMAGE = ''
        TAG_NUM = ''
    }
...
...(중략)
        stage('Docker image push to Harbor') {    <<-- 다음과 같이 푸시하도록.
            steps{
                script {
                    docker.withRegistry('http://$REGISTRY_IP', REGISTRYCREDENTIAL) {
                        DOCKER_IMAGE.push('${BUILD_NUMBER}')
                        DOCKER_IMAGE.push("latest")
                    }
                }
                sh 'docker rmi $REGISTRY:latest'
                sh 'docker rmi $REGISTRY_IP/$REGISTRY:$BUILD_NUMBER'
                sh 'docker rmi $REGISTRY_IP/$REGISTRY:latest'
            }

그럼 최종적으로 아래와 같이 Harbor를 통해서 이미지를 관리할 수 있게 됩니다.

gg


Tags

#DevOps#GCP#Kubernetes
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