Kubernetes部署(十二):helm部署harbor企业级镜像仓库

相关内容:

Kubernetes部署(一):架构及功能说明
Kubernetes部署(二):系统环境初始化
Kubernetes部署(三):CA证书制作
Kubernetes部署(四):ETCD集群部署
Kubernetes部署(五):Haproxy、Keppalived部署
Kubernetes部署(六):Master节点部署
Kubernetes部署(七):Node节点部署
Kubernetes部署(八):Flannel网络部署
Kubernetes部署(九):CoreDNS、Dashboard、Ingress部署
Kubernetes部署(十):储存之glusterfs和heketi部署
Kubernetes部署(十一):管理之Helm和Rancher部署
Kubernetes部署(十二):helm部署harbor企业级镜像仓库

harbor简介

harbor官方githubhttps://github.com/goharbor
Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器。Harbor通过添加用户通常需要的功能(如安全性,身份和管理)来扩展开源Docker Distribution。使registry更接近构建和运行环境可以提高图像传输效率。Harbor支持在registry之间复制映像,还提供高级安全功能,如用户管理,访问控制和活动审计。

特征

  • 云原生注册表:Harbour 支持容器镜像和Helm chart,可用作本地云环境(如容器运行和业务流程平台)的注册表。
  • 基于角色的访问控制:用户和存储库通过“项目”进行组织,用户可以对项目下的镜像拥有不同的权限。
  • 基于策略的映像复制:可以基于具有多个过滤器(存储库,标记和标签)的策略在多个注册表实例之间复制(同步)映像。如果遇到任何错误,Harbor将自动重试进行复制。非常适合负载平衡,高可用性,多数据中心,混合和多云场景。
  • 漏洞扫描:Harbor定期扫描镜像并警告用户漏洞。
  • LDAP / AD支持:Harbor与现有企业LDAP / AD集成以进行用户身份验证和管理,并支持将LDAP组导入Harbor并为其分配适当的项目角色。
  • 镜像删除和垃圾收集:可以删除图像,并可以回收它们的空间。
  • 公证:可以确保镜像的真实性。
  • 图形用户门户:用户可以轻松浏览,搜索存储库和管理项目。
  • 审计:跟踪存储库的所有操作。
  • RESTful API:适用于大多数管理操作的RESTful API,易于与外部系统集成。
  • 易于部署:提供在线和离线安装程序。

    先决条件

  • Kubernetes集群 1.10+
  • helm 2.8.0+

Harbor部署

1. 添加域名解析。

h.cnlinux.clubn.cnlinux.club的A记录解析到我的负载均衡IP 10.31.90.200,用于创建ingress。

2. 下载harbor的chart包

[[email protected] harbor]# wget https://github.com/goharbor/harbor-helm/archive/1.0.0.tar.gz -O harbor-helm-v1.0.0.tar.gz

3. 修改配置文件

  • 提取harbor-helm-v1.0.0.tar.gz文件中的values.yaml文件,并放到和harbor-helm-v1.0.0.tar.gz同一级的目录中。
  • 修改values.yaml,我的配置修改了如下几个字段:

    需要说明的是如果k8s集群中存在storageclass就可以直接用storageclass,在几个persistence.persistentVolumeClaim.XXX.storageClass中指定storageclass名就可以了,会自动多个pvc,但是我这里为了防止创建多个pvc增加管理难度,我在部署前创建了一个pvc,harbor下所有的服务都使用这一个pvc,具体每个字段的作用请查看官方文档https://github.com/goharbor/harbor-helm

    • expose.ingress.hosts.core
    • xpose.ingress.hosts.notary
    • externalURL
    • persistence.persistentVolumeClaim.registry.existingClaim
    • persistence.persistentVolumeClaim.registry.subPath
    • persistence.persistentVolumeClaim.chartmuseum.existingClaim
    • persistence.persistentVolumeClaim.chartmuseum.subPath
    • persistence.persistentVolumeClaim.jobservice.existingClaim
    • persistence.persistentVolumeClaim.jobservice.subPath
    • persistence.persistentVolumeClaim.database.existingClaim
    • persistence.persistentVolumeClaim.database.subPath
    • persistence.persistentVolumeClaim.redis.existingClaim
    • persistence.persistentVolumeClaim.redis.subPath
