Kubernetes(k8s)包管理器Helm(Helm3)介紹&Helm3安裝Harbor

大數據老司機 發佈 2022-07-22T05:20:53.841516+00:00

Helm是kubernetes的包管理器,helm倉庫裡面只有配置清單文件,而沒有鏡像,鏡像還是由鏡像倉庫來提供,比如hub.docker.com、私有倉庫。使用 helm install 命令在 Kubernetes 集群中部署的 Chart 稱為 Release。

一、概述

我們可以將Helm看作Kubernetes下的apt-get/YUM。Helm是kubernetes的包管理器helm倉庫裡面只有配置清單文件,而沒有鏡像,鏡像還是由鏡像倉庫來提供,比如hub.docker.com、私有倉庫。

  • 對於應用發布者而言,可以通過Helm打包應用,管理應用依賴關係,管理應用版本並發布應用到軟體倉庫。
  • 對於使用者而言,使用Helm後不用需要了解Kubernetes的YAML語法並編寫應用部署文件,可以通過Helm下載並在kubernetes上安裝需要的應用。

除此以外,Helm還提供了kubernetes上的軟體部署,刪除,升級,回滾應用的強大功能。

官方文檔:https://v3.helm.sh/zh/docs/

二、Helm 組件及相關術語

1)Helm

Helm 是一個命令行下的客戶端工具。主要用於 Kubernetes 應用程式 Chart 的創建、打包、發布以及創建和管理本地和遠程的 Chart 倉庫。

2)Chart

Helm 的軟體包,採用 TAR 格式。類似於 APT 的 DEB 包或者 YUM 的 RPM 包,其包含了一組定義 Kubernetes 資源相關的 YAML 文件。

3)Repoistory

Helm 的軟體倉庫,Repository 本質上是一個 Web 伺服器,該伺服器保存了一系列的 Chart 軟體包以供用戶下載,並且提供了一個該 Repository 的 Chart 包的清單文件以供查詢。Helm 可以同時管理多個不同的 Repository。

4)Release

使用 helm install 命令在 Kubernetes 集群中部署的 Chart 稱為 Release。
【注意】Helm 中提到的 Release 和我們通常概念中的版本有所不同,這裡的
Release 可以理解為 Helm 使用 Chart 包部署的一個應用實例

三、Helm2到Helm3演變過程

從2019年11月開始、Helm就正式開始升級到了Helm3。但是Helm2和Helm3之間還是有很大的區別。比如Helm3中移除了Tiller、Helm 2 是 C/S 架構,主要分為客戶端 helm 和服務端 Tiller; 與之前版本相同,Helm 3 同樣在 Release 頁面提供了預編譯好的二進位文件。差別在於原先的二進位包下載下來你會看到 helm 和 tiller 。而 Helm 3 則只有 helm 的存在了。Tiller 主要用於在 Kubernetes 集群中管理各種應用發布的版本,在 Helm 3 中移除了 Tiller, 版本相關的數據直接存儲在了 Kubernetes 中。

四、Helm安裝

下載地址:https://GitHub.com/kubernetes/helm/releases

# 下載包
$  wget https://get.helm.sh/helm-v3.7.1-linux-amd64.tar.gz
# 解壓壓縮包
$ tar -xf helm-v3.7.1-linux-amd64.tar.gz
# 製作軟連接
$ ln -s /opt/helm/linux-amd64/helm /usr/local/bin/helm
# 驗證
$ helm version
$ helm help

設置倉庫

$ helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

五、Helm Chart 結構

1)Chart 目錄結構

# 通過helm create命令創建一個新的chart包
$ helm create nginx
$ tree nginx
nginx/
├── charts  #依賴其他包的charts文件
├── Chart.yaml # 該chart的描述文件,包括ico地址,版本信息等
├── templates  # #存放k8s模板文件目錄
│   ├── deployment.yaml # 創建k8s資源的yaml 模板
│   ├── _helpers.tpl # 下劃線開頭的文件,可以被其他模板引用
│   ├── hpa.yaml # 配置服務資源CPU 內存
│   ├── ingress.yaml # ingress 配合service域名訪問的配置
│   ├── NOTES.txt # 說明文件,helm install之後展示給用戶看的內容
│   ├── serviceaccount.yaml # 服務帳號配置
│   ├── service.yaml # kubernetes Serivce yaml 模板
│   └── tests # 測試模塊
│       └── test-connection.yaml 
└── values.yaml # 給模板文件使用的變量

