部署 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 配置文件: ¶
cp harbor.yml.tmpl 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 ¶
./install.sh
4. 登录 Harbor ¶
登录Harbor |
---|
![]() |
Harbor 使用 ¶
Harbor 作为功能强大的镜像仓库,其核心的交互模式主要体现在将镜像上传至 Harbor 以及从 Harbor 下载特定的镜像这两个方面。
在进行镜像的传输操作之前,我们能够充分利用 Harbor 所提供的权限管理功能。可以将项目设定为私有项目,针对不同的用户赋予各异的角色,以此实现更为便捷和精细的镜像管理。通过这种方式,能够有效地控制用户对镜像的访问和操作权限,保障镜像的安全性和管理的规范性,避免出现未经授权的访问和操作,从而提升整体的管理效率和安全性。
添加用户构建项目 ¶
创建用户 ¶
创建用户 |
---|
![]() |
构建项目(设置为私有) ¶
新建构建项目 |
---|
![]() |
项目中添加用户 ¶
追加用户管理 |
---|
![]() |
切换测试用户 ¶
切换测试用户 |
---|
![]() |
发布镜像到 Harbor ¶
修改 docker 配置 ¶
mkdir /etc/docker
touch /etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.99:180"]
}
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 |
---|
![]() |
![]() |
从主机 Harbor 拉取镜像 ¶
跟拉取 docker 镜像方式一样,但需要先配置 [/etc/docker/daemon.json] 文件
修改 docker 配置 ¶
mkdir /etc/docker
touch /etc/docker/daemon.json
{
"insecure-registries": ["192.168.1.99:180"]
}
systemctl restart docker
拉取镜像 |
---|
![]() |
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
---
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