searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

docker离线镜像仓库部署

2023-05-24 09:30:00
83
0

       Kubernetes是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。创建集群是搭建Kubernetes环境的第一步,集群由一组物理或虚拟机组成,每一台机器被称为一个节点。集群的创建过程涉及多个步骤,包括配置网络,创建master节点,worker节点和harbor节点等,并设置节点之间的通信和协调机制,master节点负责管理集群的状态和调度的任务,worker节点负责承载容器运行。

       镜像是容器运行的基础,它包含了要部署的应用程序和其依赖的文件系统,我们可以从Docker镜像仓库中获取所需的镜像,Docker镜像仓库是一个存储和分发docker镜像的中央存储库,里面包含了大量的预构建镜像,以满足各种应用程序的需求。在实际开发过程中,很多镜像需要通过国外访问获得,造成很大的不便利性,因此本文将部署需要的镜像打包成离线数据包,通过在本地构建docker离线镜像仓库的方式部署集群。

安装docker

yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce

部署docker镜像仓库

生成证书cert.sh

#!/usr/bin/env bash

# 创建证书目录
mkdir -p certs

# 修改openssl.cnf,创建证书请求时指定证书的扩展信息
cp /etc/pki/tls/openssl.cnf certs/
sed -i "s#\# req_extensions = v3_req#req_extensions = v3_req\n[ alt_names ]\nDNS.1 = region.ccr.ctyun.cn#g" certs/openssl.cnf

# 生成私钥ca.key
openssl genrsa -out certs/ca.key 2048
# 生成自签名证书ca.crt
openssl req -x509 -new -nodes -key certs/ca.key -subj "/CN=www.ctyun.cn" -days 5000 -out certs/ca.crt

# 创建证书请求
openssl req -new -sha256 -key certs/ca.key -subj "/C=CN/ST=Beijing/L=Beijing/O=ctyun/OU=container/CN=region.ccr.ctyun.cn" -reqexts SAN -config <(cat certs/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:region.ccr.ctyun.cn")) -out certs/region.csr
# 根据自签名证书生成最终证书文件
openssl x509 -req -days 365000 -in certs/region.csr -CA certs/ca.crt -CAkey certs/ca.key -CAcreateserial -extfile <(printf "subjectAltName=DNS:region.ccr.ctyun.cn") -out certs/region.crt

# 添加域名
echo "127.0.0.1 region.ccr.ctyun.cn" >> /etc/hosts

# 拷贝证书到docker
mkdir -p /etc/docker/certs.d/region.ccr.ctyun.cn:443/
cp certs/ca.crt /etc/docker/certs.d/region.ccr.ctyun.cn:443/

启动私有镜像仓库

docker run -d --restart=always --name registry -v `pwd`/data:/var/lib/registry -v `pwd`/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/region.crt -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key -p 443:443 registry

# -v `pwd`/data:/var/lib/registry 将当前工作目录下的data目录挂载到容器内的/var/lib/registry目录,用于存储镜像仓库的数据
# -v `pwd`/certs:/certs 将当前工作目录下的certs目录挂载到容器内的/certs目录,用于存储证书文件
# -e REGISTRY_HTTP_ADDR=0.0.0.0:443 容器监听443端口
# -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/region.crt 容器使用指定路径下的证书文件作为TLS证书
# -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key 容器使用指定路径下的私钥文件作为TLS私钥
# -p 443:443 将主机的443端口映射到容器的443端口,以便通过主机的443端口访问私有镜像仓库
# registry: 这是Docker镜像的名称,表示使用官方的Registry镜像来运行私有镜像

加载集群部署需要镜像

需要的镜像举例

执行cce_init_registry.sh脚本文件

#!/bin/bash

# 用来将离线镜像修改为需要区域的名字,如beijing2,huadong1
if [ $# -lt 1 ];
then
        echo "Please enter the endpoint of the local registry to be pushed"
        exit
fi
registry=$1


# 替换镜像的名字,如k8s-gcr.m.daocloud.io/kube-proxy替换为nanning23.ccr.ctyun.cn:443/caas/kube-proxy
for file in `ls $dir`; do
        # Only *.tar files
        if echo "$file" | grep -q -E '\.tar$'
        then
                # Load image.
                docker load -i $file
                # Remove `.tar`.
                prefix=${file%\.tar}
                # Convert to array.
                array=(${prefix//_/ })
                num=${#array[@]}
                # Generate image repo:tag.
                image=""
                for ((j=1;j<num-1;j++))
                {
                        image=$image"/"${array[j]};
                }
                image=$image":"${array[num-1]}
                # Get source and target image.
                source=${array[0]}$image
                target=$registry$image
                # Rename image.
                docker tag $source $target
                # Push image.
                docker push $target
        fi
done

部署完成结果

 

 

0条评论
0 / 1000
杨****仪
2文章数
0粉丝数
杨****仪
2 文章 | 0 粉丝