레이블이 chartmuseum인 게시물을 표시합니다. 모든 게시물 표시
레이블이 chartmuseum인 게시물을 표시합니다. 모든 게시물 표시

install harbor

# chart 저장소로 chartmuseum 을 사용중이였는데 dashboard ui 가 없어 찾아 보니 chartmuseum-ui 가 있다.
# 그런데 chartmuseum-ui 는 helm 차트가 없고 현재 차트 업로드가 안되고 조회만 된다고 한다.
# harbor(https://github.com/goharbor/harbor) 는 CNCF 졸업한 프로젝트로 
# chart 외 Open Container Initiative(OCI) 표준을 따르는 컨테이너 이미지 및 기타 아티팩트(helm chart 파일)를 저장하고 
# 프로젝트별 구분 및 RBAC(롤 기반 접근제어)
# trivy(https://github.com/aquasecurity/trivy)를 통한 취약점 파악이 가능하다.
# 그리고 db(postgresql)를 사용해 아티팩트 사용에 대한 히스토리 및 push, pull 카운트도 알 수 있다.
# 물론 UI 도 있고, chartmuseum(3k) 보다 스타수도 26k로 많다.... 해서 harbor 를 설치해보자.

# harbor 2.x 에서는 chart 저장소가 chartmuseum 에서 oci 레지스트리로 변경되었다.
# harbor 2.8 (Apr 17, 2023) 부터 chartmuseum 을 지원하지 않는다.
# chart 는 image(artifact)와 동일하게 관리된다.

# harbor helm chart 다운로드
helm repo add harbor https://helm.goharbor.io
helm repo update
helm fetch harbor/harbor
tar zxvf harbor-1.17.1.tgz
cd harbor

# values.yaml 변경
# ingress, clusterIP, nodePort, loadBalancer (대소문자 구분) 중 하나를 선택하면 나머지 설정들은 스킵된다.
# nodePort 를 사용하면 기존 ClusterIP 타입의 서비스외  NodePort 타입의 harbor 서비스가 더 생성되고 여기서 기존 서비스들로 분배된다.(configmap > nginx.conf 참고)
expose.type: ingress
expose.tls.enabled: false

# harbor 접근할 웹 주소
expose.ingress.hosts.core: https://harbor.ysoftman.test

# docker 이미지나 helm chart 를 push/pull 할때 cli 명령에서 사용될 서버 주소
externalurl: https://harbor.ysoftman.test

# pv,pvc 기본으로 Container Storage Interface (CSI) 로 생성된다.
# pv,pvc 를 사용하면 파드를 삭제했다가 pvc 를 사용하는 새로운 파드를 다시 띄우면, k8s 는 기존 데이터가 남아있는 동일한 노드로 파드를 스케줄링(NodeAffinity)하여 이전 데이터를 그대로 이어받아 사용할 수 있다.
# kubectl get storageclasses 로 csi 가 연결된 스토리지 provisioner 확인
# csi 종류
# rancher.io/local-path 는 k8s 클러스터의 각 노드에 있는 로컬 스토리지를 Persistent Volume(PV)으로 사용해 emptyDir (Ephemeral Storage) 처럼 pod 삭제시 데이터가 날라가는것 방지할 수 있다.
# cinder.csi 는 openstack 환경에서 cinder API 호출하여 새로운 cinder 볼륨을 사용
# reclaimpolicy(pod 삭제시 pv등 정리 방법)는 delete 인 local-path 를 사용
persistence.persistentVolumeClaim.xxxxx.storageClass: "local-path-delete"

# 별도의 nfs 사용할 경우 pv, pvc 리소스를 추가하자.
# pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: ysoftman-harbor
spec:
  accessModes:
    - ReadWriteMany
  capacity:
    storage: 10Gi
  nfs:
    path: /xxxxx/ysoftman/harbor
    server: nfs.ysoftman.zzz
  persistentVolumeReclaimPolicy: Retain

# pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ysoftman-harbor
  namespace: harbor
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: ""
  volumeName: ysoftman-harbor

# values.yaml 설정에서 existingClaim 명시
persistence.persistentVolumeClaim.xxxxx.storageClass: ""
persistence.persistentVolumeClaim.xxxxx.existingClaim: "ysoftman-harbor"