2)Chart.yaml 文件

name: [必須] Chart的名稱
version: [必須] Chart的版本號,版本號必須符合 SemVer 2:http://semver.org/
description: [可選] Chart的簡要描述
keywords:
  -  [可選] 關鍵字列表
home: [可選] 項目地址
sources:
  - [可選] 當前Chart的下載地址列表
maintainers: # [可選]
  - name: [必須] 名字
    email: [可選] 郵箱
engine: gotpl # [可選] 模版引擎,默認值是gotpl
icon: [可選] 一個SVG或PNG格式的圖片地址

六、模板

1)內置對象

對於模板來說,有幾個是內置有的對象:

  • Release,就是我們用 install 安裝時候生成的,比如Release.Name就是我們用install安裝的發布名稱(release名稱)
  • Values,Chart.yaml文件內容。 Chart.yaml里的任意數據在這裡都可以可訪問的。比如 {{ .Chart.Name }}-{{ .Chart.Version }} 會列印出 mychart-0.1.0
  • Chart,對應的是 Chart.yaml,用於獲取 Chart 相關信息

2)values的三種來源

  • chart的values.yaml文件
  • 由helm install -f 或 helm upgrade -f提供的values文件
  • 在執行helm install 或 helm upgrade 時傳遞給--set 或 --set-string 參數的values

優先級:--set >-f values_file>values.yaml

3)基礎語法

1、變量使用

模板中的變量都放在{{}} 中,比如:{{ .Values.images }} 表示 Values 對象下的images 欄位

使用-刪除空格和換行符

要想刪除那行其他的空格和換行符可以用{{-或者-}},一個是刪除左邊的空格和換行符,一個是刪除右邊的空格和換行符。

2、運算符
支持運算符:

eq: 等於(equal to)
ne: 不等於(not equal to)
lt: 小於(less than)
le: 小於等於(less than or equal to)
gt: 大於(greater than)
ge: 大於等於(greater than or equal to)

3、條件語句
if/else 用法:

{{if 命令}}
...
{{else if 命令}}
...
{{else}}
...
{{end}}

比如:

{{if lt (default .Values.version 1) 5}}

七、Helm 簡單使用

1)更換倉庫

# 先查看,默認是沒有配置倉庫的
$ helm repo list 
# 如果設置了,就先移除原先的倉庫
$ helm repo remove stable
# 添加新的倉庫地址(可以添加多個)
$ helm repo add stable https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
# 倉庫可用的charts
$ helm repo update
# 更新倉庫
$ helm search repo
# 指定倉庫查看
$ helm search repo stable

2)安裝Release的三種方式

【第一種方式】直接安裝不需要拉包

$ helm install myharbor harbor/harbor
$ helm list

【第二種方式】拉包直接通過安裝包安裝

# 先刪除
$ helm uninstall myharbor
# 拉包到本地
$ helm pull harbor/harbor
#或者
$ helm install myharbor ./harbor-1.7.3.tgz
$ helm list

【第三種方式】解壓包再安裝

# 先刪除
$ helm uninstall myharbor
# 解包
$ tar -zxvf harbor-1.7.3.tgz
# 安裝
$ helm install myharbor ./harbor
$ helm list

查看pod,svc,ingress

2)安裝harbor(http方式)

helm-harbor的GitHub地址:https://github.com/goharbor/harbor-helm
github很慢,可以使用碼雲的地址:https://gitee.com/ailucy/harbor-helm?_from=gitee_search

1、添加新的repo源

# 添加新的源
$ helm repo add harbor https://helm.goharbor.io
# 查看
$ helm search repo harbor

2、創建 Namespace

$ kubectl create namespace harbor

3、創建持久化存儲SC(harbor-NFS-storage)

cat << EOF > harbor-sc.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
  # replace with namespace where provisioner is deployed
  namespace: harbor        #根據實際環境設定namespace,下面類同
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-client-provisioner-runner
  namespace: harbor
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-client-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    namespace: harbor
    # replace with namespace where provisioner is deployed
roleRef:
  kind: ClusterRole
  name: nfs-client-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: harbor
    # replace with namespace where provisioner is deployed
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-client-provisioner
  namespace: harbor
subjects:
  - kind: ServiceAccount
    name: nfs-client-provisioner
    # replace with namespace where provisioner is deployed
    namespace: harbor
roleRef:
  kind: Role
  name: leader-locking-nfs-client-provisioner
  apiGroup: rbac.authorization.k8s.io
