20210524 k8s之helm部署harbor镜像仓库

参考:https://helm.sh/zh/docs/intro/install/

参考:https://goharbor.io/docs/2.2.0/install-config/harbor-ha-helm/

一、helm是什么

helm:k8s应用部署与打包工具

我们知道,k8s本身是没有应用这个概念的。比如,小张需要在k8s部署一个图书管理系统,实际上是由4个yaml文件组成的:

  1. web-deploy.yaml ,用 K8s 的 Deployment 描述的 Java Web 程序;
  2. web-svc.yaml ,用 K8s 的 Service 描述的程序访问的入口;
  3. mysql.yaml ,用 K8s StatefulSet 描述的 MySQL 实例;
  4. mysql-svc.yaml ,用 K8s Service 描述的 MySQL 实例的访问入口。

那么,小张就需要执行4次kubectl apply -f

这些yaml文件都交给k8s来负责运行管理了。这里面的麻烦就在于,怎么样去管理这个应用对应的所有k8s资源呢?

Helm提供了一种简单的思路:它定义了一种新的应用打包格式叫Chart。一个myapp应用的布局如下所示:

myapp/
  Chart.yaml          
  values.yaml           
  templates/

Chart.yaml里面写应用元数据,比如:

apiVersion: v1
name:  图书馆管理系统
version:  0.1
description: 全中国最受欢迎的图书馆管理系统
maintainers: 
  - name: 小张

template目录下面,则存放小张编写好的四个YAML文件。此外小张还可以将YAML文件里面需要修改的字段定义成“模板变量”,部署时候由Helm去注入。比如web-deploy.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: 图书馆管理系统网站
spec:
  replicas: {{ .Values.replicaCount }}
  template:
    ...
    spec:
      containers:
        ...

通过上面语法,小张就把Deployment的replicas值定义成一个变量,将来就可以通过传参来决定系统启动后由几个实例了,比如,指定100个实例

helm install apphub/图书馆管理系统 --set replicaCount=100

最后,Helm项目允许你把上面这一系列文件做成一个目录,做成一个压缩包传到网上,别人可以通过helm install下载安装到。这个上传地址,就是helm hub了。

二、harbor是什么

harbor Registry(又称Harbor云原生制品仓库或者Harbor镜像仓库)由VMware公司中国研发中心云原生实验室原创,在Docker Distribution的基础上增加了企业用户必须的权限控制、镜像签名、安全漏洞扫描和远程复制等重要功能,还提供图形化界面以及面向国内用户的中文支持,开源后在中国开发者和用户社区流行,称为中国云原生用户的主流容器镜像仓库。

harbor提供了多种部署方式来供用户搭建harbor

  • 离线安装包:docker-compose一键部署
  • 在线安装包:只是harbor组件镜像从网络拉取,其他和离线安装一样
  • helm chart:通过helm方式将harbor部署到k8s集群里面
  • k8s operator:基于kubernetes operator框架编排部署。

harbor的核心功能:

  • 访问控制:
  • 镜像签名:
  • 镜像扫描: harbor与其他别的安全厂商指定一套扫描适配器的标准API,凡事符合API规范的都可以接入harbor
  • 高级管理功能
    • Artifact复制策略:多个harbor之间镜像可以起送的配置策略来进行互相复制
    • 存储配额管理:可以限制每个项目可以使用的磁盘配额,避免某个项目的镜像太多吃满磁盘
    • tag保留策略:以往需要手工清理镜像tag,现在harbor帮你做了
    • 垃圾回收:

三、安装helm3

参考:https://helm.sh/zh/docs/intro/install/

helm的安装极其简单,就是一个二进制包,下载后就可以用

[root@k8s ~]# wget https://get.helm.sh/helm-v3.5.4-linux-amd64.tar.gz
[root@k8s ~]# tar xf helm-v3.5.4-linux-amd64.tar.gz 
[root@k8s ~]# mv linux-amd64/helm /usr/local/bin/

四、创建harbor所需要的存储

这里参考之前的 k8s之StorageClass+NFS

五、拉取harbor的chart并修改

下载harbor helm chart