expose:
  type: ingress
  tls:
    enabled: true
    secretName: ""
    notarySecretName: ""
    commonName: ""
  ingress:
    hosts:
      core: h.cnlinux.club
      notary: n.cnlinux.club
    annotations:
      ingress.kubernetes.io/ssl-redirect: "true"
      nginx.ingress.kubernetes.io/ssl-redirect: "true"
      ingress.kubernetes.io/proxy-body-size: "0"
      nginx.ingress.kubernetes.io/proxy-body-size: "0"
  clusterIP:
    name: harbor
    ports:
      httpPort: 80
      httpsPort: 443
      notaryPort: 4443
  nodePort:
    name: harbor
    ports:
      http:
        port: 80
        nodePort: 30002
      https:
        port: 443
        nodePort: 30003
      notary:
        port: 4443
        nodePort: 30004
externalURL: https://h.cnlinux.club
persistence:
  enabled: true
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      existingClaim: "pvc-harbor"
      storageClass: ""
      subPath: "registry"
      accessMode: ReadWriteOnce
      size: 5Gi
    chartmuseum:
      existingClaim: "pvc-harbor"
      storageClass: ""
      subPath: "chartmuseum"
      accessMode: ReadWriteOnce
      size: 5Gi
    jobservice:
      existingClaim: "pvc-harbor"
      storageClass: ""
      subPath: "jobservice"
      accessMode: ReadWriteOnce
      size: 1Gi
    database:
      existingClaim: "pvc-harbor"
      storageClass: ""
      subPath: "database"
      accessMode: ReadWriteOnce
      size: 1Gi
    redis:
      existingClaim: "pvc-harbor"
      storageClass: ""
      subPath: "redis"
      accessMode: ReadWriteOnce
      size: 1Gi
  imageChartStorage:
    type: filesystem
    filesystem:
      rootdirectory: /storage
imagePullPolicy: IfNotPresent
logLevel: debug
harborAdminPassword: "Harbor12345"
secretKey: "not-a-secure-key"
nginx:
  image:
    repository: goharbor/nginx-photon
    tag: v1.7.0
  replicas: 1
  nodeSelector: {}
  tolerations: []
  affinity: {}
  podAnnotations: {}
portal:
  image:
    repository: goharbor/harbor-portal
    tag: v1.7.0
  replicas: 1
  nodeSelector: {}
  tolerations: []
  affinity: {}
  podAnnotations: {}
core:
  image:
    repository: goharbor/harbor-core
    tag: v1.7.0
  replicas: 1
  nodeSelector: {}
  tolerations: []
  affinity: {}
  podAnnotations: {}
adminserver:
  image:
    repository: goharbor/harbor-adminserver
    tag: v1.7.0
  replicas: 1
  nodeSelector: {}
  tolerations: []
  affinity: {}
  podAnnotations: {}
jobservice:
  image:
    repository: goharbor/harbor-jobservice
    tag: v1.7.0
  replicas: 1
  maxJobWorkers: 10
  jobLogger: file
  nodeSelector: {}
  tolerations: []
  affinity: {}
  podAnnotations: {}
registry:
  registry:
    image:
      repository: goharbor/registry-photon
      tag: v2.6.2-v1.7.0
  controller:
    image:
      repository: goharbor/harbor-registryctl
      tag: v1.7.0
  replicas: 1
  nodeSelector: {}
  tolerations: []
  affinity: {}
  podAnnotations: {}
chartmuseum:
  enabled: true
  image:
    repository: goharbor/chartmuseum-photon
    tag: v0.7.1-v1.7.0
  replicas: 1
  nodeSelector: {}
  tolerations: []
  affinity: {}
  podAnnotations: {}
clair:
  enabled: true
  image:
    repository: goharbor/clair-photon
    tag: v2.0.7-v1.7.0
  replicas: 1
  httpProxy:
  httpsProxy:
  updatersInterval: 12
  nodeSelector: {}
  tolerations: []
  affinity: {}
  podAnnotations: {}