---
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
  namespace: harbor
spec:
  replicas: 1
  strategy:
    type: Recreate
  selector:
    matchLabels:
      app: nfs-client-provisioner
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:latest
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes #容器內掛載點
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs
            - name: NFS_SERVER
              value: 192.168.0.113
            - name: NFS_PATH
              value: /opt/nfsdata
      volumes:
        - name: nfs-client-root #宿主機掛載點
          nfs:
            server: 192.168.0.113
            path: /opt/nfsdata
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: harbor-nfs-storage
  namespace: harbor
provisioner: fuseim.pri/ifs  # or choose another name, must match deployment's env PROVISIONER_NAME'
reclaimPolicy: Retain        #回收策略:Retain(保留)、 Recycle(回收)或者Delete(刪除)
volumeBindingMode: Immediate    #volumeBindingMode存儲卷綁定策略
allowVolumeExpansion: true    #pvc是否允許擴容
EOF
$ kubectl apply -f harbor-sc.yaml
$ kubectl get sc -n harbor

4、部署harbor(Http方式)

  • 通過命令行配置和安裝 Harbor
$ helm install myharbor --namespace harbor-http harbor/harbor \
--set expose.ingress.hosts.core=myharbor.com \
--set expose.ingress.hosts.notary=notary.myharbor.com \
--set-string expose.ingress.annotations.'ingress.kubernetes.io/ssl-redirect'="false" \
--set-string expose.ingress.annotations.'nginx.org/client-max-body-size'="1024m" \
--set-string expose.ingress.annotations.'nginx.ingress.kubernetes.io/ssl-redirect="false"\
--set expose.tls.enabled=false \
--set expose.tls.certSource=none \
--set persistence.persistentVolumeClaim.registry.storageClass=harbor-nfs-storage \
--set persistence.persistentVolumeClaim.jobservice.storageClass=harbor-nfs-storage \
--set persistence.persistentVolumeClaim.database.storageClass=harbor-nfs-storage \
--set persistence.persistentVolumeClaim.redis.storageClass=harbor-nfs-storage \
--set persistence.persistentVolumeClaim.trivy.storageClass=harbor-nfs-storage \
--set persistence.persistentVolumeClaim.chartmuseum.storageClass=harbor-nfs-storage \
--set persistence.enabled=true \
--set externalURL=http://myharbor.com \
--set harborAdminPassword=Harbor12345

如果沒有storageClass 可以將 persistence.enabled 設置為 false ,不使用持久化存儲。

【登錄】密碼就是上面harborAdminPassword的值,這裡是原始默認密碼,帳號/密碼:admin/Harbor12345

卸載

$ helm uninstall myharbor -n harbor
  • 通過配置文件安裝 Harbor(推薦)
$ cat << EOF > harbor-http-values.yaml
#Ingress 網關入口配置
expose:
  type: ingress
  tls:
    ### 是否啟用 https 協議
    enabled: false
  ingress:
    hosts:
      ### 配置 Harbor 的訪問域名,需要注意的是配置 notary 域名要和 core 處第一個單詞外,其餘保持一致
      core: myharbor.com
      notary: notary.myharbor.com
    controller: default
    annotations:
      ingress.kubernetes.io/ssl-redirect: "false"
      ingress.kubernetes.io/proxy-body-size: "1024m"
      #### 如果是 traefik ingress,則按下面配置:
#      kubernetes.io/ingress.class: "traefik"
#      traefik.ingress.kubernetes.io/router.tls: 'false'
#      traefik.ingress.kubernetes.io/router.entrypoints: websecure
      #### 如果是 nginx ingress,則按下面配置:
      nginx.ingress.kubernetes.io/ssl-redirect: "false"
      nginx.ingress.kubernetes.io/proxy-body-size: "1024m"
      nginx.org/client-max-body-size: "1024m    "

## 如果Harbor部署在代理後,將其設置為代理的URL,這個值一般要和上面的 Ingress 配置的地址保存一致
externalURL: http://myharbor.com

### Harbor 各個組件的持久化配置,並設置各個組件 existingClaim 參數為上面創建的對應 PVC 名稱
### harbor-nfs-storage需要提前創建nfs和storageClass
persistence:
  enabled: true
  ### 存儲保留策略,當PVC、PV刪除後,是否保留存儲數據
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      storageClass: "harbor-nfs-storage"
      size: 20Gi
    chartmuseum:
      storageClass: "harbor-nfs-storage"
      size: 5Gi
    jobservice:
      storageClass: "harbor-nfs-storage"
      size: 1Gi
    database:
      storageClass: "harbor-nfs-storage"
      size: 1Gi
    redis:
      storageClass: "harbor-nfs-storage"
      size: 1Gi
    trivy:
      storageClass: "harbor-nfs-storage"
      size: 5Gi
