美文网首页JCloud
Harbor折腾之利用Kubernetes搭建镜像仓库

Harbor折腾之利用Kubernetes搭建镜像仓库

作者: 魔哈Moha | 来源:发表于2017-10-13 22:38 被阅读349次

    最近两个月都在推进公司业务容器化,很少有时间来更新文章了。最近我们计划把业务方的代码发布改用通过Docker Registry以Code:<commit id>镜像的方式给Docker节点使用。这给我带来不小挑战,一方面需要有海量的代码镜像需要管理,另一方面是如何快速将客户端Pull分流到多个Registry上。这都需要花不少时间去熟悉,了解这个产品。

    所谓万丈高楼平地起,如何快速部署一套基于Harbor的镜像仓库便是第一个要解决的。
    本文也是利用现有的Kubernetes框架,将Harbor完全集成到K8S内部来解决部署和扩容的问题。

    环境

    为了保证读者在实际环境操作的一致性,文章里的环境我尽量做到一致。

    产品 版本
    Ubuntu Server 16.04.2
    Kubernetes v1.6.2_coreos.0
    Docker 1.12.6
    Flanneld v0.8.0-rc1
    Harbor v1.2.0
    Ceph RBD 10.2.3/Jewel
    Ingress Controller 0.9.0-beta.15

    操作

    1. 下载Harbor离线安装包

    由于墙的原因,GitHub上下载非常慢,可以通过国内的镜像源下载。地址如下:
    http://harbor.orientsoft.cn/

    2. 下载Harbor的Kubernetes编排文件

    文件位于代码仓库的harbor-master/make/kubernetes目录
    配置文件位于harbor-master/make/harbor.cfg

    本文以https为例,harbor.cfg的配置与http的主要区别是协议和证书的路径

    ui_url_protocol = https
    ssl_cert = /data/server.crt
    ssl_cert_key = /data/server.key
    

    将自己的https证书放到/data/目录,取好名字即可,这个证书在后面的Ingress中还需要使用。

    harbor.cfg配置完成后在harbor-master/make/kubernetes目录执行命令python prepare开始渲染Harbor的编排模板。

    3. 修改编排

    后端Ceph存储

    • 创建Ceph secret

    secret.yaml

    apiVersion: v1
    kind: Secret
    metadata:
      name: ceph-secret
      namespace: registry
    type: "kubernetes.io/rbd"  
    data:
      key: QVFBclU4dFlGUjhLTXhBQXRGcnFiUXN2cm1hUUU1N1ZpUmpmcUE9PQ==
    
    • 创建Storags Class

    storage.class.yaml

    apiVersion: storage.k8s.io/v1beta1
      kind: StorageClass
      metadata:
        name: ceph-chengdu
      provisioner: kubernetes.io/rbd
      parameters:
        monitors: 192.168.68.53:6789,192.168.68.54:6789,192.168.68.57:6789
        adminId: kube
        adminSecretName: ceph-secret
        adminSecretNamespace: kube-system
        pool: kube
        userId: kube
        userSecretName: ceph-secret
    
    • 创建pvc

    log-pvc.yaml

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        volume.beta.kubernetes.io/storage-class: ceph-chengdu
      name: log-pvc
      namespace: registry
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
    

    registry-pvc

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        volume.beta.kubernetes.io/storage-class: ceph-chengdu
      name: registry-pvc
      namespace: registry
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 1Ti
    

    storage-pvc

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      annotations:
        volume.beta.kubernetes.io/storage-class: ceph-chengdu
      name: storage-pvc
      namespace: registry
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 100Gi
    

    Harbor编排

    • Registry

    registry的auth方式在Kubernetes中和Docker-Compose里面不一样,需要修改service名称。

    问题详见#Harbor#3369

    registry.rc.yaml

    Patch

    auth:
      token:
        issuer: harbor-token-issuer
        realm: https://xxxx.xxxxx.xxxx/service/token
        rootcertbundle: /etc/docker/registry/root.crt
        service: harbor-registry 
    
    • AdminServer

    adminserver需要检查/data目录的使用率,所以需要把storage-pvc挂载到/data/目录下。
    下面这个yaml是对原来的adminserver.rc.yaml 打的Patch。

    问题详见#Harbor#3359

    adminserver.rc.yaml

    Patch

    spec:
      template:
        spec:
          containers:
            name: adminserver-app
            volumeMounts:
            - mountPath: "/data"
              name: storage
          volumes:
          - name: storage
            persistentVolumeClaim:
              claimName: registry-pvc
    

    Ingress编排

    • 创建tls类型的secret
    kubectl create secret tls harbor-tls --cert=/data/server.crt --key=/data/server.key -n registry
    
    • 创建ingress配置

    Ingress的Nginx配置client_max_body_size默认只有1M,低版本有个坑ingress.kubernetes.io/proxy-body-size并不能渲染到nginx.conf,这个会造成客户端Push镜像是出现413 Request Entity Too Large报错。
    升级到最新的gcr.io/google-containers/nginx-ingress-controller:0.9.0-beta.15镜像就能解决这个问题

    问题详见#Ingress-Controller#21

    harbor.ing.yaml

    apiVersion: extensions/v1beta1
    kind: Ingress
    metadata:
      name: harbor-tls
      namespace: registry
      annotations:
        ingress.kubernetes.io/secure-backends: "true"
        ingress.kubernetes.io/proxy-body-size: "1024M"
    spec:
      tls:
       - hosts:
         - xxx.xxxx.xxxxx.xxx
         secretName: harbor-tls
      rules:
      - host: xxx.xxxx.xxxxx.xxx
        http:
          paths:
          - backend:
              serviceName: nginx
              servicePort: 443
            path: /
    

    相关文章

      网友评论

        本文标题:Harbor折腾之利用Kubernetes搭建镜像仓库

        本文链接:https://www.haomeiwen.com/subject/aevtuxtx.html