notary:
  enabled: true
  server:
    image:
      repository: goharbor/notary-server-photon
      tag: v0.6.1-v1.7.0
    replicas: 1
  signer:
    image:
      repository: goharbor/notary-signer-photon
      tag: v0.6.1-v1.7.0
    replicas: 1
  nodeSelector: {}
  tolerations: []
  affinity: {}
  podAnnotations: {}
database:
  type: internal
  internal:
    image:
      repository: goharbor/harbor-db
      tag: v1.7.0
    password: "changeit"
    nodeSelector: {}
    tolerations: []
    affinity: {}
  podAnnotations: {}
redis:
  type: internal
  internal:
    image:
      repository: goharbor/redis-photon
      tag: v1.7.0
    nodeSelector: {}
    tolerations: []
    affinity: {}
  podAnnotations: {}

4. 创建存储卷

因为harbor需要使用到mysql,为防止mysql在调度过程中造成数据丢失,我们需要将mysql的数据存储在gluster的存储卷里。

[[email protected] harbor]# vim pvc-harbor.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-harbor
spec:
  storageClassName: gluster-heketi
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
[[email protected] harbor]# kubectl apply -f pvc-harbor.yaml 

5. 安装harbor

[[email protected] harbor]# helm install  --name harbor harbor-helm-v1.0.0.tar.gz -f values.yaml 

如果安装不成功可以用helm del --purge harbor删除重新安装。

6. 测试

在一段时间后可以看到harbor所有相关的pod都已经运行起来了,我们就可以访问了,默认用户密码是admin/Harbor12345,可以通过修改values.yaml来更改默认的用户名和密码。

[[email protected] ~]# kubectl get pod
NAME                                           READY     STATUS    RESTARTS   AGE
harbor-harbor-adminserver-7fffc7bf4d-vj845     1/1       Running   1          15d
harbor-harbor-chartmuseum-bdf64f899-brnww      1/1       Running   0          15d
harbor-harbor-clair-8457c45dd8-9rgq8           1/1       Running   1          15d
harbor-harbor-core-7fc454c6d8-b6kvs            1/1       Running   1          15d
harbor-harbor-database-0                       1/1       Running   0          15d
harbor-harbor-jobservice-7895949d6b-zbwkf      1/1       Running   1          15d
harbor-harbor-notary-server-57dd94bf56-txdkl   1/1       Running   0          15d
harbor-harbor-notary-signer-5d64c5bf8d-kppts   1/1       Running   0          15d
harbor-harbor-portal-648c56499f-g28rz          1/1       Running   0          15d
harbor-harbor-redis-0                          1/1       Running   0          15d
harbor-harbor-registry-5cd9c49489-r92ph        2/2       Running   0          15d

  • 接下来我们创建test的私有项目用来测试。
  • 因为我们创建的harbor仓库是https的所以在docker pull或者push镜像之前,需要先把证书加到docker对应的配置目录里,不然docker是无法登录harbor的。
  • 进入test项目,点解“注册证书”下载harbor的CA证书。
  • 在每个node节点创建目录(以后可能会在master上传镜像,所以此次我的master节点也都一起创建了)
for n in `seq -w 01 06`;do ssh node-$n "mkdir -p /etc/docker/certs.d/h.cnlinux.club";done
#将下载下来的harbor CA证书拷贝到每个node节点的etc/docker/certs.d/h.cnlinux.club目录下
for n in `seq -w 01 06`;do scp ca.crt node-$n:/etc/docker/certs.d/h.cnlinux.club/;done
  • 在node节点上功登录harbor,登录成功后的信息保存在当前用户家目录下的.docker/config.json里。
[[email protected] ~]# docker login h.cnlinux.club
Username: admin
Password:
Login Succeeded

