Harbor+Helm Chart構建k8s應用程序打包存儲發佈的基礎環境

Harbor

簡介

Harbor是由VMware公司中國團隊爲企業用戶設計的 Registry server開源項目,包括了權限管理(RBAC)、LDAP、審計、管理界面、自我註冊、HA、RESTful API等企業必需的功能,屬於Cloud Native Computing Foundation(CNCF,雲原生計算基金會)的畢業項目。linux

咱們建議使用2.0之後的版本,Harbor在2.0之後的版本使Harbor成爲第一個符合OCI(Open Container Initiative,開放容器倡議)標準的開源Registry server,可以存儲大量雲原生組件,例如container images、Helm Chart、OPAs、CNAB、Singularity等。 nginx

目前,Harbor最新穩定版本爲2.1,本文使用此版本部署。git

部署

1,咱們的需求以下github

  • 提供registey服務的域名爲registry.myk8s.com
  • 咱們須要把域名解析到有外網ip的nginx上,而後nginx給Harbor作代理
  • 咱們給Harbor單獨提供一個分區掛載到了/data1目錄

2,如今準備docker環境:docker

# yum install docker-ce -y
# yum install docker-compose -y
# systemctl start docker

3,Harbor安裝配置:vim

# wget https://github.com/goharbor/harbor/releases/download/v2.0.1/harbor-online-installer-v2.0.1.tgz
# tar xf harbor-online-installer-v2.0.1.tgz
# cd harbor

# vim harbor.yml
hostname: registry.myk8s.com  #服務的域名

https: # 以下配置域名的證書
  certificate: /opt/registry.myk8s.com.crt
  private_key: /opt/registry.myk8s.com.key

external_url: https://registry.myk8s.com # 因爲要用nginx作代理,故須要配置

harbor_admin_password: 123546  # 設置harbor默認admin用戶的密碼

data_volume: /data1 # 設置存儲卷

# bash install.sh

最後install.sh會執行安裝操做,須要從外網下載鏡像,故須要必定的時間。api

4,公網nginx配置給Harbor作代理轉發:bash

  • 給nginx添加vhost以下
    # vim registry.myk8s.com.conf
    server {
    listen 443;
           access_log /data0/logs/registry.myk8s.com.log main;
           server_name registry.myk8s.com;
           location / {
                   proxy_pass https://x.x.x.x:443;
                   proxy_set_header  Host registry.myk8s.com;
           }
    }
  • 重啓nginx
    # systemctl reload nginx

    5,訪問Harbor界面和配置服務器

  • 訪問url:https://registry.myk8s.com
  • 登錄界面以後,能夠建立私有項目和不一樣權限的新用戶,而後給用戶綁定到不一樣的項目。私有項目須要對應用戶的憑證才能訪問。
  • 也能夠建立公共項目,公共項目不須要憑證就能夠訪問

推送docker image到Harbor的私有test項目

說到使用image就離不開要理解image的tag,咱們先來理解下tag的做用:
1,docker能夠爲image的每個commit ID建立一個tag
docker image將文件等信息的變更抽象爲一次次的commit,每一次commit之後會生成一串無規則的字符串表明這次生成的image的ID,此時,tag的做用就是爲這個ID建立一個友好的NAME,方便咱們對鏡像庫的管理。
2,docker能夠爲給一個本地存在的image建立一個指向遠程registry server的tag
3,一個image能夠有多個tag,不一樣的tag能夠用來區分不一樣的版本架構

# docker login registry.myk8s.com # 輸入用戶名和密碼

# docker tag tutum/dnsutils registry.myk8s.com/test/dnsutils:latest
# docker push registry.myk8s.com/test/dnsutils:latest

對比docker registry

docker registry也提供鏡像倉庫的功能,可是Harbor功能更爲強大。主要提供了docker registry所沒有的鏡像同步,用戶角色權限控制,Helm Chart倉庫支持等。

Helm Chart

簡介

Helm是一個開源的k8s包管理器,屬於Cloud Native Computing Foundation(CNCF,雲原生計算基金會)的畢業項目。它可以把建立一個應用所需的全部Kubernetes API對象聲明文件組合並打包在一塊兒,並提供了倉庫的機制便於存儲和分發共享,還支持模版變量替換,同時還有版本的概念,使之可以對一個應用進行版本的管理。

Helm的主要組件以下:

  • helm cli:helm的命令行客戶端工具,主要用於k8s應用程序Chart的建立、打包、發佈以及建立和管理本地和遠程的Chart倉庫。
  • Chart:Helm的軟件包,採用tar格式。相似於YUM的rpm包,其包含了一組定義k8s資源相關的YAML文件。
  • Repoistory:Helm的軟件倉庫,Repository本質上是一個Web服務器,該服務器保存了一系列的Chart軟件包以供用戶下載,而且提供了一個該Repository的Chart包的清單文件以供查詢。Helm能夠同時管理多個不一樣的Repository。
  • Release:使用helm install命令在Kubernetes集羣中部署的Chart稱爲Release。

在Helm中,一個Chart可能依賴於任何數量的其餘Chart。這些依賴關係能夠經過requirements.yaml文件動態連接或引入Charts/目錄並手動管理。

helm3在2019年年末發佈,移除了Tiller,支持推送Chart包到Harbor registry server。目前helm最新穩定版爲helm 3.2.4,本位使用此版本部署。

架構

Harbor+Helm Chart構建k8s應用程序打包存儲發佈的基礎環境

安裝