EOF

執行

$ helm install harbor-http harbor/harbor -f harbor-http-values.yaml -n harbor
$ kubectl get ingress -o wide -n harbor

【問題】發現ingress沒有ADDRESS
【分析】,發現"error: endpoints "default-http-backend" not found"

$ kubectl describe ingress harbor-http-ingress -n harbor

【解決】創建default-http-backend服務

$ cat << EOF > default-http-backend.yaml
---
 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: default-http-backend
  labels:
    app: default-http-backend
  namespace: harbor
spec:
  replicas: 1
  selector:
    matchLabels:
      app: default-http-backend
  template:
    metadata:
      labels:
        app: default-http-backend
    spec:
      terminationGracePeriodSeconds: 60
      containers:
      - name: default-http-backend
        # Any image is permissible as long as:
        # 1. It serves a 404 page at /
        # 2. It serves 200 on a /healthz endpoint
        image: registry.cn-hangzhou.aliyuncs.com/google_containers/defaultbackend:1.4
#        image: gcr.io/google_containers/defaultbackend:1.4
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 30
          timeoutSeconds: 5
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 10m
            memory: 20Mi
          requests:
            cpu: 10m
            memory: 20Mi
---
 
apiVersion: v1
kind: Service
metadata:
  name: default-http-backend
  namespace: harbor
  labels:
    app: default-http-backend
spec:
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: default-http-backend
EOF

檢查

$ kubectl get ingress -n harbor

查看ingress,svc,pods

$ kubectl get ingress,svc,pods -n harbor

配置hosts,ip就是上面ingress對應的ip列表

cat <<EOF>> /etc/hosts
192.168.0.114 myharbor.com
192.168.0.115 myharbor.com
EOF

瀏覽器訪問驗證(帳號/密碼:admin/Harbor12345):
http://myharbor.com/

登錄後

3)Harbor鏡像

如果上面在線拉取鏡像失敗了,可以從這裡下載

連結:https://pan.baidu.com/s/13tR2jvOkEYK3VfC387VcBw
提取碼:8888

4)生成自簽證書

1、創建 CA 證書

這裡為了區分上面http,以 myharbor2.com 域名為例。

# 生成 CA 證書私鑰
$ openssl genrsa -out ca.key 4096
# 生成 CA 證書
$ openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=myharbor2.com" \
 -key ca.key \
 -out ca.crt

2、創建域名證書

  • 生成私鑰
$ openssl genrsa -out myharbor2.com.key 4096
  • 生成證書籤名請求 CSR
$ openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=*.myharbor2.com" \
    -key myharbor2.com.key \
    -out myharbor2.com.csr
  • 生成 x509 v3 擴展
$ cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=myharbor2.com
DNS.2=*.myharbor2.com
DNS.3=hostname
EOF
  • 創建 Harbor 訪問證書
$ openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in myharbor2.com.csr \
    -out myharbor2.com.crt
  • 將 crt 轉換為 cert ,以供 Docker 使用
$ openssl x509 -inform PEM -in myharbor2.com.crt -out myharbor2.com.cert

最終在目錄下得到如下文件:

$ ls 

5)部署 Harbor(Https方式)

  • 創建 Namespace
$ kubectl create ns harbor2
  • 創建證書秘鑰
$ kubectl create secret tls myharbor2.com --key myharbor2.com.key --cert myharbor2.com.crt -n harbor2
$ kubectl get secret myharbor2.com -n harbor2
  • 添加 Chart 庫(其實上面已經添加過了)
$ helm repo add harbor https://helm.goharbor.io
  • 通過命令行配置和安裝 Harbor
