在k8s集群中部署nexus3容器仓库
首先和大家一样,来说说现在比较主流的一些数据仓库Docker官方的Registry原生仓库SuSE团队推出的出的Portus:https://github.com/SUSE/PortusVMWare中国团队推出的企业级仓库—Harbor大家熟知的Maven私服:Sonatype Nexus3在网上转悠了一圈,基本上就是上面的几个入了大家的法眼,现在公司是采用的doc...
首先和大家一样,来说说现在比较主流的一些数据仓库
- Docker官方的Registry原生仓库
- SuSE团队推出的出的Portus:https://github.com/SUSE/Portus
- VMWare中国团队推出的企业级仓库—Harbor
- 大家熟知的Maven私服:Sonatype Nexus3
在网上转悠了一圈,基本上就是上面的几个入了大家的法眼,现在公司是采用的docker原生Registry仓库,仅用来存储私有镜像还是够用了,pull的时候直接使用阿里的镜像库进行加速即可,但随着使用容器化的微服务的增加,对镜像的拉取速度等的要求也越来越高。对比了上面几个容器仓库后,决定使用nexus3作为私服,完成对原生仓库的替换。
在选择nexus3之前,对harbor也进行了调研,但因为nexus3同时可支持pypi、maven、npm等私服,便成了我的首选。
部署
默认已拥有一个可用的k8s集群,使用statefulset创建单点的nexus3服务。
- 内部域名:nexus3.home-stack.in
- docker访问域名: docker-registry.home-stack.in
nexus3服务介绍
- hosted: 本地仓库,可进行pull、push操作
- proxy: 代理仓库,仅pull
- group: 聚合仓库,仅pull
为了让nexus3提供的docker仓库pull和push统一域名,这里我们使用nginx作为docker-proxy,group和hosted接口进行合并。nginx捕捉到get请求时,将请求代理到group仓库,捕捉到post请求和search操作时,将请求代理到hosted仓库。
nexus3.yaml
执行如下命令部署
kubectl create -f nexus3.yaml -n nexus3
在部署前,请修改pvc的
storageClassName
以确保服务正常启动
---
apiVersion: v1
kind: Service
metadata:
name: nexus3-headless
labels:
app: nexus3
spec:
ports:
- name: web
port: 8081
targetPort: 8081
clusterIP: None
selector:
app: nexus3
---
apiVersion: v1
kind: Service
metadata:
name: docker-proxy-headless
labels:
app: nexus3
spec:
ports:
- name: http
port: 80
clusterIP: None
selector:
app: nexus3
---
apiVersion: v1
kind: ConfigMap
metadata:
name: docker-proxy
data:
nginx.conf: |
upstream nexus_docker_get {
# docker-public
server 127.0.0.1:8083;
}
upstream nexus_docker_put {
# docker-private
server 127.0.0.1:8082;
}
server {
listen 80;
server_name localhost;
client_max_body_size 0;
# required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
chunked_transfer_encoding on;
# 设置默认使用推送代理
set $upstream "nexus_docker_put";
# 当请求是GET,也就是拉取镜像的时候,这里改为拉取代理,如此便解决了拉取和推送的端口统一
if ( $request_method ~* 'GET') {
set $upstream "nexus_docker_get";
}
# 只有本地仓库才支持搜索,所以将搜索请求转发到本地仓库,否则出现500报错
if ($request_uri ~ '/search') {
set $upstream "nexus_docker_put";
}
index index.html index.htm index.php;
location / {
proxy_pass http://$upstream;
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
proxy_read_timeout 3600;
proxy_buffering off;
proxy_request_buffering off;
# 修复nginx位于ingress之后导致镜像推送上传失败问题https://docs.docker.com/registry/recipes/nginx/
# proxy_set_header Host $host;
# proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_set_header X-Forwarded-Proto http;
}
}
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nexus3-ingress
annotations:
"nginx.ingress.kubernetes.io/proxy-body-size": "1000m"
spec:
rules:
- host: nexus3.home-stack.in
http:
paths:
- backend:
serviceName: nexus3-headless
servicePort: 8081
path: /
- host: docker-registry.home-stack.in
http:
paths:
- backend:
serviceName: docker-proxy-headless
servicePort: 80
path: /
tls:
- hosts:
- nexus3.home-stack.in
- docker-registry.home-stack.in
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nexus3
spec:
serviceName: nexus3-headless
replicas: 1
template:
metadata:
labels:
app: nexus3
spec:
containers:
- name: nexus3
image: sonatype/nexus3:3.19.1
imagePullPolicy: IfNotPresent
ports:
- name: web
containerPort: 8081
# - name: docker-private
# containerPort: 8082
# - name: docker-public
# containerPort: 8083
volumeMounts:
- name: datadir
mountPath: /nexus-data
- name: docker-proxy
image: nginx:alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
volumeMounts:
- name: docker-proxy
mountPath: /etc/nginx/conf.d/default.conf
subPath: nginx.conf
volumes:
- name: docker-proxy
configMap:
name: docker-proxy
volumeClaimTemplates: # 使用模板卷创建pvc
- metadata:
name: datadir
spec:
accessModes: [ "ReadWriteMany" ]
storageClassName: nfs-client
resources:
requests:
storage: 100Gi
selector:
matchLabels:
app: nexus3
访问nexus3
修改hosts
# ingress暴露的地址
192.168.1.100 nexus3.home-stack.in
192.168.1.100 docker-registry.home-stack.in
浏览器打开 https://nexus3.home-stack.in ,因为使用的自签证书所以会有安全警告,直接忽略即可。
创建docker服务
- hosted端口:8082
- group端口:8083
使用说明
修改本机docker配置文件:/etc/docker/daemon.json
{
"registry-mirrors": ["http://docker-registry.home-stack.in"],
"insecure-registries" : [ "docker-registry.home-stack.in"]
}
重启docker服务
systemctl restart docker.service
拉取镜像
docker pull docker-registry.home-stack.in/nginx:latest
在nexus3中你配置的docker-proxy仓库查看是否有缓存下来的nginx镜像
推送镜像
docker push docker-registry.home-stack.in/custom-images:tag
在nexus3中你配置的docker-hosted仓库查看是否有上传的custom-images:tag镜像
写在最后
通过nexus3我们可以加速我们对docker仓库中镜像的拉取速度,第一次拉取来源于外网,后续的拉取则优先于本地内网环境了。同时nexus3还提供了其他仓库的支持,有兴趣可以试试看,绝对会有一种豁然开朗的赶脚~
更多推荐
所有评论(0)