Kubernetes私有镜像仓库——harbor详解

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 架构组件

图片
  • 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

访问主机地址

图片

部署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
图片

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

(0)
联系我们
联系我们
分享本页
返回顶部