云原生架构系列之DevOps环境之本地Repository准备

云原生架构下的开发,要求可以自动化测试、构建、部署。这就要求网络带宽必须足够快,否则每次构建时需要等待较长时间,甚至于出现因为下载超时而失败的情况。因此,在一个完善的DevOps环境下,必须对常用的Yum、Maven、Nuget、NPM和Docker实施本地Registry Mirror。

(到底应该用Repository还是Registry,我也没搞清楚。NPM、Docker应该使用Registry,而Yum、Maven、Nuget应该是Repository)

在分析了众多缓存软件后,我们还是建议使用SonaType的Nexus3来作为本地Repository缓存。

服务器准备

我们建议安装一台虚机,在之上以Docker形式提供各类服务,而不是分散安装很多虚拟机。

以最小化形式安装CentOS 7,并做好相应的准备,譬如SELinux、NTPDate以及系统限制等,然后安装Docker CE最新版。

由于作为本地镜像缓存,所以需要较大空间的存储空间,本例中单独挂载 /data 文件夹。

初始化为Docker Swarm,以便于我们后续使用Stack部署。

docker swarm init

部署nginx和sonatype/nexus3

docker pull nginx
docker pul sonatype/nexus3

准备文件夹

注意:由于Nexus以ID为200的用户来运行,因此需要设置文件夹Owner为200

mkdir -p /data/nexus-data /data/nginx 
chown -R 200 /data/nexus-data

撰写 nexus-stack.yml

version: "3"
services:
  nexus:
    image: sonatype/nexus3:latest
    deploy:
      restart_policy: 
        condition: on-failure
    ports:
      - "8081:8081"
      - "8082:8082"
    volumes:
      - /data/nexus-data:/nexus-data
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /data/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /data/nginx/shmtu.crt:/etc/nginx/shmtu.crt
      - /data/nginx/shmtu.key:/etc/nginx/shmtu.key

准备nginx.conf文件

events {
  worker_connections  4096;  ## Default: 1024
}

http{

  tcp_nodelay on;

  client_max_body_size 1G;

  ssl_certificate     /etc/nginx/shmtu.crt;
  ssl_certificate_key     /etc/nginx/shmtu.key;
  
  ssl_session_cache  builtin:1000  shared:SSL:10m;
  ssl_session_timeout 10m;
  
  ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
  ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
  #ssl_prefer_server_ciphers on;


  server {
    listen 80;
    return 301  https://$host$request_uri;
  }

  server {
    listen 443  ssl;
    server_name repo.shmtu.edu.cn;


    location / {

      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 $scheme;

      # Fix the “It appears that your reverse proxy set up is broken" error.
      proxy_pass          http://nexus:8083;
      #proxy_read_timeout  90;
      proxy_redirect off;
    }
  }
}

其中的SSL证书需要根据实际情况提供。

部署Docker服务

docker stack up -f nexus-stack.yml nexus

这需要等待一点时间。具体可以通过docker logs -f 来查看启动进程。

待启动完毕后,我们就可以对nexus进行配置。

配置Nexus

修改密码

访问 http://repo.shmtu.edu.cn:8081/,用admin进行登录,初始密码为admin123,登录后修改密码。

创建Blob Store

默认的blob store为default,我们可以针对不同的Repository设置不同的存储位置。因此我们需要根据实际情况进行创建。

名称 作用
npm-private 本地NPM Registry
npm-proxy 远端NPM Registry Proxy
npm-group 统一访问的Registry URL
docker-private 本地Docker Registry
docker-proxy 远端 Docker Registry Proxy
docker-group 统一访问的Docker Registry URL

创建并使用NPM Registry

创建本地 NPM Registry

按照如图所示的配置创建本地NPM Registry。

image.png

相应的配置为:

选项
Name npm-private
Online checked
Blob store 选择 npm-private
Deployment policy 选择 Allow redploy

其他不用做出改变。

创建远端 NPM Registry Proxy

选项
Name npm-proxy
Online checked
Blob store 选择 npm-proxy
Remote storage https://registry.npmjs.org

创建NPM Registry Group

选项
Name npm-group
Online checked
Blob store 选择 npm-group
Group 添加刚刚创建的 npm-private, npm-proxy

以上操作完成,则npm registry mirror已经部署好,对外提供只需要知道 npm-group的url即可:http://repo.shmtu.edu.cn:8081/repository/npm-group/

客户端使用Registry Mirror

客户端使用方法有两种:

  1. 在项目根目录下创建.npmrc文件:
registry=http://repo.shmtu.edu.cn:8081/repository/npm-group/
  1. 直接在命令行里使用--registry参数
npm --registry=http://repo.shmtu.edu.cn:8081/repository/npm-group/ install 

创建并使用 Docker Registry

Docker Registry的创建方法与NPM Registry类似,只是Docker建议使用HTTPS访问,因此我们使用nginx作为反向代理,并配置了SSL证书。

创建 Local Registry

选项
Name docker-private
Online 选中
Respository Connectors - HTTP 选中,并输入8082
Allow anonymous docker pull 选中
Blob store 选择 docker-private
Deployment policy 选择 Allow redeploy

创建 Registry Proxy

选项
Name docker-proxy
Online 选中
Allow anonymous docker pull 选中
Remote stroage https://registry-1.docker.io
Docker index Use Docker Hub

创建 Registry Group

选项
Name docker-group
Online 选中
Respository Connectors - HTTP 选中,并输入8083
Allow anonymous docker pull 选中
Blob store 选择 docker-group
Group - Member repositories 选择 docker-private 和 docker-proxy

客户端使用方法

在这儿只讲述在CentOS下配置Registry Mirror:

cat > /etc/docker/daemon.json << EOF
{
  "registry-mirrors": [
    "https://repo.shmtu.edu.cn"
  ]
}
EOF

systemctl restart docker

输入docker pull mysql进行测试,回到nexus中,可以看到已经有mysql了。

image.png

总结

sonatype/nexus的部署和配置还有很多选项,譬如LDAP集成、访问代理等配置请参考产品帮助。

通过以上配置,我们基本上可以快速部署拉Docker镜像,也可以快速npm install模块了。节约了大量时间,提高了自动化CI/CD的效率。

你可能感兴趣的:(云原生架构系列之DevOps环境之本地Repository准备)