[root@k8s ~]# helm repo add harbor https://helm.goharbor.io
[root@k8s ~]# helm fetch harbor/harbor --untar
[root@k8s ~]# ls harbor/
cert  Chart.yaml  conf  LICENSE  README.md  templates  values.yaml

harbor架构图如下,我们将pg和redis也部署到k8s里面

修改values.yaml

修改服务暴露方式: 条件有限,使用nodePort,并且开启https,证书使用secret。443端口暴露为30003

expose:
  type: nodePort
  tls:
    enabled: true
    certSource: secret
    auto:
      commonName: ""
    secret:
      secretName: "harbor-cert"
      notarySecretName: ""
  nodePort:
    name: harbor
    ports:
      http:
        port: 80
        nodePort: 30002
      https:
        port: 443
        nodePort: 30003
      notary:
        port: 4443
        nodePort: 30004

修改externalUrl,改为对应的域名 (这里要注意,如果不是443端口的话需要将端口填上)

externalURL: https://harbor.xxxxxxx.cn:30003

修改所有需要持久化数据的服务的StorageClass配置

# 直接将StorageClass的名字填写到里面即可
persistence:
  enabled: true
  resourcePolicy: "keep"
  persistentVolumeClaim:
    registry:
      existingClaim: ""
      storageClass: "managed-nfs-storage"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 10Gi
    chartmuseum:
      existingClaim: ""
      storageClass: "managed-nfs-storage"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 5Gi
    jobservice:
      existingClaim: ""
      storageClass: "managed-nfs-storage"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 1Gi
    database:
      existingClaim: ""
      storageClass: "managed-nfs-storage"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 1Gi
    redis:
      existingClaim: ""
      storageClass: "managed-nfs-storage"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 1Gi
    trivy:
      existingClaim: ""
      storageClass: "managed-nfs-storage"
      subPath: ""
      accessMode: ReadWriteOnce
      size: 5Gi
  imageChartStorage:
    disableredirect: false

创建namespace

将所有数据放到这个namesapce下面

[root@k8s harbor]# kubectl create ns harbor
namespace/harbor created

创建secret

将证书文件创建为secret,名字就是上面定义的名字

#证书和key文件名字必须和下面这个一致
[root@k8s cert]# kubectl create secret tls harbor-cert --namespace harbor --cert=./tls.crt --key=./tls.key

创建应用

应用的名字可以自己自定义

[root@k8s harbor]# helm install --namespace harbor my-harbor .
NAME: my-harbor
LAST DEPLOYED: Mon May 24 18:19:08 2021
NAMESPACE: default
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 https://harbor.xxxxxxx.cn:30003
For more details, please visit https://github.com/goharbor/harbor
[root@k8s harbor]# helm list -n harbor
NAME     	NAMESPACE	REVISION	UPDATED                                	STATUS  	CHART       	APP VERSION
my-harbor	default  	1       	2021-05-24 18:19:08.934542995 +0800 CST	deployed	harbor-1.6.2	2.2.2

如果没什么问题,5分钟左右就全部起来了,有问题的话就自己看看啥原因,是pvc挂不上,还是secret找不到等等

[root@k8s harbor]# kubectl -n harbor get po
NAME                                              READY   STATUS    RESTARTS   AGE
my-harbor-harbor-chartmuseum-868495789f-fxb25     1/1     Running   0          2m32s
my-harbor-harbor-core-845b7879-q9f6b              1/1     Running   0          2m32s
my-harbor-harbor-database-0                       1/1     Running   0          2m32s
my-harbor-harbor-jobservice-fdc598bfc-kt57l       1/1     Running   1          2m31s
my-harbor-harbor-nginx-7ddb64c6c9-cd5pn           1/1     Running   0          2m32s
my-harbor-harbor-notary-server-7f9f6fb966-m57g6   1/1     Running   0          2m32s
my-harbor-harbor-notary-signer-5bdfd88b5d-cwlx5   1/1     Running   1          2m32s
my-harbor-harbor-portal-55cf96cb54-j7pf2          1/1     Running   0          2m32s
my-harbor-harbor-redis-0                          1/1     Running   0          2m32s
my-harbor-harbor-registry-6b8f455456-2dm6n        2/2     Running   0          2m32s
my-harbor-harbor-trivy-0                          1/1     Running   0          2m32s