[[email protected] ~]# cat .docker/config.json
{
        "auths": {
                "h.cnlinux.club": {
                        "auth": "YWRtaW46SGFyYm9yMTIzNDU="
                }
        }
}
  • 在官方docker仓库pull一个nginx镜像,任何打上tag,push到harbor仓库,如下就可以看到harbor的test项目下已经有nginx的镜像了

    [[email protected] ~]# docker pull nginx:latest
    [[email protected] ~]# docker tag nginx:latest h.cnlinux.club/test/nginx:latest
    [[email protected] ~]# docker push h.cnlinux.club/test/nginx:latest

问题:如果我的k8s集群很多的node节点是不是每个node节点都要上去登录才能pull harbor仓库的镜像?这样是不是就非常麻烦了?

  • 其实在k8s里有一种secret的类型是kubernetes.io/dockerconfigjson就是用来解决这种问题的。
  • 首先将docker的登录信息转换成base64格式
[[email protected] ~]# cat .docker/config.json |base64
ewoJImF1dGhzIjogewoJCSJoLmNubGludXguY2x1YiI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOC4wNi4xLWNlIChsaW51eCkiCgl9Cn0=
  • 创建secret

    apiVersion: v1
    kind: Secret
    metadata:
    name: harbor-registry-secret
    namespace: default
    data:
    .dockerconfigjson: ewoJImF1dGhzIjogewoJCSJoLmNubGludXguY2x1YiI6IHsKCQkJImF1dGgiOiAiWVdSdGFXNDZTR0Z5WW05eU1USXpORFU9IgoJCX0KCX0sCgkiSHR0cEhlYWRlcnMiOiB7CgkJIlVzZXItQWdlbnQiOiAiRG9ja2VyLUNsaWVudC8xOC4wNi4xLWNlIChsaW51eCkiCgl9Cn0=
    type: kubernetes.io/dockerconfigjson
    [[email protected] ~]# kubectl create -f harbor-registry-secret.yaml
    secret/harbor-registry-secret created
  • 创建nginx demo并使用harbor上的nginx镜像。并将nginx.cnlinux.club解析到负载均衡10.31.90.200
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: h.cnlinux.club/test/nginx:latest
        ports:
        - containerPort: 80
      imagePullSecrets:
        - name: harbor-registry-secret
---
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  selector:
    app: nginx
  ports:
  - name: nginx
    protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP 

---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx
  annotations:
    # nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
spec:
  rules:
    - host: nginx.cnlinux.club
      http:
        paths:
          - path:
            backend:
              serviceName: nginx
              servicePort: 80
  • 可以看到3过node节点上的nginx已经运行,证明harbor上的镜像已经成功pull下来。

    [[email protected] ~]# kubectl get pod -o wide|grep nginx
    deploy-nginx-647f9649f5-88mkt                  1/1     Running            0          2m41s   10.34.0.5      node-06   <none>           <none>
    deploy-nginx-647f9649f5-9z842                  1/1     Running            0          2m41s   10.40.0.5      node-04   <none>           <none>
    deploy-nginx-647f9649f5-w44ck                  1/1     Running            0          2m41s   10.46.0.6      node-05   <none>           <none>

    最后我们访问http://nginx.cnlinux.club,至此所有的都已完成。


    后续会陆续更新所有的k8s相关文档,如果你觉得我写的不错,希望大家多多关注点赞,如有问题可以在下面给我留言,非常感谢!

原文地址:http://blog.51cto.com/billy98/2345517

时间: 2024-10-27 08:06:02

Kubernetes部署(十二):helm部署harbor企业级镜像仓库的相关文章

企业级镜像仓库harbor搭建

企业级镜像仓库harbor搭建 一.    Harbor概述 VMware公司最近开源了企业级Registry项目Harbor,其的目标是帮助用户迅速搭建一个企业级的Docker registry 服务.它以Docker公司开源的registry 为基础,提供了管理UI, 基于角色的访问控制(Role Based Access Control),AD/LDAP集成.以及审计日志(Audit logging) 等企业用户需求的功能,同时还原生支持中文,对广大中国用户是一个好消息. 官方文档:htt

linux运维、架构之路-企业级镜像仓库Harbor