$ helm install myharbor2 --namespace harbor2 harbor/harbor \
  --set expose.ingress.hosts.core=myharbor2.com \
  --set expose.ingress.hosts.notary=notary.harbor2.service.com \
  --set-string expose.ingress.annotations.'nginx\.org/client-max-body-size'="1024m" \
  --set expose.tls.secretName=myharbor2.com \
  --set persistence.persistentVolumeClaim.registry.storageClass=harbor-nfs-storage \
  --set persistence.persistentVolumeClaim.jobservice.storageClass=harbor-nfs-storage \
  --set persistence.persistentVolumeClaim.database.storageClass=harbor-nfs-storage \
  --set persistence.persistentVolumeClaim.redis.storageClass=harbor-nfs-storage \
  --set persistence.persistentVolumeClaim.trivy.storageClass=harbor-nfs-storage \
  --set persistence.persistentVolumeClaim.chartmuseum.storageClass=harbor-nfs-storage \
  --set persistence.enabled=true \
  --set externalURL=https://myharbor2.com \
  --set harborAdminPassword=Harbor12345
$ kubectl get ingress,pvc,pods -n harbor2

如果沒有storageClass 可以將 persistence.enabled 設置為 false ,不使用持久化存儲。

  • 驗證
    配置hosts,ip就是上面ingress對應的ip列表
cat <<EOF>> /etc/hosts
192.168.0.114 myharbor2.com
192.168.0.115 myharbor2.com
EOF

瀏覽器訪問:
https://myharbor2.com

登錄後

卸載

$ helm uninstall myharbor2 -n harbor2
#上面卸載不會刪除pvc,所以這裡還得手動刪除,批量刪除pvc
$ kubectl get pvc -n harbor2| awk 'NR!=1{print $1}' | xargs kubectl delete pvc -n harbor2
  • 通過配置文件安裝 Harbor(推薦)
$ cat << EOF > harbor-https-values.yaml
#Ingress 網關入口配置
expose:
  type: ingress
  tls:
    ### 是否啟用 https 協議
    enabled: true
  ingress:
    hosts:
      ### 配置 Harbor 的訪問域名,需要注意的是配置 notary 域名要和 core 處第一個單詞外,其餘保持一致
      core: myharbor2.com
      notary: notary.myharbor2.com
    controller: default
    annotations:
      ingress.kubernetes.io/ssl-redirect: "true"
      ingress.kubernetes.io/proxy-body-size: "1024m"
      #### 如果是 traefik ingress,則按下面配置:
#      kubernetes.io/ingress.class: "traefik"
#      traefik.ingress.kubernetes.io/router.tls: 'true'
#      traefik.ingress.kubernetes.io/router.entrypoints: websecure
      #### 如果是 nginx ingress,則按下面配置:
      nginx.ingress.kubernetes.io/ssl-redirect: "true"
      nginx.ingress.kubernetes.io/proxy-body-size: "1024m"
      nginx.org/client-max-body-size: "1024m    "

## 如果Harbor部署在代理後,將其設置為代理的URL,這個值一般要和上面的 Ingress 配置的地址保存一致
externalURL: https://myharbor2.com

### Harbor 各個組件的持久化配置,並設置各個組件 existingClaim 參數為上面創建的對應 PVC 名稱
### harbor-nfs-storage需要提前創建nfs和storageClass
persistence:
  enabled: true
  ### 存儲保留策略,當PVC、PV刪除後,是否保留存儲數據
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      storageClass: "harbor-nfs-storage"
      size: 20Gi
    chartmuseum:
      storageClass: "harbor-nfs-storage"
      size: 5Gi
    jobservice:
      storageClass: "harbor-nfs-storage"
      size: 1Gi
    database:
      storageClass: "harbor-nfs-storage"
      size: 1Gi
    redis:
      storageClass: "harbor-nfs-storage"
      size: 1Gi
    trivy:
      storageClass: "harbor-nfs-storage"
      size: 5Gi
EOF

安裝

$ helm install myharbor2 harbor/harbor -f harbor-https-values.yaml -n harbor2
# 過一段時間查看
$ kubectl get ingress,pvc,pods -n harbor2

瀏覽器訪問:
https://myharbor2.com

6)清理

  • 強制刪除命名空間harbor/harbor2
$ kubectl get namespace harbor -o json \
            | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
            | kubectl replace --raw /api/v1/namespaces/harbor/finalize -f -
$ kubectl get namespace harbor2 -o json \
            | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
            | kubectl replace --raw /api/v1/namespaces/harbor2/finalize -f -
  • 批量刪除pvc
$ kubectl get pvc -n harbor | awk 'NR!=1{print $1}' | xargs kubectl delete pvc -n harbor
$ kubectl get pvc -n harbor2 | awk 'NR!=1{print $1}' | xargs kubectl delete pvc -n harbor2

八、把鏡像打標籤(tag)推送到harbor倉庫

1、添加域名映射,如果上面已經加過,可以忽略