六、访问harbor

用户名密码没有改:admin/Harbor12345

image-20210524183806120

推送镜像测试

[root@k8s harbor]# docker pull nginx:1.20-alpine
[root@k8s harbor]# docker tag nginx:1.20-alpine harbor.xxxxxxx.cn:30003/library/nginx:1.20-alpine
[root@k8s harbor]# docker login harbor.xxxxxxx.cn:30003 -uadmin
Password:
[root@k8s harbor]# docker push harbor.xxxxxxx.cn:30003/library/nginx:1.20-alpine
The push refers to repository [harbor.xxxxxxx.cn:30003/library/nginx]
7a54243e5443: Pushed 
dcb9f737fe15: Pushed 
de4aa1659df8: Pushed 
75642f4b5133: Pushed 
561d94cdc4d7: Pushed 
b2d5eeeaba3a: Pushed 
1.20-alpine: digest: sha256:55684c622b7b62045bd4578e402704bdd1923f6ab704f57134e712c2f1da48c8 size: 1568

镜像扫描

image-20210524185200740

镜像tag保留策略

image-20210524185327556

七、prometheus监控harbor

参考官网文档:Access Metrics,在harbor2.2.0以上版本中,harbor让prometheus监控更为简单,不需要再额外配置exporter。

如何开启?

开启的方式特别简单,修改harbor的配置文件,metrics选项设置为true即可。如果是helm部署,则只需要在values.yaml文件设置mtrics的选项为true即可:

metrics:
  enabled: false
  core:
    path: /metrics
    port: 8001
  registry:
    path: /metrics
    port: 8001
  exporter:
    path: /metrics
    port: 8001

然后使用helm完成更新

[root@k8s harbor]# helm upgrade -f values.yaml  my-harbor . -n harbor
Release "my-harbor" has been upgraded. Happy Helming!
NAME: my-harbor
LAST DEPLOYED: Fri May 28 23:07:45 2021
NAMESPACE: harbor
STATUS: deployed
REVISION: 2
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 https://harbor.uscwifi.cn:30003
For more details, please visit https://github.com/goharbor/harbor
[root@k8s harbor]# kubectl get po -n harbor 
NAME                                              READY   STATUS    RESTARTS   AGE
my-harbor-harbor-chartmuseum-755668bf7c-lgljf     1/1     Running   0          2m39s
my-harbor-harbor-core-5f845b5f4b-rvpwq            1/1     Running   0          2m39s
my-harbor-harbor-database-0                       1/1     Running   3          4d4h
my-harbor-harbor-exporter-759968db65-24k5v        1/1     Running   0          2m39s
my-harbor-harbor-jobservice-9864dbf47-97vxv       1/1     Running   0          2m39s
my-harbor-harbor-nginx-7ddb64c6c9-cd5pn           1/1     Running   4          4d4h
my-harbor-harbor-notary-server-f667cb75c-9xzgd    1/1     Running   0          2m39s
my-harbor-harbor-notary-signer-5c85d5d597-bn2x9   1/1     Running   0          2m39s
my-harbor-harbor-portal-55cf96cb54-j7pf2          1/1     Running   2          4d4h
my-harbor-harbor-redis-0                          1/1     Running   2          4d4h
my-harbor-harbor-registry-57fd6d878b-nr7sb        2/2     Running   0          2m39s
my-harbor-harbor-trivy-0                          1/1     Running   2          4d4h

访问测试

[root@k8s harbor]# kubectl -n harbor get svc | grep 8001
my-harbor-harbor-core            ClusterIP   10.68.120.216   <none>        80/TCP,8001/TCP                             4d6h
my-harbor-harbor-exporter        ClusterIP   10.68.77.163    <none>        8001/TCP                                    103m
my-harbor-harbor-registry        ClusterIP   10.68.65.151    <none>        5000/TCP,8080/TCP,8001/TCP                  4d6h
[root@k8s harbor]# curl --noproxy "*" 10.68.120.216:8001/metrics 
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 6.6297e-05
...

部署prometheus完成监控

参考:这里