一.Harbor介绍  Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC).LDAP.日志审核.管理界面.自我注册.镜像复制和中文支持等功能.      Harbor主要组件包括proxy,它是一个nginx前端代理,主要是分发前端页面ui访问和镜像上传和下载流量,Ui提供了一个Web管理界面,当然还包括了一个前端页面和后端API,底层使用mysql数据库:Registry是镜像仓库,负责存储镜像文件,当镜像上传完毕后通过ui创建Re

docker进阶-搭建私有企业级镜像仓库Harbor

为什么要搭建私有镜像仓库 ??对于一个刚刚接触Docker的人来说,官方的Docker hub是用于管理公共镜像.既然官方提供了镜像仓库我们为什么还要去自己搭建私有仓库呢?虽然也可以托管私有镜像.我们可以非常方便的把我们自己镜像推送上去,但是Docker hub提供的私有仓库个数有限.对于个人来说Docker hub是个不错的选择,但是对于企业来说,相对于安全 ,成本和公司的架构来说搭建自己的私有镜像仓库才是正确的道路. 什么是Harbor?为什么要选择Harbor ??Harbor是一个用于存

企业级镜像仓库harbor搭建(http/https)及使用

1.Habor简介Habor是由VMWare公司开源的容器镜像仓库.事实上,Habor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括:管理用户界面,基于角色的访问控制,AD/LDAP集成以及审计日志等,足以满足基本企业需求.2.安装docker-ce1)安装依赖包[[email protected] opt]# yum install -y yum-utils device-mapper-persistent-data lvm22)下

Kubernetes(十四)部署K8S内部DNS服务

官网链接   https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns 用途:为service提供dns解析,部署后可以通过service名称访问该service,service会转发到pod,如果不部署dns,可以通过service的IP访问,但是耦合性较高: 查看service kubectl get svc 输出以下内容: NAME TYPE CLUSTER-IP EXTERNAL-IP

OGG维护优化脚本(二十二)-部署准备篇--脚本部署准备

很抱歉,脚本部署准备放在后面来讲 以下内容必须彻底配置完毕前面讲的所有脚本才会成功生效 1.环境包安装 因为脚本通过shell以及perl实现.系统必须支持bshell才能满足运行环境 部分AIX服务器因为缺乏bshell需要专门安装rpm包 所以需要安装以下两个安装包 gettext-0.17-8.aix6.1.ppc.rpm bash-4.2-9.aix6.1.ppc.rpm 而上传脚本是通过expect来实现交互式访问功能,因此部分linux和aix服务器 必须安装上expect的软件包.

企业级镜像仓库harbor部署和注意事项

harbor下载地址https://github.com/vmware/harbor/releases需要安装docker-compose#yum install python-pip #pip install docker-compose解压下载的harbor cd harbor修改harbor.cfg这个文件主要需要改动的地方就是hostname和访问协议如果是https访问还需要改动正确的证书位置.然后./prepare 加载配置文件然后./install.sh 安装这个时候就操作完毕可以

Exchange Server 2013 部署(二)部署&amp;常规配置命令[一]

在Exchange Server 2013 先决条件满足后,进行Exchange Server 2013 部署及配置.1.挂载Exchange Server 2013 镜像,运行,选择不检查更新,下一步2.选择下一步3.选择我接受条款,下一步4.选择不使用默认配置,下一步5.勾选邮箱角色和客户访问角色,下一步6.选择安装路径,下一步7.选择不,下一步8.选择安装9.等待安装完成10.选择关闭,重新启动计算机11.在AD服务器上运行命令添加,mail和autodiscover记录 Add-DnsS

企业级镜像仓库(harbor)安装和配置

1 先决条件 Harbor被部署为多个Docker容器,因此可以部署在任何支持Docker的Linux发行版上.目标主机需要安装Python,Docker和Docker Compose. 1.1 硬件 资源类型 容量 说明 CPU 最少2个CPU 首选4个CPU 内存 最少4GB 首选8GB 硬盘 最少40GB 160GB为佳 1.2 软件 名称 版本 说明 Python 2.7或更高 请注意,您可能必须在默认未安装Python解释器的Linux发行版(Gentoo,Arch)上安装Python