• Kubernetes(k8s)包管理器Helm(Helm3)介绍&Helm3安装Harbor


    一、概述

    我们可以将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
    
  • 相关阅读:
    [bug] MySQL: The user specified as a definer ('root'@'%') does not exist
    [java] Maven安装本地jar包
    [bug] Openresty:content_by_lua_file 404
    [bug] Failed building wheel for xxx
    [bug] TypeError : unsupported operand type(s) for += : 'NoneType' and 'int'
    [Python] Flask从0到1开发轻量级网页
    [bug]Flask:KeyError: 'A secret key is required to use CSRF.'
    [bug] sqlalchemy.exc.InternalError: (pymysql.err.InternalError) (1054, "Unknown column 'recevie_name' in 'field list'")
    mac os 解决Error: EMFILE: too many open files错误
    从零开始的react入门教程(一),让我们从hello world开始
  • 原文地址:https://www.cnblogs.com/liugp/p/16440583.html
Copyright © 2020-2023  润新知