$ cat <<EOF>> /etc/hosts
192.168.0.114 myharbor2.com
192.168.0.115 myharbor2.com
EOF

2、加入insecure-registries

$ vi /etc/docker/daemon.json
"insecure-registries":["https://myharbor2.com"]

重啟docker

$ systemctl restart docker

3、登錄

$ docker login --username=admin https://myharbor2.com
密碼:Harbor12345

4、創建harbor項目

5、通過腳本批量推送到harbor

# push-images-harbor.sh
#!/bin/bash

# 登錄
passwd="Harbor12345"

expect <<-EEFF
        set time 30
        spawn docker login --username=admin https://myharbor2.com/
        expect "*assword*"
        send "${passwd}\r"
        expect eof
EEFF

docker images|grep -v 'aliyuncs.com'|grep -v 'myharbor2.com'|awk 'NR!=1{print $1,$2,$3}' >images_list.txt

cat images_list.txt|while read im_name im_version im_id
do
   echo $im_name,$im_version,$im_id
   re=`docker images|grep 'myharbor2.com'|grep "$im_name"|wc -l`
   if [ $re -ne 0 ];then
        echo "[success] $im_name is taged"
        # push
        docker push myharbor2.com/harbor/${im_name}":"$im_version
        continue
   fi
   # tag
   docker tag $im_id myharbor2.com/harbor/${im_name}":"$im_version
   # push
   docker push myharbor2.com/harbor/${im_name}":"$im_version
done
rm -f images_list.txt

執行

$ sh push-images-harbor.sh

登錄網頁 harbor查看

九、把鏡像打標籤(tag)推送到阿里雲倉庫

1、先登錄自己的阿里雲(容器鏡像服務)

2、進入【個人實例】

3、創建命名空間

4、創建鏡像倉庫

5、進入到鏡像倉庫管理

6、按照文檔進行登錄,打標籤,推送到阿里雲

7、這裡提供腳本批量打標籤推送,切記把登錄用戶名和密碼換成自己的

# push-images-aliyun.sh
#!/bin/bash

# 登錄
passwd="xxxxxx"

expect <<-EEFF
        spawn docker login --username=xxxxxx registry.cn-hangzhou.aliyuncs.com
        expect "*assword*"
        send "${passwd}\r"
        expect eof
EEFF

docker images|grep -v 'aliyuncs.com'|tr '/' '-'|awk 'NR!=1{print $1"-"$2,$3}' >images_list.txt

cat images_list.txt|while read im_name im_id
do
   echo $im_name,$im_id
   re=`docker images|grep "$im_name"|wc -l`
   if [ $re -ne 0 ];then
        echo "[success] $im_name is taged"
        # push
        docker push registry.cn-hangzhou.aliyuncs.com/harbor-ns/harbor:${im_name}
        continue
   fi
   # tag
   docker tag $im_id registry.cn-hangzhou.aliyuncs.com/harbor-ns/harbor:${im_name}
   # push
   docker push registry.cn-hangzhou.aliyuncs.com/harbor-ns/harbor:${im_name}
done
rm -f images_list.txt

執行

$ sh push-images-aliyun.sh

8、查看(容器鏡像服務/實例列表/鏡像倉庫/鏡像版本)

十、總結

1)Helm3和Helm2的區別

  • 移除Tiller(前面已經講解過了、這裡不再重複);
  • Release 名稱可在不同 ns 間重用;
  • 必須指定Release名稱;
  • 支持將 Chart 推送至 Docker 鏡像倉庫中;
  • 移除 helm serve。

2)常用命令

helm version                            // 查看helm版本
helm create xxx                         // 創建一個xxx charts
helm install xxx1 ./xxx                 // 部署安裝xxx,設置名稱為xxx1
helm uninstall xxx1                     // 卸載刪除xxx1
helm list                               // 列出已經部署的charts
helm lint ./xxx                         // 檢查包的格式或信息是否有問題
helm package ./xxx                      // 打包charts
helm template helm_charts-0.1.1.tgz     // 查看生成的模板
helm repo add --username admin --password password myharbor xxx  // 增加repo
helm repo update                        // 更新倉庫資源
helm search repo                        // 從你添加(使用 helm repo add)到本地 helm 客戶端中的倉庫中進行查找。該命令基於本地數據進行搜索,無需連接網際網路 
helm search hub                         // 從 Artifact Hub 中查找並列出 helm charts。 Artifact Hub中存放了大量不同的倉庫
Helm charts
關鍵字: