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文件组成的:
- web-deploy.yaml ,用 K8s 的 Deployment 描述的 Java Web 程序;
- web-svc.yaml ,用 K8s 的 Service 描述的程序访问的入口;
- mysql.yaml ,用 K8s StatefulSet 描述的 MySQL 实例;
- 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

推送镜像测试
[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
镜像扫描

镜像tag保留策略

七、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完成监控
参考:这里