柴少鹏的官方网站 技术在分享中进步,水平在学习中升华

kubernetes搭建企业级镜像仓库(二)

一、镜像仓库了解

1.1 容器镜像的简单了解

      容器镜像是一个轻量独立和可执行的软件包,它包含完整的代码、运行环境、配置等。镜像由多个联合文件系统(Union Filesystem)的文件层组成,它的每层都是只读的,构建完成的镜像不可更改。在容器运行时,会在最顶层添加一个可写层。

      镜像可以通过拷贝打包后的镜像文件进行分发也可以通过镜像仓库进行分发。   

      容器的详细介绍:http://blog.51niux.com/?id=185

1.2 镜像仓库的简单了解

      镜像仓库(Docker Registry)负责存储、管理和分发镜像。镜像仓库管理多个仓库(Repository),仓库通过命名来区分。每个仓库包含一个或多个镜像,镜像通过标签(Tag)来区分。

     客户端拉取镜像时,要指定三个要素:镜像仓库(通常默认使用Docker Hub当然也可以配置文件进行修改),仓库(拉取的应用),标签(镜像的版本,不指定标签时默认使用latest).

      镜像仓库直接管理的对象不是具体的镜像,而是仓库(Repository)。仓库通过标签(Tag)管理镜像。

image.png

      Docker 镜像拉取过程: 获取镜像的Manifest信息文件、找出不在本地的layers、下载 Blobs如果对应层找不到、解压 Blobs 并导入到Docker 引擎。

      由上图可以看到,镜像由元数据和块文件两部分组成,镜像仓库的核心职能就是管理这两项数据。元数据用于描述一个镜像的核心信息,包含镜像的镜像仓库、仓库、标签、校验码、文件层、镜像构建描述等信息。块文件是组成镜像的联合文件层的实体,每一个块文件是一个文件层,内部包含对应文件层的变更。

      镜像仓库根据文件层的校验码来管理每个块文件。当多个镜像基于同一个基础镜像构建时,这些镜像拥有相同的基础块文件,这些镜像在镜像仓库中共享这部分块文件。所以,在删除镜像时不能直接删除镜像引用的所有镜像块文件,而是由专门的垃圾回收器来清理没有被引用的块文件。

1.3 企业级镜像仓库简单了解

      镜像仓库一般分为公有镜像仓库和私有镜像仓库。公有镜像仓库是指暴露在互联网上面,比如docker.io、quay.io、gcr.io等熟知的公有镜像仓库。私有镜像仓库就是个人或者企业内部搭建的内部用的镜像仓库。当然虽然公有镜像仓库有使用便捷、不用维护、使用成本低方面的优势,也存在着隐私和敏感数据容易暴露、网络连通和带宽吞吐量、权限管理、稳定性方面的局限性。

      Docker 虽然提供公有镜像仓库 Docker hub,但是满足不了绝大部分企业对镜像仓库私有化部署的需求。 私有镜像仓库解决方案中,作为 CNCF项目的 Harbor长期处于统治地位,得到非常广泛的使用。Red Hat开源镜像仓库项目Quay是另一个具有竞争力的产品(Quay 其实是非常有名的开源公司 CoreOS 的产品,CoreOS 在 2018 被 Red Hat 收购)。2018年7月,VMware捐赠Harbor给CNCF,2020年6月,Harbor成为首个中国原创的CNCF毕业项目。

      好了这两个产品的比较网上一搜一大堆,现在我们还是使用主流大家比较常用的 Harbor(Harbor是VMware 中国研发团队在2016年开源的镜像仓库项目)吧。

1.4 简单了解下Harbor

      github地址:https://github.com/goharbor/harbor

      官网地址:https://goharbor.io/

      文档:https://goharbor.io/docs/

      image.png

#上图是一个网上找的Harbor的架构图。

Harbor的服务包括:

Harbor 核心服务:提供Harbor的核心管理服务API,包括仓库管理、认证管理、授权管理、配置管理、项目管理、配额管理、签名管理、副本管理等。
Harbor Portal:Harbor的Web界面。
Registry:Registry负责接收客户端的pull/push请求,其核心为docker/Distribution(实现了打包、发布、存储和镜像发放的工具)。
副本控制器:Harbor可以以主从模式来部署镜像仓库,副本控制器将镜像从主镜像服务分发到从镜像服务。
日志收集器:收集各模块的日志。
垃圾回收控制器:回收日常操作中删除镜像记录后遗留在块存储中的孤立块文件。

        Harbor支持多种后端数据库(比如MySQL、PostgreSQL)。数据库存储着镜像仓库的用户、用户组、授权、仓库、镜像manifest、块文件索引等。镜像的块文件不适合使用数据库存储,测试环境可以使用文件系统作为块文件存储,生产环境还是需要使用网络磁盘作为块文件存储,比如使用Ceph,NFS虽然可以挂载多实例但是NFS存在同一时间只能有一个实例写入的问题(NFS 写入是由每个实例的文件系统通过竞争得到的分布式文件锁,因此需要额外的逻辑来控制镜像仓库的写入)。

image.png

如上图,Harbor的核心组件:

核心功能组件:

Portal:这是一个基于Angular的前端应用,对应的容器为portal,由容器内置的Nginx 服务器提供静态资源的服务。用户在用浏览器访问Harbor的用户界面时,代理层的Nginx反向代理会将请求转发到portal容器中的Nginx服务
Core:这是Harbor中的核心组件,封装了Harbor绝大部分的业务逻辑。它基于Beego框架提供了中间件和RESTful API处理器(API Handlers)来处理界面及其他客户端发来的API请求。
Docker Distribution:为由Docker公司维护的Distribution镜像仓库,实现了镜像推送和拉取等功能。Harbor通过Distribution实现了Artifact的读写和存取等功能。
RegistryCtl:Docker Distribution的控制组件,与Docker Distribution共享配置,并提供了RESTful API以便触发垃圾回收动作。
JobService:JobService是异步任务组件,负责Harbor中很多比较耗时的功能,比如 Artifact 复制、扫描、垃圾回收等,都是以后台异步任务的方式运行的。JobService提供了管理和调度任务的功能。

数据存储组件:

上面的核心组件只负责处理业务逻辑和用户请求,都是以无状态服务的形式运行的,而对业务数据和Artifact内容的保存和持久化都是通过数据存储组件完成的。

数据库:Harbor的应用数据,比如项目信息、用户与项目的关系、管理策略和配置信息等,都保存在这个关系型数据库中。Artifact的元数据,比如类型、大小、Tag等也会保存在这里。
缓存服务(Redis):主要作为缓存服务存储一些生命周期较短的数据,如在水平扩展时多个实例共享的状态信息等。另外,出于性能等方面的考虑,JobService组件有极少量的持久化数据也保存在Redis中。
Artifact存储:这是存储Artifact本身内容的地方,也就是每次用命令行工具推送容器镜像、Helm Chart或其他Artifact时,数据最终的存储目的地。

可选组件:

核心组件实现了基本的Artifact管理功能。在此基础上,Harbor通过与第三方开源软件集成来提供诸如镜像签名、漏洞扫描等功能,这部分功能服务叫作可选组件。

Notary:基于TUF提供了镜像签名管理的功能。用户选择安装Notary后,在安装部署Harbor时会额外安装notary-server和notary-signer两个组件,其中notaryserver负责接收客户端的请求管理签名,notary-signer负责对签名的元数据再进行签名,以提高安全性。
扫描器:在Harbor 2.0版本中,支持将Clair或Trivy作为镜像扫描器和Harbor一起安装。
ChartMuseum:提供了API管理非OCI规范的Helm Chart。

Harbor的特性:

Cloud native registry(云registry):支持对container images and Helm charts,Harbor serves作为Container Runtifies和Orchestration平台等云本机环境的registry。
Role based access control(基于角色的访问控制):用户通过“projects”访问不同的存储库,用户可以在projects下具有不同的images or Helm charts的权限。
Policy based replication(基于策略的复制): 可以根据使用过滤器(repository, tag and label))的策略在多个注册表实例之间复制(同步)Images and charts。 如果遇到任何错误,则Harbor 会自动重试复制。 这可用于帮助LoadAlancing,实现高可用性,并促进混合和多云场景中的多数据中心部署。
Vulnerability Scanning(漏洞扫描):Harbor定期扫描images漏洞,并具有策略检查,以防止部署易受攻击的image。
LDAP/AD support(LDAP/AD支持): Harbour集成了现有的企业LDAP/AD用于用户身份验证和管理,并支持将LDAP组导入Harbor,然后可以为特定项目提供权限。
OIDC support(OIDC支持): Harbor利用OpenID Connect(OIDC)来验证外部授权服务器或身份提供商认证的用户身份。 单点登录可以启用登录Harbor门户。
Image deletion & garbage collection(image删除和垃圾回收): 系统管理员可以运行垃圾收集作业,以便可以删除image(dangling manifests和未引用的Blob),并且它们的空间可以定期释放。
Notary(公证信息): 使用Docker内容信任(利用Notary)支持签名容器image,以保证真实性和出处。 此外,还可以激活阻止未签名image的策略。
Graphical user portal(图像用户门户):用户可以轻松浏览,搜索存储库和管理项目。
Auditing(审核):通过日志跟踪存储库的所有操作。
RESTful API: 提供RESTful API以促进管理操作,并且易于使用与外部系统集成。 嵌入式播放UI可用于探索和测试API。
Easy deployment(轻松部署):Harbor 可以通过Docker组合部署,也可以使用Helm Chart,并且最近增加了Harbor Operator。

