본문 바로가기
시스템/쿠버네티스

[쿠버네티스] Harbor(하버) 설치하기 TLS CA키 생성

by cbwstar 2024. 1. 10.
728x90
반응형

하버 홈페이지 참고 사이트

https://goharbor.io/docs/2.10.0/install-config/download-installer/

 

Harbor – Download the Harbor Installer

Download the Harbor Installer

goharbor.io

하버 깃허브 : https://github.com/goharbor/harbor/releases

 

Releases · goharbor/harbor

An open source trusted cloud native registry project that stores, signs, and scans content. - goharbor/harbor

github.com

harbor 버전 : 2.10.0

1. 다운로드 폴더 생성

   mkdir harbor

   cd harbor

 wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz

2. 압축해제 

    tar xvzf ./harbor-offline-installer-v2.10.0.tgz

3. 인증서 생성위한 디렉토리 이동

cd ~
mkdir certs
cd certs

4. 인증기관 인증서 생성

     프로덕션 환경에서는 CA로부터 인증서을 받아야 합니다. 테스트 또는 개발 환경에서는 자체 CA를 생성 할 수 있습니다.

  1) CA 인증서 개인 키를 생성합니다.

openssl genrsa -out ca.key 4096

   2) CA 인증서를 생성합니다.

openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Osong/L=Osong/O=invako/OU=Personal/CN=192.168.2.50" \
 -key ca.key \
 -out ca.crt

5. 서버 인증서를 생성합니다.

  1) 개인키(비밀키) 생성

/* 아이피(192.168.2.50) hosts (invako.com) 또는 도메인 입력 */
vi /etc/hosts
10.0.100.2 master
10.0.100.3 node1
10.0.100.4 node2
10.0.100.5 node3

192.168.2.50 invako.com invako

/* 호스트 파일에 테스트용 도메인 등록 */
openssl genrsa -out invako.com.key 4096

   2) 인증서 서명 요청(CSR)을 생성합니다.

/* CN은 도메인이나 아이피 입력 */
openssl req -sha512 -new \
    -subj "/C=CN/ST=South/L=Osong/O=invako/OU=Personal/CN=invako.com" \
    -key invako.com.key \
    -out invako.com.csr

   3) x509 v3 확장 파일을 생성합니다. 

Harbor 호스트에 연결하기 위해 FQDN 또는 IP 주소를 사용하는지 여부에 관계없이
SAN(주체 대체 이름) 및 x509 v3을 준수하는 Harbor 호스트에 대한 인증서를 생성할 수 있도록
이 파일을 생성해야 합니다.
확장 요구 사항. DNS도메인을 반영하도록 항목 을 바꿉니다.

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=invako.kro.kr
DNS.2=nginx.co.kr
DNS.3=zipkin.co.kr
EOF

# DNS 에 실제사용하는 도메인주소 입력

  4) v3.ext 파일을 사용하여 Harbor 호스트에 대한 인증서를 생성한다.

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in invako.com.csr \
    -out invako.com.crt

 

6. Harbor 및 Docker에 인증서 제공

  1) 서버 인증서와 키를 Harbor  호스트의 인증서 폴더에 복사   

mkdir -p /data/cert
cp invako.com.crt /data/cert/
cp invako.com.key /data/cert/

  2) Docker에서 사용할수 있도록 crt 파일을 cert 파일로 변환. Docker 데몬은 .crt 파일을 CA 인증서로 해석하고, .cert 파일을 클라이언트 인증서로 해석합니다.

openssl x509 -inform PEM -in invako.com.crt -out invako.com.cert

  3) 서버 인증서, 키 및 CA 파일을 Harbor 호스트의 Docker인증서 폴더에 복사합니다. 먼저 적절한 폴더를 생성해야 합니다.

mkdir -p /etc/docker/certs.d/invako.com
cp invako.com.cert /etc/docker/certs.d/invako.com/
cp invako.com.key /etc/docker/certs.d/invako.com/
cp ca.crt /etc/docker/certs.d/invako.com/

  4) Docker 재기동

systemctl restart docker

 

