Published on

Kubernetes使用helm安装Harbor管理image和chart

Authors
  • avatar
    Name
    老杨的博客
    Twitter

Kubernetes 使用 helm 安装 Harbor 管理 image 和 chart

[TOC]

1. 环境说明

  • 可用的 kubernetes 集群
  • 可用的 helm 服务端、客户端
  • 可用的 kubeapps

2. helm 安装 Harbor

根据官方文档安装,可能失败的是下载 redis 依赖包:

helm dependency update

Downloading redis from repo https://kubernetes-charts.storage.googleapis.com
Save error occurred:  could not download https://kubernetes-charts.storage.googleapis.com/redis-3.2.5.tgz: Get https://kubernetes-charts.storage.googleapis.com/redis-3.2.5.tgz: dial tcp 216.58.200.240:443: i/o timeout

如果下载失败,可以手动准备 redis:

[root@lab1 harbor]# helm search redis
NAME                                    CHART VERSION   APP VERSION     DESCRIPTION
aliyun/redis                            1.1.15          4.0.8           Open source, advanced key-value store. It is of...
aliyun/redis-ha                         2.0.1                           Highly available Redis cluster with multiple se...
bitnami/redis                           4.0.1           4.0.11          Open source, advanced key-value store. It is of...
incubator/redis-cache                   0.3.3           3               A pure in-memory redis cache, using statefulset...
mycharts/redis-ha                       2.0.1                           Highly available Redis cluster with multiple se...
stable/prometheus-redis-exporter        0.3.2           0.21.1          Prometheus exporter for Redis metrics
stable/redis                            4.0.1           4.0.11          Open source, advanced key-value store. It is of...
stable/redis-ha                         2.2.3           4.0.8-r0        Highly available Redis cluster with multiple se...
aliyun/sensu                            0.2.0                           Sensu monitoring framework backed by the Redis ...
stable/sensu                            0.2.3           0.28            Sensu monitoring framework backed by the Redis ...
[root@lab1 harbor]# helm repo list
NAME            URL
monocular       https://helm.github.io/monocular
bitnami         https://charts.bitnami.com/bitnami
gitlab          https://charts.gitlab.io/
incubator       https://kubernetes-charts-incubator.storage.googleapis.com/
aliyun          https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
stable          https://kubernetes-charts.storage.googleapis.com/
mycharts        https://reg.linuxba.com/chartrepo/pub
[root@lab1 harbor]# cd charts/
[root@lab1 charts]# helm fetch aliyun/redis --untar

后面安装基本没有什么问题。

3. kubeapps 添加 harbor 仓库

比如我用的仓库名为:pub

可以手动上传一个 chart 包,然后进入查看详情,可以看到仓库地址:

在 kubeapps 中添加仓库时,需要使用 bearer token,下面是获取方法:

curl -i -k -u "admin:password" "https://reg.linuxba.com/service/token?account=admin&service=harbor-registry&scope=repository:pub/"

4. 效果图

以下是我的使用效果图

5. 一个上传 chart 脚本

#!/usr/bin/env bash
##############################################################
# File Name:
# Version: V1.0
# Author: Chinge_Yang
# Blog: http://blog.csdn.net/ygqygq2
# Created Time : 2018-09-25 15:32:50
# Description: 上传chart包到harbor仓库
##############################################################

#获取脚本所存放目录
cd `dirname $0`
bash_path=`pwd`

chart_name="$1"
user_name="admin"
password="password"
project_name="${2:-pub}"
request_url="https://reg.linuxba.com/api/chartrepo/$project_name/charts"
charts_dir=$bash_path/charts

#脚本名
me=$(basename $0)
log_dir=$bash_path/log
shell_log=$log_dir/${USER}_${me}.log

#定义保存日志函数
function save_log () {
    echo -e "`date +%F\ %T` $*" >> $shell_log
}

[ ! -d $log_dir ] && mkdir -p $log_dir

#定义输出颜色函数
function red_echo () {
#用法:  red_echo "内容"
    local what=$*
    echo -e "\e[1;31m ${what} \e[0m"
}

function green_echo () {
#用法:  green_echo "内容"
    local what=$*
    echo -e "\e[1;32m ${what} \e[0m"
}

function yellow_echo () {
#用法:  yellow_echo "内容"
    local what=$*
    echo -e "\e[1;33m ${what} \e[0m"
}

function twinkle_echo () {
#用法:  twinkle_echo $(red_echo "内容")  ,此处例子为红色闪烁输出
    local twinkle='\e[05m'
    local what="${twinkle} $*"
    echo -e "${what}"
}

function return_echo () {
    [ $? -eq 0 ] && green_echo "$* 成功" && return 0 || red_echo "$* 失败" && return 1
}

function return_error_exit () {
    [ $? -eq 0 ] && REVAL="0"
    local what=$*
    if [ "$REVAL" = "0" ];then
        [ ! -z "$what" ] && green_echo "$what 成功"
    else
        red_echo "$* 失败,脚本退出"
        exit 1
    fi
}

#定义确认函数
function user_verify_function () {
    while true;do
        echo ""
        read -p "是否确认?[Y/N]:" Y
        case $Y in
    [yY]|[yY][eE][sS])
        echo -e "answer:  \\033[20G [ \e[1;32m是\e[0m ] \033[0m"
        break
        ;;
    [nN]|[nN][oO])
        echo -e "answer:  \\033[20G [ \e[1;32m否\e[0m ] \033[0m"
        exit 1
        ;;
      *)
        continue
        ;;
        esac
    done
}

#定义跳过函数
function user_pass_function () {
    while true;do
        echo ""
        read -p "是否确认?[Y/N]:" Y
        case $Y in
            [yY]|[yY][eE][sS])
            echo -e "answer:  \\033[20G [ \e[1;32m是\e[0m ] \033[0m"
            break
            ;;
            [nN]|[nN][oO])
            echo -e "answer:  \\033[20G [ \e[1;32m否\e[0m ] \033[0m"
            return 1
            ;;
            *)
            continue
            ;;
            esac
    done
}

function usage() {
    if [ $# -lt 1 ]; then
        echo $"Usage: $0 {chart_file|chart_directory}"
        exit 0
    fi
}

function push () {
    if [ ! "$(ls ${chart_name} 2>/dev/null|grep '.tgz')" ]; then
        if [ -d $chart_name ]; then
            echo -e "helm package $(basename $chart_name)"
            helm package $(basename $chart_name)
            #echo -e "mv -f *.tgz charts/"
            mv -f *.tgz charts/
            chart_file=$(ls -r $charts_dir/$(echo ${chart_name}|sed -r 's@\/$@@')-*.tgz|head -n 1)
        else
            return_error_exit "检查目录"
        fi
    else
        if [ -f $chart_name ]; then
            chart_file=$chart_name
        else
            return_error_exit "检查文件"
        fi
    fi

    result=$(curl -i -u "$user_name:$password" -k -X POST "${request_url}" \
        -H "accept: application/json" \
        -H "Content-Type: multipart/form-data" \
        -F "chart=@${chart_file};type=application/x-compressed" 2>/dev/null
    )
    if echo $result |grep '{"saved":true}'>/dev/null; then
        save_log push ${chart_file} sucessed
    else
        save_log push ${chart_file} failed
    fi
}

usage $*
push

参考资料: [1] https://github.com/goharbor/harbor
[2] https://github.com/goharbor/harbor-helm
[3] https://github.com/goharbor/harbor/blob/master/docs/swagger.yaml