二、安装Harbor

官网安装文档:https://goharbor.io/docs/2.0.0/install-config/

2.1 安装前准备

#yum -y install yum-utils device-mapper-persistent-data lvm2   #安装基础软件包

#确保docker-ce安装并版本大于17.06.0-ce+ 

# wget https://github.com/docker/compose/releases/download/1.29.2/docker-compose-Linux-x86_64

# mv docker-compose-Linux-x86_64 docker-compose

# chmod +x docker-compose

# cp docker-compose /usr/local/bin/

# docker-compose -version

docker-compose version 1.29.2, build 5becea4c

2.2 离线安装

# wget https://github.com/goharbor/harbor/releases/download/v2.3.1/harbor-offline-installer-v2.3.1.tgz

# tar xf harbor-offline-installer-v2.3.1.tgz

# cd harbor

# ls -lh

image.png

解压离线安装包,可以看到在harbor文件夹下有如下文件。

common.sh:安装脚本的工具脚本。
harbor.v2.0.0.tar.gz:各个功能组件的镜像文件压缩包。
harbor.yml.tmpl:配置文件的模板,在配置好后需要将此文件的后缀名“tmpl”去掉或者复制生成新的文件harbor.yml。
install.sh:安装脚本。
LICENSE:许可文件。
prepare:准备脚本,将harbor.yml配置文件的内容注入各组件的配置文件中。

2.3 在线安装

#wget https://github.com/goharbor/harbor/releases/download/v2.3.1/harbor-online-installer-v2.3.1.tgz

# tar xf harbor-online-installer-v2.3.1.tgz

# cd harbor

# ls -lh

image.png

#可以看到就是离线安装里面已经有各个功能组件的镜像文件了,而在线安装要在线的去下载很多东西。

博文来自:www.51niux.com

2.4 配置HTTPS访问Harbor

#承接上面继续操作

       默认情况下,Harbor不会附带证书。可以无需安全部署Harbor,因此你可以通过HTTP连接到它。但是,仅在不具有与外部互联网连接的测试或开发环境中,使用HTTP可接受。使用HTTP将你暴露于中间人攻击。在生产环境中,始终使用HTTPS。如果你enable Content Trust with Notary 以正确签署所有image,则必须使用HTTPS。

      要配置HTTPS,必须创建SSL证书。你可以使用由可信第三方CA签名的证书,或者你可以使用自签名证书。本节介绍如何使用OpenSSL创建CA,以及如何使用CA签署服务器证书和客户端证书。你可以使用其他CA提供程序,例如Let's Encrypt。

      下面的过程假设你的Harbor registry's hostname 是你的yourdomain.com,并且其DNS记录请求到Harbor的主机。

Generate a Certificate Authority Certificate(生成证书颁发机构证书):

在生产环境中,你应该从CA机构获取证书。 在测试或开发环境中,你可以生成你自己的CA. 要生成CA CertFicate,请运行以下命令。

# mkdir harbor_cert

#cd harbor_cert/

# 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=nbharbor.com"  -key ca.key  -out ca.crt   #调整-subj选项中的值以反映你的organization(组织)。如果使用FQDN连接你的Harbor主机,则必须将其指定为常用名称(CN)属性。

Generate a Server Certificate(生成服务证书):

证书通常包含一个.crt文件和.key文件,例如,yourdomain.com.crt和yourdomain.com.key。

# openssl genrsa -out nbharbor.com.key 4096  #生成私钥

# openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=nbharbor.com"  -key nbharbor.com.key  -out nbharbor.com.csr  #生成证书签名请求(CSR)。

# vim  v3.txt

authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=nbharbor.com

