하버 홈페이지 참고 사이트
https://goharbor.io/docs/2.10.0/install-config/download-installer/
하버 깃허브 : https://github.com/goharbor/harbor/releases
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/
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
인증서 적용을 전체 노드에 다 했기 때문에 정상적으로 이미지를 가지고 와서 에러 없이 기동이 되었다.
'시스템 > 쿠버네티스' 카테고리의 다른 글
[쿠버네티스] 깃랩 SSL certificate problem: unable to get local issuer certificate (0) | 2024.01.11 |
---|---|
[쿠버네티스] 깃랩(Giglab) 설치 (0) | 2024.01.10 |
[쿠버네티스] 우분투22.04 도커 설치하기 (0) | 2024.01.09 |
[쿠버네티스] 헬름 설치 (0) | 2024.01.09 |
[쿠버네티스] 아르고(Argo) cd 설치 (0) | 2024.01.09 |
댓글