在官方網站https://github.com/helm/helm/releases下載helm3以上的最新穩定二進制版本:

# wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz
# tar xf helm-v3.2.4-linux-amd64.tar.gz
# mv linux-amd64/helm /usr/local/bin/helm

# helm version
version.BuildInfo{Version:"v3.2.4", GitCommit:"0ad800ef43d3b826f31a5ad8dfbb4fe05d143688", GitTreeState:"clean", GoVersion:"go1.13.12"}

使用

公共倉庫

helm有本身的官方公開倉庫https://hub.helm.sh/,裏面有開發者貢獻的一些常見應用的Chart。若是有使用開源軟件的需求能夠在上面搜索直接下載使用。固然,也能夠本身搭建Harbor registry server建立公共倉庫。

咱們以在k8s集羣部署cerebro應用爲例子,須要先添加應用對應的repo,而後進行安裝:

# helm repo add stable https://kubernetes-charts.storage.googleapis.com
# helm repo list
NAME        URL
stable      https://kubernetes-charts.storage.googleapis.com

# helm install stable/cerebro --version 1.1.4  --generate-name

# helm list
NAME                NAMESPACE   REVISION    UPDATED                                 STATUS      CHART           APP VERSION
cerebro-1591777586  default     1           2020-07-22 16:26:30.419723417 +0800 CST deployed    cerebro-1.1.4   0.8.4

# kubectl get pods|grep cerebro
cerebro-1591777586-7fd87f7d48-hmlp7   1/1     Running   0          11m

私有倉庫

1,咱們把helm hub的cerebro應用下載到本地,須要再給helm安裝push插件,而後給推送到咱們本身的Harbor registry server上。

# helm repo add stable https://kubernetes-charts.storage.googleapis.com
# helm pull stable/cerebro
# tar xf cerebro-1.9.2.tgz

# yum install git -y
# helm plugin install https://github.com/chartmuseum/helm-push.git

# export  HELM_EXPERIMENTAL_OCI=1
[root@master2 ~]# helm chart save cerebro registry.myk8s.com/test/cerebro:v1.9.2
ref:     registry.myk8s.com/test/cerebro:v1.9.2
digest:  d32e30e72bb1929b6cf7e46381e7d54f01fc5926c638ef5a47547e0fa24822d5
size:    5.4 KiB
name:    cerebro
version: 1.9.2
v1.9.2: saved

# helm registry login https://registry.myk8s.com
Username: username
Password:
Login succeeded

# helm chart push registry.myk8s.com/test/cerebro:v1.9.2
The push refers to repository [registry.myk8s.com/test/cerebro]
ref:     registry.myk8s.com/test/cerebro:v1.9.2
digest:  d32e30e72bb1929b6cf7e46381e7d54f01fc5926c638ef5a47547e0fa24822d5
size:    5.4 KiB
name:    cerebro
version: 1.9.2
v1.9.2: pushed to remote (1 layer, 5.4 KiB total)

注意:
若是helm-push安裝失敗,須要經過一些辦法把https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz文件下載到服務器,而後經過以下方法安裝:

# tar xf helm-push_0.8.1_linux_amd64.tar.gz
# mkdir -p /root/.local/share/helm/plugins/helm-push.git/bin/
# cp bin/helmpush /root/.local/share/helm/plugins/helm-push.git/bin/

2,咱們本身初始化一個簡單的Chart,默認會安裝一個nginx應用, 而後給推送到Harbor registry server。

# helm create helm-test
# vim helm-test/values.yaml # 修改相關Chart的配置

# helm package helm-test
# helm  install helm-test-0.1.0.tgz --generate-name # 在本地k8s安裝應用
# helm list
helm-test-0-1595410957  default     1           2020-07-22 17:42:38.051204463 +0800 CST deployed    helm-test-0.1.0 1.16.0

# helm chart save helm-test registry.myk8s.com/test/helm-test:v2
ref:     registry.myk8s.com/test/helm-test:v2
digest:  7f1f17b1516d9173b3368cb64393ec31ad8b818b722b743b31276f49c1c36cf9
size:    3.5 KiB
name:    helm-test
version: 0.1.0
v2: saved

# helm chart push registry.myk8s.com/test/helm-test:v2
The push refers to repository [registry.myk8s.com/test/helm-test]
ref:     registry.myk8s.com/test/helm-test:v2
digest:  7f1f17b1516d9173b3368cb64393ec31ad8b818b722b743b31276f49c1c36cf9
size:    3.5 KiB
name:    helm-test
version: 0.1.0
v2: pushed to remote (1 layer, 3.5 KiB total)

對比CNAB規範

Helm Chart只能用於k8s應用程序的包管理,而CNAB應用更爲普遍。Cloud Native Application Bundles (CNAB) 是全新的開源打包格式規範,經過一個可安裝文件就能管理多款,在不一樣環境中配置應用程序資源並分佈式應用,在不一樣環境中配置應用程序資源,無需多個工具集就能輕鬆管理應用程序的生命週期。它兼容Azure,on-prem OpenStack, Kubernetes, Swarm, Ansible, Terraform等平臺。

總結

目前Helm Chart是主流的k8s包管理工具,而Harbor也是主流的registry server,值的咱們研究使用。

參考

https://goharbor.io/docs/2.0.0/install-config/
https://goharbor.io/docs/2.0.0/working-with-projects/working-with-images/managing-helm-charts/
https://goharbor.io/blog/harbor-2.0/
https://helm.sh/docs/intro/install/
https://helm.sh/docs/

相關文章
相關標籤/搜索