K8S部署Harbor仓库实战

K8S部署Harbor仓库实战

K8S部署Harbor仓库实战 - 简书

创建文件目录

  • chartmuseum目录: /var/nfs/data/harbor/chartmuseum
  • database目录: /var/nfs/data/harbor/database
  • jobservice目录: /var/nfs/data/harbor/jobservice
  • redis目录: /var/nfs/data/harbor/redis
  • registry目录: /var/nfs/data/harbor/registry
  • trivy目录: /var/nfs/data/harbor/trivy
  • 脚本
mkdir -p /var/nfs/data/harbor/chartmuseum
mkdir -p /var/nfs/data/harbor/database
mkdir -p /var/nfs/data/harbor/jobservice
mkdir -p /var/nfs/data/harbor/redis
mkdir -p /var/nfs/data/harbor/registry
mkdir -p /var/nfs/data/harbor/trivychmod -R 777 harbor

添加heml仓库

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

创建namespace

kubectl create namespace harbor

创建配置文件目录

mkdir -p /root/harbor

cd /root/harbor

创建harbor-pv.yaml文件并替换内容

apiVersion: v1
kind: PersistentVolume
metadata:name: harbor-registrylabels:app: harbor-registry
spec:capacity:storage: 50GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: "nfs-client"mountOptions:- hardnfs:path: /mydata/k8s/public/harbor/registryserver: 192.168.5.22
---
apiVersion: v1
kind: PersistentVolume
metadata:name: harbor-chartmuseumlabels:app: harbor-chartmuseum
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: "nfs-client"mountOptions:- hardnfs:path: /mydata/k8s/public/harbor/chartmuseumserver: 192.168.5.22
---
apiVersion: v1
kind: PersistentVolume
metadata:name: harbor-jobservicelabels:app: harbor-jobservice
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: "nfs-client"mountOptions:- hardnfs:path: /mydata/k8s/public/harbor/jobserviceserver: 192.168.5.22
---
apiVersion: v1
kind: PersistentVolume
metadata:name: harbor-databaselabels:app: harbor-database
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: "nfs-client"mountOptions:- hardnfs:path: /mydata/k8s/public/harbor/databaseserver: 192.168.5.22
---
apiVersion: v1
kind: PersistentVolume
metadata:name: harbor-redislabels:app: harbor-redis
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: "nfs-client"mountOptions:- hardnfs:path: /mydata/k8s/public/harbor/redisserver: 192.168.5.22
---
apiVersion: v1
kind: PersistentVolume
metadata:name: harbor-trivylabels:app: harbor-trivy
spec:capacity:storage: 5GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RetainstorageClassName: "nfs-client"mountOptions:- hardnfs:path: /mydata/k8s/public/harbor/trivyserver: 192.168.5.22

替换内容

sed -i 's/192.168.5.22/k8s-master01/g' /root/harbor/harbor-pv.yaml
sed -i 's/\/mydata\/k8s\/public/\/var\/nfs\/data/g' /root/harbor/harbor-pv.yaml
sed -i 's/nfs-client/nfs-sc/g' /root/harbor/harbor-pv.yaml

应用PV

kubectl apply -f /root/harbor/harbor-pv.yaml

出错了删除

kubectl delete -f /root/harbor/harbor-pv.yaml

创建harbor-pvc.yaml文件并替换内容

kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: harbor-registry
spec:accessModes:- ReadWriteOncestorageClassName: "nfs-client"resources:requests:storage: 50Giselector:matchLabels:app: harbor-registry
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: harbor-chartmuseum
spec:accessModes:- ReadWriteOncestorageClassName: "nfs-client"resources:requests:storage: 5Giselector:matchLabels:app: harbor-chartmuseum
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: harbor-jobservice
spec:accessModes:- ReadWriteOncestorageClassName: "nfs-client"resources:requests:storage: 5Giselector:matchLabels:app: harbor-jobservice 
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: harbor-database
spec:accessModes:- ReadWriteOncestorageClassName: "nfs-client"resources:requests:storage: 5Giselector:matchLabels:app: harbor-database  
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: harbor-redis
spec:accessModes:- ReadWriteOncestorageClassName: "nfs-client"resources:requests:storage: 5Giselector:matchLabels:app: harbor-redis
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: harbor-trivy
spec:accessModes:- ReadWriteOncestorageClassName: "nfs-client"resources:requests:storage: 5Giselector:matchLabels:app: harbor-trivy