# openssl x509 -req -sha512 -days 3650     -extfile v3.txt     -CA ca.crt -CAkey ca.key -CAcreateserial     -in nbharbor.com.csr     -out nbharbor.com.crt  #使用V3.txt文件为你的harbor主机生成证书。

为Harbor and Docker提供证书:

在生成 ca.crt, yourdomain.com.crt, and yourdomain.com.key文件后,必须向harbor和Docker提供,并重新配置harbor使用它们。

# openssl x509 -inform PEM -in nbharbor.com.crt -out nbharbor.com.cert  #将yourdomain.com.crt转换为yourdomain.com.cert,供Docker使用。Docker守护程序将.crt文件作为CA证书和.cert文件作为客户端证书。

# mkdir /etc/docker/certs.d/nbharbor.com/ -p

# cp {nbharbor.com.cert,nbharbor.com.key,ca.crt} /etc/docker/certs.d/nbharbor.com/   #将server certificate, key and CA文件复制到Harbor主机上的Docker证书文件夹中。 你必须先创建相应的文件夹。

#如果将默认的nginx端口443映射到其他端口,请创建文件夹:/etc/docker/certs.d/yourdomain.com:port, or /etc/docker/certs.d/harbor_IP:port.

# systemctl restart docker   #重启docker引擎

2.5 启动Harbor

# cat harbor.yml|grep -v "#"|grep -v "^$"   #看看最后成型的配置哈,大部分保持默认就先修改下hostname,certificate和private_key

hostname: nbharbor.com   #你要被请求的域名
http:   #80端口完全不用要的,因为你就算访问http也会给你转发到443端口
  port: 80
https:
  port: 443
  certificate: /opt/harbor_cert/nbharbor.com.crt   #我们的证书路径
  private_key: /opt/harbor_cert/nbharbor.com.key
harbor_admin_password: Harbor12345   #admin的密码也就是登录harbor的admin密码
database:    
  password: root123   #数据库密码
  max_idle_conns: 100
  max_open_conns: 900
data_volume: /opt/harbordata   #Harbor 的镜像存储地址,目录提前创建
trivy:
  ignore_unfixed: false
  skip_update: false
  insecure: false
jobservice:
  max_job_workers: 10
notification:
  webhook_job_max_retry: 10
chart:
  absolute_url: disabled
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor
_version: 2.3.0
proxy:
  http_proxy:
  https_proxy:
  no_proxy:
  components:
    - core
    - jobservice
    - trivy

#mkdir /opt/harbordata 

# ./install.sh  #执行安装,拉取好多镜像,可以看到完整的过程

image.png

#反正如上图最后一篇绿色的done就OK了,如果有问题会有报错提示的,根据报错提示改就行了。

2.6 验证一下

window的hosts文件配置一条记录:

192.168.1.164 nbharbor.com

浏览器请求一下:https://nbharbor.com

image.png

image.png

#通过浏览器访问可以看到已经可以登陆Web页面了。

# docker ps |grep goharbor

image.png

#可以看到是很多的容器在响应着服务。

# ls -l /opt/harbordata/   #查看数据目录,如果修改了数据目录位置记得把这些数据目录拷贝到新的目录哦

image.png

上传镜像验证一下:

# docker login https://nbharbor.com/

image.png

# docker pull busybox  #拉取一个镜像

# docker tag busybox:latest nbharbor.com/library/busybox:latest   #将本地镜像打上私有仓库

# docker push nbharbor.com/library/busybox:latest  #上传镜像

image.png

#查看web页面已经有镜像上传上来了。

# docker image rm nbharbor.com/library/busybox

# docker image rm busybox

# docker pull nbharbor.com/library/busybox:latest

image.png

#可以看到有一次下载了,这样就验证了使用docker上传和下载。

博文来自:www.51niux.com

创建一个私有仓库再试一下:

#先在web页面创建一个test的私有仓库

# docker pull nginx

# docker tag nginx:latest nbharbor.com/test/nginx:latest

# docker push nbharbor.com/test/nginx:latest

image.png

2.7 harbor服务重启

#也不能每次重启都执行./install.sh哈。

# docker-compose down -v  #这是关闭所有服务

image.png

# docker-compose up -d   #这是启动所有服务

#如果修改了配置文件就要先执行./prepare 再执行启动命令。

博文来自:www.51niux.com

三、Helm Chart安装Harbor

3.1前置准备

#这里使用的本地盘,所以要先提前在Node节点创建挂载目录