7. Harbor 환경파일 설정

cp harbor.yml.tmpl harbor.yml

/* 설정파일 수정 */
vi harboy.yml

 1 # Configuration file of Harbor
  2 
  3 # The IP address or hostname to access admin UI and registry service.
  4 # 호스트 네임 수정
  5 hostname: invako.com
  6 
  7 # http related config
  8 http:
  9   # port for http, default is 80. If https enabled, this port will redirect to https port
 10   port: 80
 11 
 12 # https related config
 13 https:
 14   # https port for harbor, default is 443
 15   port: 443
 16   # 인증서 경로 설정
 17   certificate: /etc/docker/certs.d/invako.com/invako.com.cert
 18   private_key: /etc/docker/certs.d/invako.com/invako.com.key

 

8. Harbor 설치

/* 준비 */
./prepare

/* 설치 */
Trivy 없이 기본 설치
기본 Harbor 설치에는 Trivy 서비스가 포함되어 있지 않습니다. 다음 명령을 실행하십시오.
sudo ./install.sh

Trivy로 설치(뭐하는건지 모름 나중에 확인해 봐야지)
Trivy 서비스와 함께 Harbour를 설치하려면 --with-trivy다음을 실행할 때 매개변수를 추가하세요 install.sh.

sudo ./install.sh --with-trivy
Trivy에 대한 자세한 내용은 Trivy 설명서를 참조하세요 . webproxy 환경에서 Trivy를 사용하는 방법에 대한 자세한 내용은 Trivy에 대한 사용자 지정 인증 기관 구성을 참조하세요.

9. 브라우저 로그인

 https://invako.com

 초기 패스워드는 admin Harbor12345이며 harbor.yml을 통해 설치 시 변경할 수 있습니다.

10. 도커 로그인

root@master:~/certs# docker login invako.com
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

Login Succeeded
root@master:~/certs#

11. 로그인후 도커 PUSH 확인

  1) 도커허브에서 nginx 도커 이미지 다운로드

       docker pull nginx

       docker images

       nginx 이미지 확인

   2) 하버에 이미지 push

       - New project 로 test 프로젝트를 생성하였다.

       - 올리고자 하는 이미지 명 규칙이 있다. 앞에 도메인명 + 프로젝트명이 필수로 들어가야 올라간다.

       - 기존 이미지가 있으면 tag 옵션으로 올릴수 있게 이미지를 생성후 push 한다.

         위에서 테스트용으로 받은 nginx를 기준으로 설명한다.

      docker tag nginx:latest invako.com/test/nginx:latest

      /* push 하여 올린다 */

         docker push invako.com/test/nginx:latest

    3) 올린 이미지 가져오기

      docker pull invako.com/test/nginx

 

12. Harbor 재기동

  docker-compose down -v  or docker compose down -v

  docker-compose up -d  or  docker compose up -d 

      

13. 사설인증서 윈도우 브라우저 신뢰할수 있는 루트 인증기관 등록

  1) 윈도우 검색창에 인증서 검색

      - 사용자 인증서 관리 클릭

   

 인증서 에서 마우스 오른쪽 버튼 클릭

 

가져오기 클릭

하여 위에서 만든 인증서를 등록하여 준다.

루트 인증서 ca.crt 를 등록해 주고 서버를 재기동후 다시 브라우저에 접속하면 신뢰할수 있는 사이트로 표시된다.

 

14. 쿠버네티스 harbor 사설 인증서 설치

   /* 쿠버네티스에서 harbor 이미지 가져올때 인증오류가 나서 제일 오랜 시간을 투자한것 같음.알면 쉬운데..모르면 인증 오류가 계속 떠서 인증서만 몇번 만들었음..ㅠ.ㅠ */

나같이 삽질 하지 않기 위해서 한방에 처리 하게 정리 하였습니다.

왜냐 인증서를 마스터에만 적용하고 해서 문제였음 적용은 잘 했는데 계속 인증 오류가 나서 결론은 전체 노드에 다 인증서를 복사해서 설정을 해 줘야함.

 1) 전체노드 적용

  - mkdir certs