sed -i 's/nfs-client/nfs-sc/g' /root/harbor/harbor-pvc.yaml

应用PVC

kubectl apply -f /root/harbor/harbor-pvc.yaml -n harbor

出错了删除

kubectl delete -f harbor-pvc.yaml -n harbor

创建harbor-values.yaml并替换

expose:type: ingresstls:enabled: trueclusterIP:name: harborannotations: {}ports:httpPort: 80httpsPort: 443notaryPort: 4443ingress:hosts:core: harbor-core.public.192.168.4.224.nip.ionotary: harbor-notary.public.192.168.4.224.nip.iocontroller: defaultkubeVersionOverride: ""annotations:ingress.kubernetes.io/ssl-redirect: "true"ingress.kubernetes.io/proxy-body-size: "0"nginx.ingress.kubernetes.io/ssl-redirect: "true"nginx.ingress.kubernetes.io/proxy-body-size: "0"notary:annotations: {}harbor:annotations: {}
externalURL: https://harbor-core.public.192.168.4.224.nip.io:31839persistence:enabled: trueresourcePolicy: "keep"persistentVolumeClaim:registry:existingClaim: "harbor-registry"storageClass: "nfs-client"subPath: ""accessMode: ReadWriteOncesize: 50Gichartmuseum:existingClaim: "harbor-chartmuseum"storageClass: "nfs-client"subPath: ""accessMode: ReadWriteOncesize: 5Gijobservice:existingClaim: "harbor-jobservice"storageClass: "nfs-client"subPath: ""accessMode: ReadWriteOncesize: 5Gidatabase:existingClaim: "harbor-database"storageClass: "nfs-client"subPath: ""accessMode: ReadWriteOncesize: 5Giredis:existingClaim: "harbor-redis"storageClass: "nfs-client"subPath: ""accessMode: ReadWriteOncesize: 5Gitrivy:existingClaim: "harbor-trivy"storageClass: "nfs-client"subPath: ""accessMode: ReadWriteOncesize: 5Gi

sed -i 's/nfs-client/nfs-sc/g' /root/harbor/harbor-values.yaml

如果没有域名不使用ingress方式导出,使用nodePort方式导出,并关闭HTTPS

替换harbor-values.yaml文件中的expose段

expose:type: nodePorttls:enabled: falseclusterIP:name: harborannotations: {}ports:httpPort: 80httpsPort: 443notaryPort: 4443
externalURL: http://yourip:3xxxx
参考使用nodePort方式导出的文章

helm安装harbor后登陆一直提示账户或密码错误_harbor默认密码不对-CSDN博客

使用nginx导出
externalURL配置
  • 考虑内外网的问题,本集群内使用内网IP+端口,客户端访问使用外网的IP+另一个端口
    • externalURL配置成内网IP
    • 然后再将harbor-nginx这个deployment暴露为一个SVC使用另一个端口,方便客户端使用

如果支持域名,则使用ingress

安装ingress-nginx

参考:  K8S Helm 安装ingress-nginx/ingress-nginx-CSDN博客

修改配置文件harbor-values.yaml中的expose部分