#mkdir /data/disks/{registry,chartmuseum,jobservice,database,redis,trivy} -p

#chmod 777 -R /data/disks/*   #因为这些写入都是用root用户操作的,所以不授权的话当你docker push的时候会发现报500错误推不上来。

# cat pv/harbor-pv.yaml   #创建pv-pvc,当然这种本地盘的方式有问题,你只能挂载到某个Node节点并数据不共享,这里只是简单测试展示一下。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: "harbor-registry-pv"
  labels:
    name: harbor-registry-pv
    release: stable
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/disks/registry
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: "harbor-chartmuseum-pv"
  labels:
    name: harbor-chartmuseum-pv
    release: stable
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/disks/chartmuseum
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: "harbor-jobservice-pv"
  labels:
    name: harbor-jobservice-pv
    release: stable
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/disks/jobservice
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: "harbor-database-pv"
  labels:
    name: harbor-database-pv
    release: stable
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/disks/database
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: "harbor-redis-pv"
  labels:
    name: harbor-redis-pv
    release: stable
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/disks/redis
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: "harbor-trivy-pv"
  labels:
    name: harbor-trivy-pv
    release: stable
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  hostPath:
    path: /data/disks/trivy
    type: DirectoryOrCreate
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: harbor-registry-pvc
  namespace: kube-harbor
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      name: harbor-registry-pv
      release: stable
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: harbor-chartmuseum-pvc
  namespace: kube-harbor
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      name: harbor-chartmuseum-pv
      release: stable
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: harbor-jobservice-pvc
  namespace: kube-harbor
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      name: harbor-jobservice-pv
      release: stable
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: harbor-database-pvc
  namespace: kube-harbor
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      name: harbor-database-pv
      release: stable
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: harbor-redis-pvc
  namespace: kube-harbor
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      name: harbor-redis-pv
      release: stable
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: harbor-trivy-pvc
  namespace: kube-harbor
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      name: harbor-trivy-pv
      release: stable

#kubectl apply -f harbor-pv.yaml  -n kube-harbor

# kubectl get pv -n kube-harbor

image.png

# kubectl get pvc -n kube-harbor

image.png

3.2 获取Helm Chart

#上面都是直接docker托管,没有把k8s的特性用起来啊,所以我们得用K8S部署哈。

helm 是基于 kubernetes 的包管理器。它之于 kubernetes 就如 yum 之于 centos,pip 之于 python,npm 之于 javascript

Helm 有两个重要得概念:chart 和 release

chart :是创建一个应用的信息集合,包括各种 kubernetes 对象得配置模板、参数定义、依赖关系、文档说明等,可以将 chart 想象成 yum 中的软件安装包
release :是chart的运行实例,代表了一个正在运行的应用。当 chart被安装到 kubernetes集群,就会生成一个release,chart能够多次安装到同一个集群,但是只会有一个release

# wget https://get.helm.sh/helm-v3.6.3-linux-amd64.tar.gz

# tar xf helm-v3.6.3-linux-amd64.tar.gz

# cp linux-amd64/helm /usr/local/bin/

# helm version  #验证一下

version.BuildInfo{Version:"v3.6.3", GitCommit:"d506314abfb5d21419df8c7e7e68012379db2354", GitTreeState:"clean", GoVersion:"go1.16.5"}

# helm  repo add harbor https://helm.goharbor.io   #添加Helm Chart仓库

# helm repo list   #查询当前集群有哪些chart库

# helm search repo harbor   #查询harbor有哪些安装程序

# helm fetch harbor/harbor   #下载到本地

# tar xf harbor-1.7.1.tgz

# cp values.yaml new-values.yaml

# vim new-values.yaml  #只粘贴修改部分,字段意思配置文件中有注释解释

expose:
  #type: ingress
  type: nodePort  #使用ingress还得k8s部署ingress,这里我们省事一点直接用nodeport的方式
  tls:
    #enabled: true
    enabled: false   #先把tls认证关闭吧  
externalURL: http://192.168.1.164:30002   #这里很重要不然可能启动后登录失败提示账号密码不对
persistence:
  persistentVolumeClaim:
    registry:
      existingClaim: "harbor-registry-pvc"
    chartmuseum:
      existingClaim: "harbor-chartmuseum-pvc"
    jobservice:
      existingClaim: "harbor-jobservice-pvc"
    database:
      existingClaim: "harbor-database-pvc"
    redis:
      existingClaim: "harbor-redis-pvc"
    trivy:
      existingClaim: "harbor-trivy-pvc"

