GitLab CI 中如何使用 InsecureRegistry

发布时间:2021-08-03 14:12:37 作者:Leah
来源:亿速云 阅读:229
# GitLab CI 中如何使用 InsecureRegistry

## 前言

在持续集成/持续交付(CI/CD)流程中,容器镜像的构建和推送是常见操作。当使用私有容器注册表(Registry)且该注册表未配置有效TLS证书时,就会遇到"insecure registry"问题。本文将详细介绍如何在GitLab CI中安全地配置和使用不安全的容器注册表。

## 什么是Insecure Registry

Insecure Registry指的是未使用有效TLS证书进行加密的容器注册表,通常表现为:

1. 使用HTTP而非HTTPS协议
2. 使用自签名证书
3. 在内部网络中使用的未加密注册表

Docker和容器运行时默认会拒绝与这类注册表的连接,因为这存在中间人攻击风险。

## 配置GitLab Runner使用Insecure Registry

### 1. 修改Runner的config.toml文件

对于Docker或Kubernetes executor的GitLab Runner,需要在config.toml中添加注册表配置:

```toml
[runners.docker]
  insecure_registries = ["registry.example.com:5000", "192.168.1.100:5000"]
  
[runners.kubernetes]
  helper_image = "gitlab/gitlab-runner-helper:x86_64-latest"
  [runners.kubernetes.volumes]
    [[runners.kubernetes.volumes.host_path]]
      name = "docker-daemon"
      mount_path = "/etc/docker"
      host_path = "/etc/docker"

2. 修改宿主机的Docker配置

在Runner宿主机上修改或创建/etc/docker/daemon.json

{
  "insecure-registries" : ["registry.example.com:5000", "192.168.1.100:5000"]
}

然后重启Docker服务:

sudo systemctl restart docker

在GitLab CI中使用Insecure Registry

基本示例

build_image:
  stage: build
  image: docker:20.10.16
  services:
    - docker:20.10.16-dind
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""
    DOCKER_DRIVER: overlay2
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD registry.example.com:5000
    - docker build -t registry.example.com:5000/my-project/my-image:latest .
    - docker push registry.example.com:5000/my-project/my-image:latest

使用自签名证书

如果注册表使用自签名证书,需要将证书添加到信任链:

variables:
  DOCKER_TLS_CERTDIR: "/certs"
  
before_script:
  - mkdir -p $DOCKER_TLS_CERTDIR
  - echo "$REGISTRY_CERT" > $DOCKER_TLS_CERTDIR/ca.crt
  - export DOCKER_CERT_PATH=$DOCKER_TLS_CERTDIR

Kubernetes Executor配置

对于Kubernetes executor,可以通过Pod注解配置:

job:
  tags:
    - k8s
  variables:
    DOCKER_HOST: tcp://docker:2376
    DOCKER_TLS_VERIFY: "1"
    DOCKER_CERT_PATH: "/certs/client"
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD registry.example.com:5000

安全注意事项

  1. 仅限内部网络:Insecure Registry只应在完全控制的内部网络中使用
  2. 网络隔离:确保注册表服务不暴露在公共互联网
  3. 认证授权:即使使用HTTP,也应配置强认证
  4. 临时解决方案:最终应迁移到TLS保护的注册表

替代方案

如果可能,考虑以下更安全的替代方案:

  1. 使用Let’s Encrypt:为注册表获取免费的有效证书
  2. 企业级注册表:使用Harbor、GitLab Container Registry等支持TLS的方案
  3. 服务网格证书:在K8s环境中使用服务网格自动管理证书

常见问题解决

证书验证错误

x509: certificate signed by unknown authority

解决方案:将注册表CA证书添加到系统信任链或Docker配置中。

连接被拒绝

Error response from daemon: Get "https://registry.example.com:5000/v2/": http: server gave HTTP response to HTTPS client

解决方案:确认insecure-registries配置正确且已重启Docker服务。

结论

在GitLab CI中使用Insecure Registry虽然方便,但应谨慎对待。通过正确配置Runner和Docker,可以在开发或内部环境中安全地使用未加密的容器注册表。对于生产环境,强烈建议部署完整的TLS保护方案。

参考文档

  1. Docker官方文档 - 不安全注册表
  2. GitLab CI/CD Docker集成
  3. Kubernetes Pod安全策略

”`

这篇文章大约1250字,涵盖了GitLab CI中使用Insecure Registry的主要方面,包括配置方法、安全注意事项和常见问题解决。文章采用Markdown格式,包含代码块、列表和标题层级,适合技术文档发布。

推荐阅读:
  1. mysql备份恢复
  2. 网页编码不用gbk或者gb2312而用utf-8的原因分析

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

gitlab ci

上一篇:troubleshoot中怎么使用JFR分析性能

下一篇:如何解决某些HTML字符打不出来的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》