安装harbar

下载地址:https://github.com/goharbor/harbor/releases/tag/v2.3.1
image.png
下载后解压,然后复制harbor.yml.tmp一份命名为harbor.ym,修改其中的port和host,如果不用https也一并注释掉。执行./install.sh,此时会生成一堆文件啊,比如nginx,nginx映射的端口正是你修改后的端口。

因为我这里也装了nginx,所以端口冲突了,改了下docker-compose的容器名称和端口,再次执行./install.sh,启动全部Harbar相关容器。

image.png
启动后直接登陆对应点ip我这里是:192.168.1.148:81,账号默认是admin,密码是Harbor12345。登陆完成新建自己的私有库我这里命名为myshop。并且修改/etc/docker/daemon.json 插入一行代理
image.png

  1. {
  2. "registry-mirrors": ["https://k4obhtjz.mirror.aliyuncs.com"],
  3. "insecure-registries": ["http://192.168.1.148:81"]
  4. }

重启下让配置生效,systemctl restart docker,在输入docker info看下代理注册列表有没有你的信息。

推送和拉取镜像

使用密码的方式登陆报错提示:要以非交互方式运行docker login命令,可以将 —password-stdin标志设置为通过STDIN提供密码。使用STDIN可以防止密码出现在shell的历史记录或日志文件中。

  1. docker login 192.168.1.148:8082 -u admin -p Harbor12345
  2. WARNING! Using --password via the CLI is insecure. Use --password-stdin.
  3. #会提示铭文输入密码不安全
  1. docker tag simone-getway:1.0 192.168.1.148:81/myshop/simone-app:1.0
  2. docker push 192.168.1.148:81/myshop/simone-app:1.0

image.png

如果出现推送失败试着从新install一下,可能是你上次的配置未生效。
镜像已经推送完成,在到另一台服务器110执行加入注册列表信息,重启docker然后登陆和拉取操作便可完成拉取,于此同时你拉取后我们webUi界面上的下载次数也会+1

  1. docker login 192.168.1.148:81 -u admin -p Harbor12345
  2. docker pull 192.168.1.148:81/myshop/simone-getway:1.0

image.png

K8s拉取Harbor镜像

docker方式安装

我本机安装的是最新版本的k8s版本是v1.23.1,如果是docker安装完成harbor后会在/root/.docker下生成一个config.json文件,其中里面配置的是你从私有仓库中拉取镜像所需秘钥。
image.png

生成加密后秘钥

  1. cat ~/.docker/config.json |base64 -w 0 #
  2. # echo 'ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEuMTQ4OjgwODIiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=' | base64 --decode

生成secret

  1. ``` yaml
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5. name: docker-harbor-registry
  6. namespace: sit
  7. type: kubernetes.io/dockerconfigjson
  8. data:
  9. .dockerconfigjson: ewoJImF1dGhzIjogewoJCSIxOTIuMTY4LjEuMTQ4OjgwODIiOiB7CgkJCSJhdXRoIjogIllXUnRhVzQ2U0dGeVltOXlNVEl6TkRVPSIKCQl9Cgl9Cn0=
  1. <a name="mYY07"></a>
  2. ### containerd方式安装
  3. <a name="egGGS"></a>
  4. #### 生成secret
  5. 如果是以containerd的方式作为容器的话,则没有对应的config.json文件,所以通过[官方文档](https://kubernetes.io/zh/docs/tasks/configure-pod-container/pull-image-private-registry/)给的方式去创建即可。
  6. ```bash
  7. ➜ kubectl create secret docker-registry docker-harbor-registry \
  8. --docker-server=http://192.168.1.148:81 \
  9. --docker-username=admin \
  10. --docker-password=Harbor12345\
  11. --docker-email=1158139789@qq.com
  12. ➜ 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

image.png 原因是新版的容器用的是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"

image.png