安装harbar
下载地址:https://github.com/goharbor/harbor/releases/tag/v2.3.1
下载后解压,然后复制harbor.yml.tmp一份命名为harbor.ym,修改其中的port和host,如果不用https也一并注释掉。执行./install.sh
,此时会生成一堆文件啊,比如nginx,nginx映射的端口正是你修改后的端口。
因为我这里也装了nginx,所以端口冲突了,改了下docker-compose的容器名称和端口,再次执行./install.sh,启动全部Harbar相关容器。
启动后直接登陆对应点ip我这里是:192.168.1.148:81,账号默认是admin,密码是Harbor12345。登陆完成新建自己的私有库我这里命名为myshop。并且修改/etc/docker/daemon.json 插入一行代理
{
"registry-mirrors": ["https://k4obhtjz.mirror.aliyuncs.com"],
"insecure-registries": ["http://192.168.1.148:81"]
}
重启下让配置生效,systemctl restart docker
,在输入docker info
看下代理注册列表有没有你的信息。
推送和拉取镜像
使用密码的方式登陆报错提示:要以非交互方式运行docker login命令,可以将 —password-stdin标志设置为通过STDIN提供密码。使用STDIN可以防止密码出现在shell的历史记录或日志文件中。
➜ docker login 192.168.1.148:8082 -u admin -p Harbor12345
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
#会提示铭文输入密码不安全
➜ docker tag simone-getway:1.0 192.168.1.148:81/myshop/simone-app:1.0
➜ docker push 192.168.1.148:81/myshop/simone-app:1.0
如果出现推送失败试着从新install一下,可能是你上次的配置未生效。
镜像已经推送完成,在到另一台服务器110执行加入注册列表信息,重启docker然后登陆和拉取操作便可完成拉取,于此同时你拉取后我们webUi界面上的下载次数也会+1
➜ docker login 192.168.1.148:81 -u admin -p Harbor12345
➜ docker pull 192.168.1.148:81/myshop/simone-getway:1.0
K8s拉取Harbor镜像
docker方式安装
我本机安装的是最新版本的k8s版本是v1.23.1,如果是docker安装完成harbor后会在/root/.docker下生成一个config.json文件,其中里面配置的是你从私有仓库中拉取镜像所需秘钥。
生成加密后秘钥
➜ cat ~/.docker/config.json |base64 -w 0 #
# echo 'ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEuMTQ4OjgwODIiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=' | base64 --decode
生成secret
``` yaml
apiVersion: v1
kind: Secret
metadata:
name: docker-harbor-registry
namespace: sit
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEuMTQ4OjgwODIiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=
<a name="mYY07"></a>
### containerd方式安装
<a name="egGGS"></a>
#### 生成secret
如果是以containerd的方式作为容器的话,则没有对应的config.json文件,所以通过[官方文档](https://kubernetes.io/zh/docs/tasks/configure-pod-container/pull-image-private-registry/)给的方式去创建即可。
```bash
➜ kubectl create secret docker-registry docker-harbor-registry \
--docker-server=http://192.168.1.148:81 \
--docker-username=admin \
--docker-password=Harbor12345\
--docker-email=1158139789@qq.com
➜ kubectl get secret docker-harbor-registry --output=yaml 输出ymml形式查看
拉取镜像
apiVersion: v1
kind: Service
metadata:
name: simone-app
namespace: sit
labels:
app: simone-app
spec:
selector:
app: simone-app
type: NodePort
ports:
- port: 30021
targetPort: 30021
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: simone-app
namespace: sit
spec:
replicas: 1
selector:
matchLabels:
app: simone-app
template:
metadata:
labels:
app: simone-app
spec:
containers:
- image: 192.168.1.148:8082/myshop/simone-app:202109171147_6998270
imagePullPolicy: IfNotPresent
name: simone-app
ports:
- containerPort: 30021
protocol: TCP
volumeMounts:
- name: logdir
mountPath: /logs
- name: localtime
mountPath: /etc/localtime
- name: timezone
mountPath: /etc/timezone
imagePullSecrets:
- name: docker-harbor-registry
volumes:
- name: logdir
emptyDir: {}
- name: localtime
hostPath:
path: /etc/localtime
- name: timezone
hostPath:
path: /etc/timezone
➜ kubectl describe pod simone-app -n sit
原因是新版的容器用的是containerd而不是Docker。现在我无法从我的私有仓库(Harbor)中拉取Docker镜像。我已经把/etc/containerd/config.toml改成如下配置,重启容器 systemctl restart container
即可拉取成功
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.1.148:81"]
endpoint = ["http://192.168.1.148:81"]
[plugins."io.containerd.grpc.v1.cri".registry.configs]
[plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.1.148:81"]
[plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.1.148:81".auth]
username = "admin"
password = "Harbor12345"