- 인증서 복사

scp * root@node1:/root/certs

scp * root@node2:/root/certs

scp * root@node3:/root/certs

 

 

2) containerd 환경설정

vi /etc/containerd/config.toml

 [plugins."io.containerd.grpc.v1.cri".registry]
   # config_path 해도 된다고 해서 일단 추가했다가 필요없어서 주석처리
160 #      config_path = "/etc/containerd/certs.d:/etc/docker/certs.d"
161        config_path = ""
162       [plugins."io.containerd.grpc.v1.cri".registry.auths]
163 
164       [plugins."io.containerd.grpc.v1.cri".registry.configs]
165         [plugins."io.containerd.grpc.v1.cri".registry.configs."invako.com".auth]
166          username = "admin"
167          password = "Harbor12345"
168         [plugins."io.containerd.grpc.v1.cri".registry.configs."invako.com".tls]
     # 인증서 사용안할려면 insecure_skip_verify = true 로
169  #        insecure_skip_verify = true
170          ca_file = "/root/certs/ca.crt"
171          cert_file = "/root/certs/invako.com.cert"
172          key_file = "/root/certs/invako.com.key"
173       [plugins."io.containerd.grpc.v1.cri".registry.headers]
174 
175       [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
176         [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
177           endpoint = ["https://registry-1.docker.io"]
178         [plugins."io.containerd.grpc.v1.cri".registry.mirrors."invako.com"]
179           endpoint = ["https://invako.com"]

저장후 컨테이너 재기동

systemctl restart containerd

3) crictl 인증서 적용

  버전확인

$ crictl version

Version:  0.1.0
RuntimeName:  containerd
RuntimeVersion:  1.6.26
RuntimeApiVersion:  v1

에러 처리

========================
vi /etc/crictl.yaml

runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 2
debug: false
pull-image-on-create: false
====================================
컨테이너 재기동

systemctl restart containerd

 

4) Harbor에서 이미지 가져오는지 확인

ctr image pull invako.com/test/nginx:latest -u admin:Harbor12345

아래와 같이 x509 인증서 오류 발생

root@master:~/certs# ctr image pull invako.com/test/nginx:latest -u admin:Harbor12345
INFO[0000] trying next host                              error="failed to do request: Head \"https://invako.com/v2/test/nginx/manifests/latest\": tls: failed to verify certificate: x509: certificate signed by unknown authority" host=invako.com
ctr: failed to resolve reference "invako.com/test/nginx:latest": failed to do request: Head "https://invako.com/v2/test/nginx/manifests/latest": tls: failed to verify certificate: x509: certificate signed by unknown authority

 

/* 전체 서버에 똑같이 적용 */

mkdir /usr/local/share/ca-certificates

/* 생성된 인증서 복사 */

root@master:~/certs# cp * /usr/local/share/ca-certificates/

/* 반영 */

update-ca-certificates

/* 다시 이미지 가져오기 */

ctr image pull invako.com/test/nginx:latest -u admin:Harbor12345

invako.com/test/nginx:latest:                                                     resolved       |++++++++++++++++++++++++++++++++++++++| 
manifest-sha256:4669f6671aca20a34c3dfcd017e84fb3cae40788ea664866eaea698e3dfe241c: exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:8c37d2ff6efa0a08f83056109a47aa0caf2cc82136d926d1176cd451f7fbb245:    exists         |++++++++++++++++++++++++++++++++++++++| 
config-sha256:d453dd892d9357f3559b967478ae9cbc417b52de66b53142f6c16c8a275486b9:   exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:7b73345df136081ef2e60fd5cb875771c02c5ecb76015292babbc4711d195a31:    exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:af107e978371b6cd6339127a05502c5eacd1e6b0e9eb7b2f4aa7b6fc87e2dd81:    exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:51d6357098de68f5fc2e50afdaa73fc4fcbdeed2161adc9f14d1d8dae9d94d36:    exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:336ba1f05c3ede29f0a73d3f88b39a14f6abdc57fafedf3891fd793504440263:    exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:782f1ecce57d1fa61421872a16b979ad92057db19841b5811616a749705214f4:    exists         |++++++++++++++++++++++++++++++++++++++| 
layer-sha256:5e99d351b073fec15b9817dc5234f32433ef0404849cc66857be2eca5192ccf8:    exists         |++++++++++++++++++++++++++++++++++++++| 
elapsed: 0.5 s                                                                    total:   0.0 B (0.0 B/s)                                         
unpacking linux/amd64 sha256:4669f6671aca20a34c3dfcd017e84fb3cae40788ea664866eaea698e3dfe241c...
done: 28.935069ms

 