# harbor database(postgreSQL) 데이터 저장소로 nfs 사용시 권한 문제와 디렉터리 비어있지 않음등의 문제가 있다면 로컬 스토리지를 사용하자.
persistence.persistentVolumeClaim.database.storageClass: "local-path-delete"

# image/chart 저장소 타입 filesystem, azure, gcs, s3, swift 중 선택
persistence.imageChartStorage.type: filesystem

# image/chart filesystem 선택시 저장 경로
persistence.imageChartStorage.filesystem.rootdirectory: /storage

# 배포
helm upgrade --install harbor . \
--namespace harbor \
--create-namespace \
--values values.yaml

# 이제 admin / Harbor12345 로그인해서 메뉴에서 admin 암호를 변경(대소,특수,포함 8자리 이상등의 조건)한다.
https://harbor.ysoftman.test

#####

# nodePort 와 ingress 둘 다 사용하기
# ingress 상태로 띄우고
expose.type: ingress

# ingress 리소스를 templates/ysoftman_ingress.yaml 파일로 백업
kubectl get ing -o yaml > templates/ysoftman_ingress.yaml

# nodePort 로 다시 배포(helm upgrade)하면 nodePort 서비스가 추가된다.
expose.type: nodePort

# templates/ysoftman_ingress.yaml > backend service 를 NodePort 서비스명으로 변경 후 다시 배포(helm upgrade)

#####

# harbor database(postgresql)이 nfs로 저장이 안되고, 외부 gcs(google cloud storage), s3, 등을 사용할 수 없다면 덤프파일로 백업하자.

# database container 에 접속해서 psql 로 다음과 같이 사용자명과 db명을 파악하자.

# 로컬에서 접속할 수 있도록 port-foward
kubectl port-forward svc/harbor-database 5432:5432 -n harbor

# pg cli 툴 설치
# postgresql server 와 맞는 버전을 설치해야 한다.
# 14 버전 대신 15 버전으로 설치
brew unlink postgresql@14
brew install postgresql@15

# registry db 덤프
pg_dump -h localhost -p 5432 -U postgres -d registry > harbor_backup_20250807.sql

# 덤프 파일로 복구
psql -h localhost -p 5432 -U postgres -d registry < harbor_backup_20250807.sql

#####

# helm 3.7 부터는 oci registry 연동 시 https 만 지원하고 http 사용지 동작하지 않는다.
# oci 방식으로 저장된 차트는 url 로 다운로드가 할 수 없다.
# harbor ui 에서 올라간 차트 이미지에 대해 helm pull, docker pull 등의 커맨드를 클립보드로 복사하는 기능이 있다.

# harbor registry 로그인
helm registry login -u admin -p Harbor12345 https://harbor.ysoftman.test

# harbor 2.8 chartrepo 방식이 사라져 chartrepo 엔드포인트는 사용할 수 없고 oci 프로토콜로만 사용해야 한다.
# 차트 파일 library 프로젝트에 올리기
helm push ysoftman-chart-0.0.1.tgz oci://harbor.ysoftman.test/library

# library 프로젝트의 ysoftman 차트 다운로드
helm pull oci://harbor.ysoftman.test/library/ysoftman-chart --version 0.0.1

# docker 이미지 library 프로젝트로 태깅
docker tag aaa/ysoftman-image:dev harbor.ysoftman.test/library/ysoftman-image:dev

# docker 이미지 library 프로젝트에 올리기
docker push harbor.ysoftman.test/library/ysoftman:dev

# library 프로젝트의 ysoftman:dev 이미지 다운로드
docker pull harbor.ysoftman.test/library/ysoftman:dev

# harbor 버전 확인(로그인 메뉴 > about)
https://harbor.ysoftman.test/api/v2.0/systeminfo

helm command

# helm 은 redis, jenkins, couchbase 등 널리 알려진 패키지(k8s에서는 리소스)을
# kubernetes(k8s) 환경에 쉽게 배포 운영해주는 일종의 패키지(리소스) 매니져다.
# helm 은 charts(k8s 리소스 생성을 위한 설정들 모아놓은 패키지)를 관리하는 방식으로 사용된다.
# kubectl 설치하고
wget https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/linux/amd64/kubectl
chmod +x kubectl
sudo cp kubectl /usr/local/bin

