跳转至

部署 harbor 镜像仓库

harbor 介绍

在之前的项目部署过程中,我们主要依赖 Jenkins 将 jar 包推送至指定服务器,然后利用脚本命令使目标服务器对当前的 jar 进行部署。然而,当项目数量增多时,每个目标服务器都需要将 jar 包制作成自定义镜像,再通过 docker 来启动,这种重复操作颇为繁琐,极大地延长了项目的部署时间。

为了优化这一流程,我们可以引入 Harbor 作为私有的 Docker 镜像仓库。Jenkins 能够将项目统一打包并制作成 Docker 镜像,随后发布至 Harbor 仓库。只需向目标服务发出通知,目标服务即可统一从 Harbor 仓库拉取镜像,并在本地进行部署。

虽然 Docker 官方提供了 Registry 镜像仓库,但它的功能相对较为简单。与之不同的是,Harbor 是由 VMware 公司推出的一款镜像仓库,它具备了诸多强大且实用的功能,例如完善的权限控制机制,能够对不同用户和角色的操作权限进行精细管理;支持分布式发布,有效提升了镜像的分发效率和可靠性;还拥有强大的安全扫描与审查机制,能够对镜像进行全面的安全检测和漏洞审查,确保镜像的安全性和合规性。

Harbor 安装

这里采用原生的方式安装 Harbor。

1. 下载 Harbor 安装包

wget https://github.com/goharbor/harbor/releases/download/v2.5.3/harbor-offline-installer-v2.5.3.tgz
tar -zxvf harbor-offline-installer-v2.5.3.tgz -C /usr/local/

2. 修改 Harbor 配置文件:

1. 复制配置文件
cp harbor.yml.tmpl harbor.yml
2. 修改 Harbor 配置文件 harbor.yml :
--- 1. 修改主机名 或 对应域名---
hostname: harbor.harbor.com

--- 2. 修改 http 和 https 端口 和对应 https 证书 ---
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /harbor/harbor/harbor.harbor_bundle.pem
  private_key: /harbor/harbor/harbor.harbor.com.key

--- 3. 修改登录密码 ---

harbor_admin_password: '123456!dfsadasfasdcde'

3. 启动 Harbor

3. 启动 Harbor
./install.sh

4. 登录 Harbor

登录Harbor
image-20240725105751269

Harbor 使用

Harbor 作为功能强大的镜像仓库,其核心的交互模式主要体现在将镜像上传至 Harbor 以及从 Harbor 下载特定的镜像这两个方面。

在进行镜像的传输操作之前,我们能够充分利用 Harbor 所提供的权限管理功能。可以将项目设定为私有项目,针对不同的用户赋予各异的角色,以此实现更为便捷和精细的镜像管理。通过这种方式,能够有效地控制用户对镜像的访问和操作权限,保障镜像的安全性和管理的规范性,避免出现未经授权的访问和操作,从而提升整体的管理效率和安全性。

添加用户构建项目

创建用户

创建用户
image-20240725111554695

构建项目(设置为私有)

新建构建项目
image-20240725111910832

项目中添加用户

追加用户管理
image-20240725112107987

切换测试用户

切换测试用户
image-20240725112612568

发布镜像到 Harbor

修改 docker 配置

1. 创建 daemon.json文件
mkdir /etc/docker
touch /etc/docker/daemon.json
2. 修改 /etc/docker/daemon.json,支持私有仓库
{
        "insecure-registries": ["192.168.1.99:180"]
}
3. 重启 docker
systemctl restart docker

登录仓库

docker login -u <用户名> -p <'密码'> < Harbor 地址>

修改镜像名称( tag )

名称要求:[harbor地址/项目名/镜像名:版本]

docker tag nginx:latest 192.168.1.99:180/test/nginx:v1

推送镜像到 Harbor

docker push 192.168.1.99:180/test/nginx:v1
推送镜像到 Harbor
image-20240725143118410
image-20240725143211440

从主机 Harbor 拉取镜像

跟拉取 docker 镜像方式一样,但需要先配置 [/etc/docker/daemon.json] 文件

修改 docker 配置

1. 创建 daemon.json文件
mkdir /etc/docker
touch /etc/docker/daemon.json
2. 修改 /etc/docker/daemon.json,支持私有仓库
{
        "insecure-registries": ["192.168.1.99:180"]
}
3. 重启 docker
systemctl restart docker
拉取镜像
image-20240725143810683

K8s 集群使用 harbor 仓库

通过 secret 使用

(1.)创建 docker-registry 类型 secret

kubectl create secret docker-registry harbor-secret --docker-server=http://10.10.0.1 --docker-username=docker-admin --docker-password=docker-admin
说明:

  • 类型为 docker-registry
  • --docker-server 指定 harbor 仓库的IP
  • --docker-username 指定 harbor 仓库的登录用户名
  • --docker-password 指定 harbor 仓库的登录密码

查看是否成功

kubectl get secret |grep harbor-secret

(2.)创建 pod 并使用 secret

pod-harbor.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: pod-harbor
spec:
  containers:
  - name: app1
    image: 10.10.0.1/k8s-test/nginx:v1
  imagePullSecrets:                                     # 定义镜像下载使用的 secrets 
  - name: harbor-secret                 # 与刚创建的 secret 一致

通过 serviceaccout 使用

  • 每次编写 yaml 文件都需添加 imagePullSecrets 这 2 行配置,有点繁琐,可以把 secret 配置到 serviceAccount 中即可。
  • serviceAccount 可以实现不同 namespace 下载镜像使用访问 harbor 账号的不同。
使用自定义 serviceaccount

(1.) 创建 serviceaccount,关联 secret

apiVersion: v1
kind: ServiceAccount
metadata:
  name: docker-image
  namespace: default
imagePullSecrets:
- name: registrykey

(2. )使用 serviceaccount

apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
spec:
  selector:
    matchLabels:
      app: demo
  replicas: 2
  template:
    metadata:
      labels:
        app: demo
    spec:
      serviceAccount: docker-image                      # # imagePullSecrets 换成使用 harbor-sa 这个 docker-image
      containers:
      - name: docker-registry-test
        image: 10.10.0.1/demo/nginx:latest
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
          name: docker-image-test
使用defaultserviceaccount

如果没有指定服务账户,Pod 会被指定给命名空间中的 default service account。如果创建 pod 时没指定 image pull secrets,默认会将 default service account 的 image pull secrets注入到 pod。

(1.) 查看命名空间下的 default service account

kubectl describe sa default

(2.) 将创建好的 docker registry secret 用作 default service account 的 imagePullSecret。

kubectl patch serviceaccount default -n default -p '{"imagePullSecrets": [{"name": "docker-image"}]}'

(3.) 查看是否成功

kubectl describe serviceaccount harbor-sa

(4.) 修改 yaml 使用 serviceAccount 拉取

apiVersion: v1
kind: Pod
metadata:
  name: pod-harbor
spec:
  serviceAccount: harbor-sa                 # imagePullSecrets 换成使用 harbor-sa 这个 serviceAccount
  containers:
  - name: c1
    image: 10.10.0.1/test/nginx:v1