정상적으로 잘 가져 온다.

5) kubectl 에서 사설인증서를 이용하여 이미지 가져 오는 방법

    여기서 많은 시간 소모..안되어서..될때까지..결국 됨..

    안되어서 공식문서를 많이 참조 

https://kubernetes.io/ko/docs/tasks/configure-pod-container/pull-image-private-registry/

 

프라이빗 레지스트리에서 이미지 받아오기

이 페이지는 프라이빗 컨테이너 레지스트리나 리포지터리로부터 이미지를 받아오기 위해 시크릿(Secret)을 사용하는 파드를 생성하는 방법을 보여준다. 현재 많은 곳에서 프라이빗 레지스트리가

kubernetes.io

harbor 사설 서버니까 공식문서 따라서

docker login invako.com (harbor url주소)

서버 로그인 처리 로그인이 되면 config.json 파일이 생성됨

6) config.json 파일 확인

cat ~/.docker/config.json
{
	"auths": {
		"invako.com": {
			"auth": "YWRtaW46SGFyYm9yMTIzNDU="
		}
	}
}

 이생성된 파일을 가지고 인증 받아서 쿠버네티스에서 사설이미지 가져와서 배포를 함

이파일을 기반으로 자격 증명 시크릿 생성

kubectl create secret generic regcred \
--from-file=.dockerconfigjson=/root/.docker/config.json \
--type=kubernetes.io/dockerconfigjson

7) 검증하기

kubectl get secret regcred --output=yaml

apiVersion: v1
data:
  .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJpbnZha28uY29tIjogewoJCQkiYXV0aCI6ICJZV1J0YVc0NlNHRnlZbTl5TVRJek5EVT0iCgkJfQoJfQp9
kind: Secret
metadata:
  creationTimestamp: "2024-01-18T06:45:12Z"
  name: regcred
  namespace: harbor
  resourceVersion: "601704"
  uid: 0c09d52d-df35-4f80-96ed-ef638f8e7204
type: kubernetes.io/dockerconfigjson
.dockerconfigjson 필드의 값은 도커 자격 증명의 base64 인코딩 결과이다.

.dockerconfigjson 필드의 값을 확인하기 위하여, 시크릿 데이터를 읽을 수 있는 형식으로 변경한다.

kubectl get secret regcred --output="jsonpath={.data.\.dockerconfigjson}" | base64 --decode

{
	"auths": {
		"invako.com": {
			"auth": "YWRtaW46SGFyYm9yMTIzNDU="
		}
	}
}

auth 필드의 값을 확인하기 위하여, base64로 인코딩된 데이터를 읽을 수 있는 형식으로 변경한다.

 

echo "YWRtaW46SGFyYm9yMTIzNDU=" | base64 --decode

admin:Harbor12345

결과로 사용자 이름과 비밀번호가 : 구분자로 출력된다.

8) 시크릿을 사용하는 파드 생성하기

vi my-private-reg-pod.yaml

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>  # invako.com/test/nginx:latest
  imagePullSecrets:
  - name: regcred

pod가 잘생성되는지 테스트

kubectl apply -f my-private-reg-pod.yaml
kubectl get pod private-reg

 

/* 상세 보기 */

kubectl describe pod private-reg

인증서 적용을 전체 노드에 다 했기 때문에 정상적으로 이미지를 가지고 와서 에러 없이 기동이 되었다.

 

728x90
반응형

댓글



"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

loading