# helm install -name new-harbor -f ./harbor/new-values.yaml --namespace kube-harbor ./harbor   #安装并启动

#如果我们使用修改默认的values.yaml文件的话,以values.yaml启动就简单好多了# helm install new-harbor harbor -n kube-harbor

NAMESPACE: kube-harbor
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Please wait for several minutes for Harbor deployment to complete.
Then you should be able to visit the Harbor portal at http://192.168.1.164:30002
For more details, please visit https://github.com/goharbor/harbor

#出现上图表示没有报错启动成功,详细的参数可参考:https://github.com/goharbor/harbor-helm

博文来自:www.51niux.com

# kubectl get pods -n kube-harbor -o wide   #可以看到容器都启动了

image.png

#如果需要卸载并停掉服务:# helm uninstall -name new-harbor -n kube-harbor

# kubectl get all -n kube-harbor  #可以看下此命名空间下的整体情况,可以看到443端口没有nodeport因为我们没有启用READY没有0就好。

#然后nginx做个80端口域名转发到k8s的Node节点的30002端口便可,比如:http://harbor.nbharbor.com/转发到193.168.1.164:30002

3.3 小小的验证一下

# docker login 192.168.1.164:30002

Username (admin): admin
Password:
Error response from daemon: Get "https://192.168.1.164:30002/v2/": http: server gave HTTP response to HTTPS client

#因为docker1.3.2版本开始默认docker registry使用的是https

# vim /etc/docker/daemon.json  #在要测试的机器上面进行配置跳过https认证

{
  "insecure-registries": [
    "192.168.1.164:30002"
  ]
}

# service docker restart

#再认证就OK了http形式也可以了。

#docker pull  mysql

#docker pull redis

#docker tag mysql:latest 192.168.1.164:30002/database/mysql:latest

#docker tag redis:latest 192.168.1.164:30002/database/redis:latest

# docker push 192.168.1.164:30002/database/mysql:latest

# docker push 192.168.1.164:30002/database/redis:latest

image.png

image.png

#可以看到已经把镜像推送到了私有镜像仓库。

3.4 扫描与清理

漏洞扫描:

#要使用漏洞扫描,系统就首先需要配置至少一个扫描器。可以在安装Harbor系统时安装默认的扫描器(仅支持Trivy和Clair),也可以在安装Harbor系统后独立安装、配置所选择的扫描器。管理和配置扫描器均可通过扫描器管理页面实现。

image.png

#用的Trivy进行的扫描如下图:

image.png

#在项目里点击扫描器按钮,左下角点击"选择扫描器"如果有多个扫描器还可以选择其他的选择器,现在默认是Trivy。

垃圾回收:

Harbor对Artifact的删除是“软删除”。软删除即仅删除Artifact对应的数据记录,并不做存储删除,真正的存储删除交由垃圾回收任务完成。在Web页面就可以删除镜像文件可以自己点点看。

3.5 镜像代理

#大家都知道很多镜像都在国外,有的时候网络不通有的时候下载限速,如果突破这种限制呢,肯定是本地搞代理了。在harbor 2.1开始,提供了镜像缓存的功能,当需要一些常用的公用镜像时但本地私有镜像没有时,可以通过proxy cache功能去公有的镜像仓库下载到本地然后使用。

配置代理:

系统管理=》仓库管理=》新建目标

image.png

项目=》新建项目

image.png

使用代理:

# docker pull 192.168.1.164:30002/docker-hub-proxy/library/php:latest

# docker pull 192.168.1.164:30002/docker-hub-proxy/library/memcached:latest

#第一次的时候肯定是慢的,再次下载的时候就会变快了。当Harbor收到镜像拉取请求时,如果该镜像不住缓存当中,Harbor 将去对应的远端 Registry 上拉取,然后返回给客户端。然后该镜像会被缓存下来,下次同样的请求发到 Harbor 服务时,不通过外部网络就可以直接返回本地缓存的镜像。Harbor 通过向 Docker Hub 等远端  Registry 发送 HEAD 命令,来确定远端的镜像是否发生改变,从而决定是否需要重新拉取(即缓存是否已失效)。

image.png

#这个显示是有点延迟的,不是立马就能看到,可以看到镜像仓库里面多了两个缓存的镜像。

作者:忙碌的柴少 分类:kubernetes 浏览:125 评论:0
留言列表
发表评论
来宾的头像