1、简介
Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。
2、特点
- 基于角色控制:用户和仓库都是基于项目进行组织的,而用户在项目中可以拥有不同的权限。
- 基于镜像的复制策略:镜像可以在多个Harbor实例之间进行复制(同步)。
- 支持 LDAP/AD:Harbor 可以集成企业内部已有的 AD/LDAP(类似数据库的一张表),用于对已经存在的用户认证和管理。
- 镜像删除和垃圾回收:镜像可以被删除,也可以回收镜像占用的空间。
- 图形化用户界面:用户可以通过浏览器来浏览,搜索镜像仓库以及对项目进行管理。
- 审计管理:所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
- 支持 RESTful API:RESTful API 提供给管理员对于 Harbor 更多的操控, 使得与其它管理软件集成变得更容易。
- Harbor和docker registry的关系:Harbor实质上是对docker registry做了封装,扩展了自己的业务模板。
3、Harbor 架构组件
![图片](http://eyangzhen.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
- Proxy:反向代理工具,他是一个nginx前端代理,主要是分发前端页面ui访问和镜像上传和下载流量。
- Registry:负责存储docker镜像,处理上传/下载命令。对用户进行访问控制,它指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token,registry会通过公钥对token进行解密验证。
- Core service:Harbor的核心功能:
- UI:图形界面。
- Webhook:及时获取registry上image状态变化情况,在registry上配置 webhook,把状态变化传递给UI模块。
- Token服务:复杂根据用户权限给每个docker push/p/ull命令签发token。Docker客户端向registry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向registry进行请求。
- Database:提供数据库服务,存储用户权限,审计日志,docker image分组信息等数据。
- Log collector:为了帮助监控harbor运行,复责收集其他组件的log,供日后进行分析。
4、Harbor的误区
- 误区一: Harbor是负责存储容器镜像的 (Harbor是镜像仓库,那么它就应当是存储镜像的)其实关于镜像的存储,Harbor使用的是官方的docker registry服务去完成,至于registry是用本地存储或者s3都是可以的,Harbor的功能是在此之上提供用户权限管理、镜像复制等功能,提高使用的registry的效率。
- 误区二:Harbor镜像复制是存储直接复制 (镜像的复制,很多人以为应该是镜像分层文件的直接拷贝)其实Harbor镜像复制采用了一个更加通用、高屋建瓴的做法,通过docker registry 的API去拷贝,这不是省事,这种做法屏蔽了繁琐的底层文件操作、不仅可以利用现有docker registry功能不必重复造轮子,而且可以解决冲突和一致性的问题。
5、环境准备
初始化环境
#关闭防火墙
[root@10-60-249-255 ~]# systemctl stop firewalld
[root@10-60-249-255 ~]# systemctl disable firewalld
#关闭selinux
[root@10-60-249-255 ~]# sed -i 's/enforcing/disabled/' /etc/selinux/config
[root@10-60-249-255 ~]# setenforce 0
#关闭swap分区
[root@10-60-249-255 ~]# swapoff -a
[root@10-60-249-255 ~]# sed -ri 's/.*swap.*/#&/' /etc/fstab
安装docker
#卸载旧版本
[root@10-60-249-255 ~]# sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
#安装基础以来
[root@10-60-249-255 ~]# yum install -y yum-utils
device-mapper-persistent-data
lvm2
#配置docker yum源
[root@10-60-249-255 ~]# sudo yum-config-manager
--add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装 docker
[root@10-60-249-255 ~]# yum install -y docker-ce
#配置docker加速
[root@10-60-249-255 ~]# sudo mkdir -p /etc/docker
[root@10-60-249-255 ~]# sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"]
}
EOF
#启动 docker
[root@10-60-249-255 ~]# systemctl enable docker
[root@10-60-249-255 ~]# systemctl start docker
#查看docker版本
[root@10-60-249-255 ~]# docker -v
Docker version 26.0.0, build 2ae903e
#安装docker-compose
[root@10-60-249-255 ~]# sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 25.2M 100 25.2M 0 0 9094k 0 0:00:02 0:00:02 --:--:-- 15.3M
[root@10-60-249-255 ~]# sudo chmod +x /usr/local/bin/docker-compose
[root@10-60-249-255 ~]# docker
docker dockerd-rootless-setuptool.sh
docker-compose dockerd-rootless.sh
dockerd docker-proxy
[root@10-60-249-255 ~]# docker-compose -v
Docker Compose version v2.5.0
6、安装Harbor
下载安装包
[root@10-60-249-255 ~]# wget https://github.com/goharbor/harbor/releases/download/v2.4.3/harbor-offline-installer-v2.4.3.tgz
解压到指定目录,拷贝harbor.yml文件
[root@10-60-249-255 ~]# tar xf harbor-offline-installer-v2.4.3.tgz -C /usr/local/
[root@10-60-249-255 ~]# cd /usr/local/harbor/
[root@10-60-249-255 harbor]# cp harbor.yml.tmpl harbor.yml
编辑harbor.yml文件
#修改内容如下
[root@10-60-249-255 harbor]# vim harbor.yml
//这里的主机名换成本机的主机名或IP地址
..........
hostname: harbor_node01.example.com
..........
创建证书
#生成CA证书私钥
[root@10-60-249-255 ca]# openssl genrsa -out ca.key 4096
#生成CA证书
[root@10-60-249-255 ca]# openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=w7.lovezyyhq.top" -key ca.key -out ca.crt
#生成私钥。
[root@10-60-249-255 ca]# openssl genrsa -out w7.lovezyyhq.top.key 4096
#生成证书签名请求 (CSR)
[root@10-60-249-255 ca]# openssl req -sha512 -new -subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=w7.lovezyyhq.top" -key w7.lovezyyhq.top.key -out w7.lovezyyhq.top.csr
#生成 x509 v3 扩展文件。
[root@10-60-249-255 ca]# cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=w7.lovezyyhq.top
EOF
#使用该v3.ext文件为 Harbor 主机生成证书。
[root@10-60-249-255 ca]# openssl x509 -req -sha512 -days 3650
-extfile v3.ext
-CA ca.crt -CAkey ca.key -CAcreateserial
-in w7.lovezyyhq.top.csr
-out w7.lovezyyhq.top.crt
#将.cert文件解释为客户端证书。
[root@10-60-249-255 ca]# openssl x509 -inform PEM -in w7.lovezyyhq.top.crt -out w7.lovezyyhq.top.cert
#先创建相应的文件夹。
[root@10-60-249-255 ca]# mkdir /usr/local/harbor/ca
#复制证书
[root@10-60-249-255 ca]# ls
ca.crt ca.srl w7.lovezyyhq.top.crt w7.lovezyyhq.top.key
ca.key w7.lovezyyhq.top.cert w7.lovezyyhq.top.csr v3.ext
[root@10-60-249-255 ca]# cp -rp w7.lovezyyhq.top.* /usr/local/harbor/ca/
#指定证书位置
[root@10-60-249-255 harbor]# vim harbor.yml
# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /usr/local/harbor/ca/w7.lovezyyhq.top.crt
private_key: /usr/local/harbor/ca/w7.lovezyyhq.top.key
执行安装
#生成配置
[root@10-60-249-255 harbor]# ./prepare
#启动服务
[root@10-60-249-255 harbor]# docker-compose up -d
#一键安装
[root@10-60-249-255 harbor]# ./install.sh
访问主机地址
![图片](http://eyangzhen.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
部署harbor开机自启
[root@10-60-249-255 ~]# vim /etc/rc.local
cd /usr/local/harbor//添加这行与下面一行
docker-compose start
[root@10-60-249-255 ~]# chmod +x /etc/rc.d/rc.local
![图片](http://eyangzhen.com/wp-content/themes/justnews/themer/assets/images/lazy.png)
7、创建secret
[root@mast01 ca]# kubectl create secret docker-registry harbor-secret --docker-server=117.50.163.139 --docker-username=admin --docker-password=Harbor12345
- docker-registry指定类型
- docker-server指定harbor仓库的IP
- docker-username指定harbor仓库的登录用户名
- docker-password指定harbor仓库的登录密码
8、secret挂载到pod
#imagePullSecretes 指定从harbor拉取镜像所需的secret
[root@mast01 ca]# cat secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: 117.50.163.139/test/nginx:1.15
ports:
- containerPort: 80
imagePullSecrets:
- name: harbor-secret
#执行文件
kubectl apply -f secret.yaml
#查看pod
[root@mast01 ca]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-pod 1/1 Running 0 7m13s
9、secret+serviceAccount
#创建serviceAccount
[root@mast01 ca]# vim serviceaccount-harbor-sa.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: harbor-sa
namespace: default
#执行文件
[root@mast01 ca]# kubectl apply -f serviceaccount-harbor-sa.yaml
serviceaccount/harbor-sa created
#绑定secret
[root@mast01 ca]# kubectl patch serviceaccount harbor-sa -n default -p '{"imagePullSecrets": [{"name" : "harbor-secret"}]}'
serviceaccount/harbor-sa patched
#查看绑定信息
[root@mast01 ca]# kubectl get sa harbor-sa -o yaml
apiVersion: v1
imagePullSecrets:
- name: harbor-secret
kind: ServiceAccount
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"ServiceAccount","metadata":{"annotations":{},"name":"harbor-sa","namespace":"default"}}
creationTimestamp: "2024-04-10T15:57:32Z"
name: harbor-sa
namespace: default
resourceVersion: "61164"
uid: 3fcbd814-f1df-4943-936f-b537ca74f0dd
secrets:
- name: harbor-sa-token-wm8kj
# serviceAccountName 指定从harbor拉取镜像所需的serviceAccount
[root@mast01 ca]# vim sa-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
spec:
containers:
- name: nginx
image: 117.50.163.139/test/nginx:1.15
ports:
- containerPort: 80
serviceAccountName: harbor-sa
声明:文中观点不代表本站立场。本文传送门:http://eyangzhen.com/414914.html