上一篇文章(https://www.jianshu.com/p/cc4817e014df)中,我们成功使用Kubernetes搭建了Nexus3,但是如果使用Nexus3中的docker私有仓库功能,我们还需要额外做一些操作,今天我们就来完善它
0x01. 创建Docker私有仓库
我们打开上一次我们部署好的Nexus3,以管理员身份登录之后进入仓库管理页面
k8s-nexus-docker01.png
点开创建仓库页面后,我们在创库种类列表中选择docker(hosted),三种类型分别表示如下:
- docker(proxy):对其他仓库进行代理,比如docker中央仓库
- docker(hosted):本地存储docker镜像数据,即搭建一个和docker官方仓库一样的可以存储docker镜像的私服
-
docker(group):聚合仓库,其实就是通过配置将多个docker仓库引用合并成一个仓库对外开放
k8s-nexus-docker02.png
在仓库信息配置页面中,请填写仓库名称,勾选HTTP并填写HTTP监听端口号、勾选对docker V1 API的支持,我这里填写的是8082端口号,实际中读者可以根据自己服务器的实际情况进行填写,一定要记住这里填写的端口号,我们稍后会用到。至于docker v1 的支持根据自己的需要,如果自己的docker客户端肯定是V2版本那么可以不勾选。
k8s-nexus-docker03.png
本页面的其他选项默认可以不进行修改,直接点击创建仓库【Create repository】按钮即可
k8s-nexus-docker04.png
0x02. 修改kubernetes的配置文件
修改后的配置文件(repo-nexus.yaml)内容如下:
kind: Deployment
apiVersion: apps/v1
metadata:
labels:
app: repo-nexus
name: repo-nexus
namespace: repo-nexus
spec:
replicas: 1
selector:
matchLabels:
app: repo-nexus
template:
metadata:
labels:
app: repo-nexus
spec:
containers:
- name: repo-nexus
image: registry.docker-cn.com/sonatype/nexus3:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8081
protocol: TCP
- containerPort: 8082
protocol: TCP
volumeMounts:
- name: repo-nexus-data
mountPath: /nexus-data
volumes:
- name: repo-nexus-data
persistentVolumeClaim:
claimName: repo-nexus-pvc
---
# service
kind: Service
apiVersion: v1
metadata:
labels:
app: repo-nexus
name: repo-nexus
namespace: repo-nexus
spec:
ports:
- port: 8081
targetPort: 8081
name: repo-base
- port: 8082
targetPort: 8082
name: repo-docker
selector:
app: repo-nexus
---
# ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: repo-nexus
namespace: repo-nexus
spec:
rules:
- host: repo.lemonit.cn
http:
paths:
- path: /
backend:
serviceName: repo-nexus
servicePort: 8081
- host: docker.repo.lemonit.cn
http:
paths:
- path: /
backend:
serviceName: repo-nexus
servicePort: 8082
本配置文件共做了如下修改:
- Deployment中spec/template/spec/containers/ports字段增加了一组元素,配置containerPort为8082,这里的端口号对应刚才我们在创建仓库的页面中填写的HTTP监听的端口号,注意!!!一定要匹配!!!
- Service中的spec/ports字段增加了一组元素,设置对外端口号port和容器targetPort,因为出现了多组端口,还需要为每组端口号增加name属性,否则应用配置的时候kubernetes会报错service invalid。这里为了方便记忆,把对外端口号port和容器端口号targetPort设置成了一样的8082
- Ingress中spec/rules字段增加一组元素,配置一个新的监听,监听域名docker.repo.lemonit.cn,后端的serviceName同样为repo-nexus,端口号为刚刚service port:8082
这三项修改完毕后,我们使用命令对配置进行生效操作:
kubectl apply -f repo-nexus.yaml
0x03. 后续配置
这一步主要是kubernetes之外的外部操作,根据自己的情况进行操作,主要分以下两步:
- 申请docker.repo.lemonit.cn域名和对应的SSL证书,建议配置SSL证书,否则Docker访问http的仓库的时候还需要进行配置操作。腾讯云可以免费申请SSL证书。
- 在外部的负载均衡中配置docker.repo.lemonit.cn的SSL证书,并将其代理转发到kubernetes中的ingress外部节点上
我的负载均衡因为配置到了8445端口号上,所以最后得到的完整地址为
docker.repo.lemonit.cn:8445
0x04. 测试
接下来,我们将从docker hub中pull下来的busybox镜像推送到我们的私有仓库进行测试,首先在装有docker的机器上从docker hub中pull镜像
docker pull busybox:latest
然后对pull下来的镜像进行tag标记
docker tag busybox:latest docker.repo.lemonit.cn:8445/busybox:latest
推送之前,我们还需要登录到docker仓库
docker login docker.repo.lemonit.cn:8445
执行命令之后会提示分别输入username和password,这里可以使用nexus的默认admin账号密码进行登录,也可以在Nexus3中单独建立一个只有docker仓库权限的账号进行登录,提示Login Succeeded
说明登录成功。
接下来,我们将这个镜像推到私有仓库中
docker push docker.repo.lemonit.cn:8445/busybox:latest
控制台输出如下,推送成功
LemonITCNdeMacBook-Pro: ~ $ docker push docker.repo.lemonit.cn:8445/busybox:latest
The push refers to repository [docker.repo.lemonit.cn:8445/busybox]
8a788232037e: Pushed
latest: digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5 size: 527
在客户端推送完毕后,我们去Nexus中可以查看到我们刚刚成功推送的busybox镜像
k8s-nexus-docker05.png
有不懂的朋友欢迎评论问我,或者加我微信,微信号: qbxx002
网友评论