# kubectl config 로 context 를 설정해야 한다.
kubectl config set-credentials xxx
kubectl config set-cluster xxx
kubectl config set-context xxx
kubectl config use-context xxx

# 설치 - mac
brew install kubernetes-helm

# 설치 - linux
# github 에 이미 빌드된 helm binary 사용한다.
# https://github.com/helm/helm/releases
# 참고로 helm 서버와 버전이 호환되는 helm client 를 사용해야 한다.
wget https://get.helm.sh/helm-v2.16.1-linux-amd64.tar.gz
tar zxvf helm-v2.16.1-linux-amd64.tar.gz
sudo cp linux-amd64 /usr/local/helm

# Error: incompatible versions 로 클라,서버 버전이 다른 경우
# helm 클라이언트를 서버 버전(2.14.1)으로 설치한다.
curl -L https://git.io/get_helm.sh | bash -s -- --version v2.14.1

# 초기화
# ~/.helm 을 셋팅한다.
helm init

# helm 으로 설치된 리스트
helm list -A

# 패키시 상태(Deployment, Service, Ingress...등)
helm status 이름

# helm chart 저장소 업데이트
helm update repo

# helm redis 설치
# 사용 가능한 redis chart 검색
helm search redis

# chart 상세보기
helm inspect stable/redis

# syntax 체크, -f value.yaml
helm lint stable/redis -f stable/values-dev.yaml

# 템플릿 렌더링 결과 확인
helm template stable/redis -f stable/values-dev.yaml

# 설치 시뮬레이션, 디버그 메시지 출력
helm install stable/redis --name ysoftman-redis -n ysoftman-ns --dry-run --debug

# 설치(redis 클러스터 구성시 다음 명령 실행 후 출력되는 NOTES 부분 참고)
helm install stable/redis --name ysoftman-redis -n ysoftman-ns

# 업데이트
# upgrade 에서는 --history-max 로 헬름으로 배포된 히스토리 내역 최대 개수 제한 할 수있다. 기본(256개)
helm upgrade ysoftman-redis stable/redis -n ysoftman-ns --history-max 3

# values.yaml 의 특정값을 변경해서 업데이트
helm upgrade ysoftman-redis stable/redis -n ysoftman-ns --set ysoftman.key1=aaa,ysoftman.key2=bbb

# NOTES 부분은 status 로 다시 볼 수 있다.
helm status ysoftman-redis

# history 보기
helm history ysoftman-redis

# 롤백
helm rollback ysoftman-redis 1

# 삭제, aliases: uninstall, del, delete, un
helm delete ysoftman-redis

# dependency 리스트
helm dep list

# chart.lock 삭제 후 다시 생성
helm dep update

# helm chart 다운로드
helm pull vector/vector
or
helm fetch vector/vector

# helm plugin 으로 설치된 리스트 확인
helm plugin list

# 개별 업데이트(diff 플러그인 업데이트)
helm plugin update diff

#####

# 커스텀 chart 만들기
# 참고 https://docs.bitnami.com/kubernetes/how-to/create-your-first-helm-chart/
# 기본 디렉토리와 파일들을 생성해 준다.
# 참고로 Go template 엔진을 사용한다.
helm create mychart

# mychart 내의 파일을 수정후 상위 디렉토리로 이동후 커스텀 chart 로 설치할 수 있다.
helm install ./mychart --name ysoftman-app

# helm 으로 관리되는(설치된) 리소스 보기
# k9s > helm 리소스로도 볼 수 있다.
kubectl get all -A -l='app.kubernetes.io/managed-by=Helm'

#####

# 차트 패키지로 만들기
helm package .

# 차트 패키지 업로드
curl -u "ysoftman:password" --data-binary "@ysoftman-0.1.0.tgz" http://ysoftman-chartmuseum:8080/api/charts

# 차트 패키지 삭제
curl -u "ysoftman:password" -X DELETE  http://ysoftman-chartmuseum:8080/api/charts/ysoftman/0.1.0

# helm repo 추가
helm repo add ysoftman-chartmuseum http://ysoftman-chartmuseum:8080

# 설치
helm install ysoftman-chartmuseum/ysoftman

Prev