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
部署完成结果