expose:type: ingresstls:enabled: trueclusterIP:name: harborannotations: {}ports:httpPort: 80httpsPort: 443notaryPort: 4443ingress:controller: defaultkubeVersionOverride: ""annotations:ingress.kubernetes.io/ssl-redirect: "true"ingress.kubernetes.io/proxy-body-size: "0"nginx.ingress.kubernetes.io/ssl-redirect: "true"nginx.ingress.kubernetes.io/proxy-body-size: "0"notary:annotations: {}harbor:annotations: {}persistence:
安装harbor(externalURL=https://harbor.david.org)
helm install harbor harbor/harbor --namespace harbor --create-namespace \--values harbor-values.yaml \--set expose.ingress.className=nginx \--set expose.ingress.hosts.core=harbor.david.org \--set expose.ingress.hosts.notary=notary.david.org \--set externalURL=https://harbor.david.org \--set harborAdminPassword="Harbor12345"
查看harbor-ingress
[root@k8s-master01 harbor]# kubectl describe ingress -n harbor harbor-ingress
Name:             harbor-ingress
Labels:           app=harborapp.kubernetes.io/managed-by=Helmchart=harborheritage=Helmrelease=harbor
Namespace:        harbor
Address:
Ingress Class:    nginx
Default backend:  <default>
TLS:harbor-ingress terminates harbor.david.org
Rules:Host              Path  Backends----              ----  --------harbor.david.org/api/         harbor-core:80 (10.244.1.102:8080)/service/     harbor-core:80 (10.244.1.102:8080)/v2/          harbor-core:80 (10.244.1.102:8080)/chartrepo/   harbor-core:80 (10.244.1.102:8080)/c/           harbor-core:80 (10.244.1.102:8080)/             harbor-portal:80 (10.244.1.100:8080)
Annotations:        ingress.kubernetes.io/proxy-body-size: 0ingress.kubernetes.io/ssl-redirect: truemeta.helm.sh/release-name: harbormeta.helm.sh/release-namespace: harbornginx.ingress.kubernetes.io/proxy-body-size: 0nginx.ingress.kubernetes.io/ssl-redirect: true
Events:Type    Reason  Age   From                      Message----    ------  ----  ----                      -------Normal  Sync    11m   nginx-ingress-controller  Scheduled for sync
安装

helm install harbor harbor/harbor -f harbor-values.yaml -n harbor

出错了卸载

helm uninstall harbor -n harbor

查看是否都启动了

kubectl get pods -owide -n harbor

kubectl get ingress -owide -n harbor

网页登录

用户名: admin

密码:Harbor12345

http://yourip:3xxxx

如果使用ingress, 配置一个host

https://harbor-core.myharbor.io:3xxxx

之前有出错,处理异常问题

Error: INSTALLATION FAILED: Unable to continue with install:

PersistentVolumeClaim "harbor-jobservice" in namespace "harbor" exists and cannot be imported into the current release:

invalid ownership metadata;

label validation error: missing key "app.kubernetes.io/managed-by": must be set to "Helm"; annotation validation error: missing key "meta.helm.sh/release-name": must be set to "harbor"; annotation validation error: missing key "meta.helm.sh/release-namespace": must be set to "harbor"

不需要jobservice的pvc

kubectl delete pvc harbor-jobservice -n harbor

查看状态

kubectl get pods -owide -n harbor

查看有问题的pod

kubectl describe pods -n harbor pod名称

修改docker配置文件,添加harbor仓库地址

[root@master01 harbor]# vi /etc/docker/daemon.json

[root@master01 harbor]# cat /etc/docker/daemon.json

{"registry-mirrors": ["http://hub-mirror.c.163.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"insecure-registries": ["yourip:3xxxx","0.0.0.0/0"]}
重启docker

[root@master01 harbor]# systemctl daemon-reload

[root@master01 harbor]# systemctl restart docker.service

登录harbor仓库

[root@master01 harbor]# docker login yourip:3xxxx

Username: admin

Password:

WARNING! Your password will be stored unencrypted in /root/.docker/config.json.

Configure a credential helper to remove this warning. See

docker login | Docker Docs

Login Succeeded

打个新镜像

docker images

docker tag hello-world:latest yourip:3xxxx/yourlib/hello-world:latest

推送

docker push yourip:3xxxx/yourlib/hello-world:latest

上网页端查看yourlib项目下,hello-world:latest已上传成功

  • 配置k8s拉取私有仓库镜像
    • 解决异常
      • container failed to do request Head https
      • http: server gave HTTP response to HTTPS client
      • 需跳过https的验证
    • 修改以下配置
vi  /etc/containerd/config.toml[plugins."io.containerd.grpc.v1.cri".registry.auths][plugins."io.containerd.grpc.v1.cri".registry.configs][plugins."io.containerd.grpc.v1.cri".registry.configs."yourip:3xxxx".tls]insecure_skip_verify = true[plugins."io.containerd.grpc.v1.cri".registry.headers][plugins."io.containerd.grpc.v1.cri".registry.mirrors][plugins."io.containerd.grpc.v1.cri".registry.mirrors."yourip:3xxxx"]endpoint = ["http://yourip:3xxxx"]            
#重新加载配置并重启
systemctl daemon-reload && systemctl restart containerd
#可以写个deployment尝试拉取镜像
    • 以上配置修改后执行ctr命令拉取镜像,仍然还会抛以上异常,但K8S拉取镜像时正常拉取
      • ctr -n=k8s.io images pull yourip:3xxxx/test/hello-world:latest
        • 异常:http: server gave HTTP response to HTTPS client
        • 主要原因是K8S并不使用该插件,所以并不会读取该配置
          • [plugins."io.containerd.grpc.v1.cri".registry.configs]
          • 所以配置/etc/containerd/certs.d也不生效
          • 使用该配置并不能解决
            • --plain-http=true
            • 相关配置链接
              • https://github.com/containerd/containerd/blob/release/1.5/docs/hosts.md
          • 使用在ctr命令行却可正常拉取
            • ctr -n=k8s.io images pull yourip:3xxxx/docker.io/busybox:latest --platform linux/amd64 --plain-http=true
            • https://github.com/containerd/containerd/issues/2758
            • https://github.com/containerd/containerd/issues/3800

            • https://github.com/containerd/containerd/issues/6285

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

深入浅出图解C#堆与栈 C# Heaping VS Stacking 第五节 引用类型复制问题及用克隆接口ICloneable修复 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节…

【头歌实训】kafka-入门篇

文章目录 第1关&#xff1a;kafka - 初体验任务描述相关知识Kafka 简述Kafka 应用场景Kafka 架构组件kafka 常用命令 编程要求测试说明答案代码 第2关&#xff1a;生产者 &#xff08;Producer &#xff09; - 简单模式任务描述相关知识Producer 简单模式Producer 的开发步骤Ka…

Python跳动的爱心完整代码

文章目录 环境需求完整代码详细分析环境需求 python3.11.4PyCharm Community Edition 2023.2.5pyinstaller6.2.0(可选,这个库用于打包,使程序没有python环境也可以运行,如果想发给好朋友的话需要这个库哦~)【注】 python环境搭建请见:https://want595.blog.csdn.net/arti…

深入理解Mysql MHA高可用集群搭建:从实验到实战

1. 简介 MHA&#xff08;Master High Availability&#xff09;是一个高效的开源MySQL高可用性解决方案。由日本开发者yoshinorim&#xff08;前DeNA员工&#xff0c;现在Facebook&#xff09;创建&#xff0c;MHA支持MySQL的主从复制架构&#xff0c;自动化主节点故障转移。当…

支付宝 v3 验签如何实现

上次给大家介绍了 支付宝 v3 自签名如何实现&#xff0c;这次顺便再把验签也写一下。 为什么要验签 说起为什么要验签&#xff0c;如果要详细一点解释的话&#xff0c;可以写很多很多...... 我们就简单一点来解释&#xff1a;验签可以证明接收到的信息是支付宝给我的&#xf…

【信息安全原理】——拒绝服务攻击及防御(学习笔记)

&#x1f4d6; 前言&#xff1a;拒绝服务攻击&#xff08;Denial of Service, DoS&#xff09;是一种应用广泛、难以防范、严重威胁网络安全&#xff08;破坏可用性&#xff09;的攻击方式。本章主要介绍DoS的基本概念、攻击原理及防御措施。 目录 &#x1f552; 1. 定义&#…

sonarqube安装踩坑记录

如果用java1.8和mysql&#xff0c;则sonarqube版本不能超过7.8&#xff0c;看这里。 sonarqube7.8安装包地址&#xff1a; https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.8.zip 安装步骤&#xff1a; 1、下载sonarqube安装包 wget https://binari…

计算机毕业设计---ssm+mysql+jsp实现的校园二手市场交易平台源码

项目介绍 本系统主要实现的功能有&#xff1a; 前台&#xff1a;&#xff08;1&#xff09;二手物品信息查看、搜索。 &#xff08;2&#xff09;学生注册登录、个人信息修改。 &#xff08;3&#xff09;二手物品信息发布、编辑。 &#xff08;4&#xff09;二手物品评论、回…

mybatisX自动生成sql语句,尝试测试方法报错

今天我使用mybatisx自定义mapper方法生成sql语句后&#xff0c;在测试时报错 错误是MyBatis 无法找到映射的语句&#xff08;Statement&#xff09;引起的 我是这样操作的&#xff0c;在mapper接口自定义了一个方法 然后alt加enter&#xff0c;自动生成sql 结果 mapper.xml文件…

手机流量卡推广分销网站php源码,多功能的号卡推广分销管理系统

源码简介 拥有多个接口&#xff0c;包括运营商接口&#xff0c;并支持无限三级代理。 最简单易用的PHP系统&#xff0c;它自带自动安装向导&#xff0c;可以让你轻松安装和部署。 该系统集成了多个第三方接口资源&#xff0c;能够满足你的不同需求。采用全系统双色主题&…

MYSQL 索引结构 B+树 hash索引

B-Tree树 当节点存在五个key时&#xff0c;中间的key向上分裂形成树 B树 所有的数据都会出现在叶子节点&#xff0c;叶子节点形成一个单向链表 哈希索引 优点

Vulnhub-Al-Web-1.0 靶机复现完整过程

一、信息收集 1.主机发现 arp-scan -l2.端口扫描 nmap -sV -p- 192.168.200.16PORTSTATESERVICEVERSIONMAC Address80/TCPOpenhttpApache httpd00:0C:29:C4:1B:78 (VMware) 3.目录扫描 python dirsearch.py -u http://192.168.200.16扫描出来这两个文件&#xff0c;首先先…

java基础-回忆性记录

java基础 Java概括 jaava是一种计算机交流的高级编程语言&#xff0c;1995年java衍生&#xff0c;詹姆斯高斯林被世人称之为java之父。 java语言具有跨平台性 java程序并非可以直接运行的&#xff0c;在java程序编译完成后会形成与编译无关的class文件。Java具有跨平台性&a…

ARM CCA机密计算软件架构之内存加密上下文(MEC)

内存加密上下文(MEC) 内存加密上下文是与内存区域相关联的加密配置,由MMU分配。 MEC是Arm Realm Management Extension(RME)的扩展。RME系统架构要求对Realm、Secure和Root PAS进行加密。用于每个PAS的加密密钥、调整或加密上下文在该PAS内是全局的。例如,对于Realm PA…

中国蚁剑-antSword

1.简介 蚁剑是一款开源的跨平台Webshell管理工具&#xff0c;它是一个开源的远程管理工具&#xff0c;主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。蚁剑提供了一个图形化界面&#xff0c;可以通过简单的操作连接和控制目标设备或系统。 蚁剑具有以下…

QT应用篇 三、QML自定义显示SpinBox的加减按键图片及显示值效果

QT应用篇 一、QT上位机串口编程 二、QML用Image组件实现Progress Bar 的效果 三、QML自定义显示SpinBox的加减按键图片及显示值效果 文章目录 QT应用篇前言一、qml需求二、使用组件1.SpinBox组件2.SpinBox中QML的使用 总结 前言 记录自己学习QML的一些小技巧方便日后查找 QT的…

企业数据可视化-亿发数据化管理平台提供商,实现一站式数字化运营

近些年来&#xff0c;国内企业数据化管理升级进程持续加速&#xff0c;以物联网建设、人工智能、大数据和5G网络等新技术的发展&#xff0c;推动了数字经济的蓬勃发展&#xff0c;成为维持经济持续稳定增长的重要引擎。如今许多国内中小型企业纷纷摒弃传统管理模式&#xff0c;…

《Linux系列》Linux磁盘MBR分区扩容

文章目录 Linux磁盘MBR分区扩容1.前言2.控制台磁盘扩容3.分区扩容3.1 fdisk3.2 lsblk3.3 扩容分区 4.扩容文件系统4.1 df4.2 扩容文件系统 Linux磁盘MBR分区扩容 1&#xff09;参考阿里云扩容分区文档&#xff0c;整理MBR分区扩容 2&#xff09;本文档适用于MBR分区(fdisk -lu查…

MySQL的日志管理以及备份和恢复

MySQL日志管理 mysql的日志默认保存位置为/usr/local/mysql/data vim /etc/my.cnf #开启二进制日志功能 vim /etc/my.cnf [mysqld]##错误日志&#xff0c;用来记录当MySQL启动、停止或运行时发生的错误信息&#xff0c;默认已开启 log-error/usr/local/mysql/data/mysql_…

LabVIEW的便携式车辆振动测试分析

随着计算机和软件技术的发展&#xff0c;虚拟仪器正逐渐成为机械工业测试领域的主流。在现代机械工程中&#xff0c;特别是车辆振动测试&#xff0c;传统的测试方法不仅设备繁杂、成本高昂&#xff0c;而且操作复杂。为解决这些问题&#xff0c;开发了一款基于美国国家仪器公司…