Kubernetes基于helm安装 harbor

news/2024/7/7 20:48:05/文章来源:https://www.cnblogs.com/lldhsds/p/18282168

Kubernetes基于helm安装 harbor

之前harbor的安装都是借助docker完成一键安装部署,安装完成之后harbor组件均运行到一台机器上面,本文实践harbor在k8s环境中的部署。

准备工作

根据harbor官方要求:

  • Kubernetes cluster 1.20+
  • Helm v3.2.0+

结合ingress-nginx版本要求,建议K8S版本大于1.21.0-0进行实践。

部署一套K8S环境

本文使用的k8s环境如下:

# k8s版本及环境信息
root@master1:~# kubectl get node -o wide
NAME      STATUS   ROLES           AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE           KERNEL-VERSION     CONTAINER-RUNTIME
master1   Ready    control-plane   25h   v1.28.2   192.168.0.61   <none>        Ubuntu 24.04 LTS   6.8.0-36-generic   containerd://1.7.12
node1     Ready    <none>          25h   v1.28.2   192.168.0.62   <none>        Ubuntu 24.04 LTS   6.8.0-36-generic   containerd://1.7.12
node2     Ready    <none>          25h   v1.28.2   192.168.0.63   <none>        Ubuntu 24.04 LTS   6.8.0-36-generic   containerd://1.7.12# 操作系统信息
root@master1:~# cat /etc/issue
Ubuntu 24.04 LTS \n \lroot@master1:~# uname -a
Linux master1 6.8.0-36-generic #36-Ubuntu SMP PREEMPT_DYNAMIC Mon Jun 10 10:49:14 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux# helm版本
root@master1:~# helm version
version.BuildInfo{Version:"v3.15.2", GitCommit:"1a500d5625419a524fdae4b33de351cc4f58ec35", GitTreeState:"clean", GoVersion:"go1.22.4"}

部署openebs用于提供pv

参考我的另外一篇文章部署openebs,《Kubernetes云原生存储解决方案openebs部署实践-3.10.0版本(helm部署)》

本文部署的openebs信息如下:

root@master1:~# helm ls -n openebs
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
openebs openebs         1               2024-07-02 14:38:40.928808834 +0800 CST deployed        openebs-4.0.1   4.0.1
root@master1:~# kubectl get pod -n openebs
NAME                                              READY   STATUS    RESTARTS   AGE
openebs-localpv-provisioner-6b8bff68bd-vmwp7      1/1     Running   0          121m
openebs-lvm-localpv-controller-778b75449c-mmvw6   5/5     Running   0          121m
openebs-lvm-localpv-node-d2trc                    2/2     Running   0          121m
openebs-lvm-localpv-node-md5wh                    2/2     Running   0          121m
openebs-zfs-localpv-controller-6665568c7c-snw4q   5/5     Running   0          121m
openebs-zfs-localpv-node-mc8tv                    2/2     Running   0          121m
openebs-zfs-localpv-node-w6nns                    2/2     Running   0          121m
root@master1:~# kubectl get sc -n openebs
NAME               PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-hostpath   openebs.io/local   Delete          WaitForFirstConsumer   false                  121m

部署ingress-nginx用于暴露服务

参考我的另外一篇文章部署ingress-nginx,《ingress-nginx部署(helm方式)》

建议k8s版本不要太老,以下是在1.18.0部署最新的ingress-nginx,提示版本不兼容。

[root@k8s-master ~]# helm upgrade --install ingress-nginx ingress-nginx/ingress-nginx \
>   --namespace ingress-nginx --create-namespace \
>   --set controller.service.type=NodePort
Release "ingress-nginx" does not exist. Installing it now.
Error: chart requires kubeVersion: >=1.21.0-0 which is incompatible with Kubernetes v1.18.0

本次环境部署的ingress nginx如下:

root@master1:~# helm ls -n ingress-nginx
NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
ingress-nginx   ingress-nginx   1               2024-07-01 18:20:48.811046861 +0800 CST deployed        ingress-nginx-4.10.1    1.10.1
root@master1:~# kubectl get pod -n ingress-nginx
NAME                             READY   STATUS    RESTARTS       AGE
ingress-nginx-controller-dddq8   1/1     Running   1 (126m ago)   22h
ingress-nginx-controller-p7gd9   1/1     Running   1 (126m ago)   22h

部署harbor--ingress方式暴露服务

添加harbor helm仓库:

helm repo add harbor https://helm.goharbor.io

官方提供四种方式暴露Harbor service:

  • Ingress: 借助Ingress暴露服务,K8S集群中已经部署ingress nginx controller。
  • ClusterIP: 使用ClusterIP暴露服务,只能在集群内部进行访问。
  • NodePort: 使用NodePort暴露服务,通过NodeIP:NodePort进行访问。
  • LoadBalancer: 使用云供应商提供的LB进行访问。

部署harbor仓库,使用ingress暴露服务。ingress-nginx使用的是NodePort方式暴露自身,需要在externalURL中配置其 NodePort 端口号:

# ingress-nginx NodePort https端口为30294
root@master1:~# kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.102.230.242   <none>        80:30974/TCP,443:30194/TCP   21h
ingress-nginx-controller-admission   ClusterIP   10.110.51.58     <none>        443/TCP                      21h# 查看部署openebs后storageclass为openebs-hostpath 
root@master1:~# kubectl get sc
NAME               PROVISIONER        RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
openebs-hostpath   openebs.io/local   Delete          WaitForFirstConsumer   false                  99m# 执行helm安装,指定为ingress暴露,指定域名,externalURL,密码及StorageClaas
helm upgrade --install harbor harbor/harbor --namespace harbor --create-namespace \--set expose.type=ingress \--set expose.ingress.className=nginx \--set expose.ingress.hosts.core=harbor.test.com \--set expose.ingress.hosts.notary=notary.test.com \--set externalURL=https://harbor.test.com:30194 \--set harborAdminPassword="Harbor12345" \--set persistence.persistentVolumeClaim.registry.storageClass="openebs-hostpath" \--set persistence.persistentVolumeClaim.jobservice.jobLog.storageClass="openebs-hostpath" \--set persistence.persistentVolumeClaim.database.storageClass="openebs-hostpath" \--set persistence.persistentVolumeClaim.redis.storageClass="openebs-hostpath" \--set persistence.persistentVolumeClaim.trivy.storageClass="openebs-hostpath"

查看部署后的资源:

# 创建的pod
root@master1:~# kubectl get pod -n harbor -o wide
NAME                                 READY   STATUS    RESTARTS      AGE    IP              NODE    NOMINATED NODE   READINESS GATES
harbor-core-fb5ff9588-b8t6t          1/1     Running   2 (13m ago)   15m    10.244.154.33   node1   <none>           <none>
harbor-database-0                    1/1     Running   0             15m    10.244.154.43   node1   <none>           <none>
harbor-jobservice-85bf44bd57-5f2wg   1/1     Running   6 (12m ago)   15m    10.244.154.41   node1   <none>           <none>
harbor-portal-7c5d84cbb8-t6v22       1/1     Running   0             15m    10.244.154.34   node1   <none>           <none>
harbor-redis-0                       1/1     Running   0             15m    10.244.154.39   node1   <none>           <none>
harbor-registry-7f54fbf5f4-xdx![img](https://img2023.cnblogs.com/blog/1197007/202407/1197007-20240703165953782-1811560219.png)4t     2/2     Running   0             15m    10.244.154.42   node1   <none>           <none>
harbor-trivy-0                       1/1     Running   0             6m1s   10.244.154.45   node1   <none>           <none># 创建的pvc
root@master1:~# kubectl get pvc -n harbor
NAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
data-harbor-redis-0               Bound    pvc-83f38659-8ddb-43ec-9023-460d323c7d48   1Gi        RWO            openebs-hostpath   6m52s
data-harbor-trivy-0               Bound    pvc-50b8cd59-23c3-4d15-a0e3-31b7a62ed5d5   5Gi        RWO            openebs-hostpath   6m51s
database-data-harbor-database-0   Bound    pvc-8e8d04f2-21f7-4228-b0e7-331f352606e6   1Gi        RWO            openebs-hostpath   6m52s
harbor-jobservice                 Bound    pvc-beca09bd-d3b7-4d82-8e1e-785de4728f4e   1Gi        RWO            openebs-hostpath   6m52s
harbor-registry                   Bound    pvc-cd7048f3-2452-44e2-8c84-337b22ccb4ed   5Gi        RWO            openebs-hostpath   6m52s# 查看ingress
root@master1:~# kubectl get ingress -n harbor![img](https://img2023.cnblogs.com/blog/1197007/202407/1197007-20240703170012789-243611492.png)
NAME             CLASS   HOSTS             ADDRESS          PORTS     AGE
harbor-ingress   nginx   harbor.test.com   10.102.230.242   80, 443   7m9s

客户端访问测试,在客户端配置域名解析,harbor.test.com解析到ingress-nginx节点IP,访问https://harbor.test.com:30194

harbor

用户名admin,密码Harbor12345

部署harbor--NodePort方式暴露服务

上述使用ingress方式部署依赖nginx-ingress控制器,如果为了简化部署,可以使用NodePort方式:

export node_ip=192.168.0.61
helm upgrade --install harbor harbor/harbor --namespace harbor --create-namespace \--set expose.type=nodePort \--set expose.tls.auto.commonName=$node_ip \--set externalURL='https://$node_ip:31234'--set harborAdminPassword="Harbor12345" \--set persistence.persistentVolumeClaim.registry.storageClass="openebs-hostpath" \--set persistence.persistentVolumeClaim.jobservice.jobLog.storageClass="openebs-hostpath" \--set persistence.persistentVolumeClaim.database.storageClass="openebs-hostpath" \--set persistence.persistentVolumeClaim.redis.storageClass="openebs-hostpath" \--set persistence.persistentVolumeClaim.trivy.storageClass="openebs-hostpath"

通过https://$node_ip:31234直接访问harbor。

客户端上传镜像验证

  1. 到处ca证书
kubectl -n harbor get secrets harbor-ingress -o jsonpath="{.data.ca\.crt}" | base64 -d >ca.crt
  1. 复制ca.crt到docker客户端所在机器

docker运行时和客户端:

root@ubuntu:~# mkdir -p /etc/docker/certs.d/harbor.test.com:30194/root@ubuntu:~# ls /etc/docker/certs.d/harbor.test.com:30194/
ca.crt

如果使用containerd,配置类似:

root@ubuntu:~# mkdir -p /etc/containerd/certs.d/harbor.test.com:30194/root@ubuntu:~# ls /etc/containerd/certs.d/harbor.test.com:30194/
ca.crt
  1. 配置解析

echo "192.168.0.62 harbor.test.com" >>/etc/hosts

  1. 测试登录
root@ubuntu:~# docker login -u admin -p Harbor12345 https://harbor.test.com:30194
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /home/test/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
  1. 推送镜像
root@ubuntu:~# docker push harbor.test.com:30194/library/kubemark:1.19.0
The push refers to repository [harbor.test.com:30194/library/kubemark]
c746c8a16e15: Pushed
f47163e8de57: Pushed
0d1435bd79e4: Pushed
1.19.0: digest: sha256:95effc616f84c0c3d3645ee489f57ec635002bcf5eec1f0892936f485110d529 size: 949

参考资料

  1. https://github.com/goharbor/harbor-helm

  2. https://goharbor.io/docs/2.5.0/install-config/harbor-ha-helm/

  3. https://blog.csdn.net/networken/article/details/126295863

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/736929.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pdf的表格怎么转换成word?

Adobe设计PDF文件格式的目的是支持跨平台、多媒体集成的信息出版和发布,特别是对网络信息发布的支持。为了实现这一目标,PDF具有许多其他电子文件格式无法比拟的优势。如今,越来越多的电子书籍、产品描述、公司通知、网络数据和电子邮件开始使用PDF格式文件。但是PDF却不能直…

高效存储的秘诀:bitmap 数据结构在标签中的应用

在当今大数据和信息爆炸的时代,如何有效地管理和查询海量的数据成为了企业和开发者面临的重大挑战。其中,标签系统作为数据管理中的一种重要手段,被广泛应用于用户画像、商品分类、内容推荐等多个场景。然而,随着标签数量的急剧增加,传统的数据存储和查询方式已难以满足高…

2024年值得收藏的几款开源主机安全系统hids

随着云技术的迅速发展,主机安全系统HIDS作为服务器安全的最后一道防线,无论传统的硬件厂商,还是各大云厂商如阿里、腾讯云非常重视并闷声发大财。HIDS主机安全开源的项目虽多,但能实际用的极少,笔者经过大量搜索,找到以下几款优秀的产品供大家参考: 1、OpenHFWOpenHFW全…

代码随想录算法训练营第四十六天 | 买卖股票的最佳时机

121.买卖股票的最佳时机 题目链接 文章讲解 视频讲解动规五部曲:dp[j][0]: 表示持有股票的最大现金,dp[j][1]表示不持有股票的最大现金 递推公式:第j天持有股票的最大现金为:之前就持有这只股票和今天持有这只股票取最大值: dp[j][0] = max(dp[j-1][0], -prices[j]); 第j天…

Asp.Net Core -Authorizationz授权

授权的内部实现参考 动态授权参考动态授权 基于权限的授权 1.定义权限-Permissionspublic class Permissions{public const string Admin = "Admin";public const string Users = "Users";public const string UserCreate = Users+ ".Create";pu…

结对项目

命令行参数处理: 使用 argparse 或者 sys 模块处理命令行参数,以接收用户输入的题目数量和题目范围(例如最大数值)。 生成四则运算题目: 随机生成题目,每个题目包括两个操作数和一个运算符。 控制生成的题目数量和数值范围,确保生成的题目符合小学生的学习要求(比如操作…

详解微服务应用灰度发布最佳实践

本次分享是站在 DevOps 视角的灰度发布实践概述,主要内容包括以下四个方面:第一,灰度发布要解决的问题;第二,灰度发布的四种典型场景;第三,如何把灰度发布融入到应用的研发流程中,即把灰度发布与 DevOps 工作融合;第四,对于外部流量灰度场景,演示如何通过工具将其落…

OpenBMB Hugging Face THUNLP,联袂献上经典大模型课

这个夏天,THUNLP 携手 Hugging Face 和 OpenBMB,推出 大模型公开课第二季。在大模型公开课第二季中,将有全球知名开源社区 OpenBMB X Hugging Face 梦幻联动;MiniCPM、ChatDev、Ultra对齐 等明星开源项目作者亲自授课,带领同学从深度学习开始快速了解大模型的相关理论并进…

nginx开启https

生成自签名证书 如果是在运营商处获得的证书,则不用这一步点击查看代码 mkdir /etc/nginx/ssl cat > /etc/nginx/ssl/nginx.cnf <<EOF [ req ] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = req_ext x509_extension…

(三)JS逆向——爬取易车网

爬取易车网的车辆配置信息 所以主要就是确定这几个是怎么生成的 搜索x-sign值的位置,打断点,找到构建x-sign的函数 注意,一定要看清是否是正确的url,x-timestamp明显是时间戳 进入这个函数 x-sign值,是对这个字符串做md5,这个字符串由三部分构成,参数、时间戳、和一个固…

.Net知识技能大全

.Net知识技能大全 更多请见https://www.dotnetshare.com C#常见运算符一元运算符(+、-、!、~、++、--) 算术运算符(*、/、%、+、 – ) 移位运算符(<< 、>> ) 关系和类型测试运算符(==、!=、<、>、<=、>=、is 和 as) 逻辑运算符(&、^ 和 |…

Hello World with solidity

1. Solidity 是什么? Solidity 是一种面向对象的、静态类型的编程语言,专为在以太坊上编写智能合约而创建。由于以太坊上的智能合约可以处理真实世界的资产(比如加密货币),所以Solidity的设计非常关注安全性。 以下是 Solidity 的一些主要特点:类型安全和静态类型:这可以…

如何从Salesforce顾问转型为解决方案架构师?

在充满活力的Salesforce咨询领域,许多专业人士都希望从顾问转型为解决方案架构师。这种转型不仅需要掌握新技能,还需要从根本上改变思维方式。关键在于摆脱顾问典型的以职能为中心的思维模式,拥抱更广阔、更具战略性的视角。 从“如何”到“为什么” 当我们开始问“为什么”…

Modbus转Profibus主站网关连接温控表通讯技术

Modbus转ProfibusDP主站网关(XD-MDPBM20)是实现不同通讯协议设备之间联系的重要组件。本文将介绍Modbus转ProfibusDP主站网关(XD-MDPBM20)连接温控表实现高效通讯,涉及设备准备、协议介绍、配置步骤、测试通讯及注意事项。此技术可帮助实时监测温度并调节控制,提高生产效…

加解密技术原理

加解密技术概览 加解密定义 加密:数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为“密文”,通过这样的途径来达到保护数据不被非法人员窃取、阅读的目的。解密:数据解密的过程就是对密文使用相应的算法和密钥进行解…

Jmeter使用CLI模式进行负载测试的注意点

在我们打开Jmeter的时候,窗口会出现如下提示:这个提示的意思是, 不要使用 GUI 模式进行负载测试:GUI 模式主要用于创建和调试测试,而不是运行大规模的负载测试。 ​使用 CLI 模式进行负载测试:CLI 模式(以前称为 NON GUI 模式)更适合进行负载测试,因为它能够更高效地使…

Golang面试:泛型

Go语言在1.18版本中引入了泛型(Generics),这是Go语言发展中的一个重要里程碑。泛型允许你编写更通用和可复用的代码,而无需牺牲类型安全性。以下是对Go中泛型的详细介绍,包括其语法、使用场景和示例代码。 1. 泛型的基本概念 泛型允许你定义可以处理多种数据类型的函数和数…

【算法】KD-tree

1. 算法简介 KD-tree(K-Dimensional),是一种对k维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。 主要应用于多维空间关键数据的搜索。 KD-tree 的本质是一棵平衡树,将空间内的区域划分为一个超长方体,然后存储为节点进行维护。 以下为一个 \(k=2\) 时的 KD…

性能测试:主流性能监控工具介绍

行业流行性能监控工具有哪些Linux 自带命令 Vmstat,Top 等 Nmon Collectd + InfluxDB + Grafana Prometheus + Grafana行业流行性能监控工具的介绍 Linux 自带命令 Vmstat,Top 等 vmstat 和 top 都是 Linux 系统自带的命令,提供了实时的监控信息,对于系统管理员和开发人员来…

BTC交易流程

交易流程 比特币的交易流程涉及多个步骤和参与方,包括发送方、接收方、矿工和比特币网络中的节点。以下是比特币交易的详细流程:创建交易:生成比特币地址:比特币地址是一个由公钥生成的字符串,用于接收比特币。每个用户在创建比特币钱包时,都会生成一对公钥和私钥。公钥通…