Dok Docs
Github Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

make-pkg-release

概述

dok-release-package.sh 这个脚本可以从头到尾将 DOK 需要的安装包打包并且上传到 cos 桶上,如果不需要上传可以注释掉脚本的最后几行,建议是在可以访问外网的机器上执行,因为这样可以大大提升脚本运行的效率,如果坚持要在本地或者国内环境中运行,请考虑配置好不同文件取用的代理的方式(比较麻烦,非常不建议)。

原则

dok-release-package.sh 这个脚本最大的原则就是,所有的组件,都是开源的,并且通过 Internet 可以轻松获得的,一些自定义的配置文件会通过 cat 等方法,在脚本里编辑,简而言之,通过脚本,其他用户完全可以制作一个 DOK 的安装包,另外因为脚本更新速度很快,所以本文的内容有可能会不完全跟得脚本的迭代速度,所以具体的细节,请直接参考脚本。

脚本分析

安装工具

docker 依然是各位比较熟悉,且非常容易安装和获取的工具,所以安装包的构建直接使用 docker 而没有用到 ctr, nerdctl 等工具。

在镜像优化的过程中,已经彻底抛弃docker了,用户可以通过crictl/nerdctl等工具进行操作

yum install -y yum-utils pigz tar wget tree
# 流水线打包安装包的环境,用yum装docker方便一点,也可以直接用nerdctl
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker
systemctl start docker

创建目录

这个目录结构非常重要,很多路径的值必须是固定的,否则 DOK 在执行集群创建的时候可能会遇到问题。

# 构建安装包的目录结构
rm -rf /root/dok-release
mkdir -p /root/dok-release
mkdir /root/dok-release/app
mkdir /root/dok-release/docs
mkdir /root/dok-release/network
mkdir /root/dok-release/bin
mkdir /root/dok-release/bin/{cni,k8s,runc,containerd,tools,kernel}
mkdir /root/dok-release/conf
mkdir /root/dok-release/image

k8s套件

k8s 套件主要是指安装 Kubernetes 集群的必要的二进制和配置文件,当然也包括 kubeadm, runc, containerd 等等。

cd /root/dok-release/bin/k8s/ || exit
# 三个二进制
wget -c https://dl.k8s.io/v1.21.7/bin/linux/amd64/kubelet
wget -c https://dl.k8s.io/v1.21.7/bin/linux/amd64/kubeadm
wget -c https://dl.k8s.io/v1.21.7/bin/linux/amd64/kubectl
# 两个配置文件
wget -c https://raw.githubusercontent.com/kubernetes/release/master/cmd/kubepkg/templates/latest/deb/kubelet/lib/systemd/system/kubelet.service
wget -c https://raw.githubusercontent.com/kubernetes/release/master/cmd/kubepkg/templates/latest/deb/kubeadm/10-kubeadm.conf
# runc相关组件
cd /root/dok-release/bin/runc/ || exit
wget -c https://github.com/opencontainers/runc/releases/download/v1.1.3/runc.amd64 && mv runc.amd64 runc
# Containerd相关组件和配置文件
cd /root/dok-release/bin/containerd/ || exit
wget -c https://raw.githubusercontent.com/containerd/containerd/main/containerd.service
wget -c https://github.com/containerd/containerd/releases/download/v1.5.5/containerd-1.5.5-linux-amd64.tar.gz && tar zxvf containerd-1.5.5-linux-amd64.tar.gz && rm -rf containerd-1.5.5-linux-amd64.tar.gz && mv bin/* . && rm -rf bin/
containerd config default > config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' config.toml

之后我们需要非常关注这个文件 /root/dok-release/bin/k8s/dok.yaml,因为这是 kubeadm 使用的创建集群的模板文件,这个文件脱离了 DOK 直接使用 kubeadm 也是能够直接创建出一个 master0 的,当然了,尤其需要关注一个参数 controlPlaneEndpoint,这个参数会在 DOK 执行创建集群的时候被修改成 127.0.0.1:8443,原因是这个值将会写入 kubelet 的配置文件中,kubelet 就是依赖这个值跟 kube-apiserver 通信的,至于为什么是这个值,可以参考一下 DOK 文档中的 kube-apiserver-ha 章节,文件内容有点长,就不在这里赘述了。

CNI插件

有些 CNI 插件是会通过一个安装 Pod 来把 CNI 的插件,主要是指那些二进制安装上去,例如 calico,但是 DOK 默认的网络插件 flannel 并没有类似的操作,因此 CNI 插件需要通过 DOK 安装到各个节点指定的目录上。

# CNI相关组件
cd /root/dok-release/bin/cni/ || exit
wget -c https://github.com/containernetworking/plugins/releases/download/v1.1.1/cni-plugins-linux-amd64-v1.1.1.tgz && tar zxvf cni-plugins-linux-amd64-v1.1.1.tgz && rm -rf cni-plugins-linux-amd64-v1.1.1.tgz

其他工具

工具很多,主要是为了顺利安装集群以及方便集群创建之后的运维工作,比如说 k9s, etcdctl 这样的工具,包括一些组件安装的时候需要预装的软件,详细可以查看脚本。

镜像

离线安装的镜像是 DOK 的重要部分,包括 Kubernetes 集群以及 Helm 应用,这些容器需要的镜像都会提前下载并且打包放到安装包中,在创建集群的时候,这些镜像压缩包会分发到各个节点,并且通过 nerdctl load 加载到 containerd 的镜像系统里,镜像清单可以查看脚本文件,下面解释一下这些镜像是如何收集以及下载到本地的。

# k8s组件的镜像
/root/dok-release/bin/k8s/kubeadm config images pull --kubernetes-version 1.21.7
# 网络插件镜像
cd /root/dok-release/network || exit
# flannel
wget -c https://raw.githubusercontent.com/flannel-io/flannel/v0.18.1/Documentation/kube-flannel.yml
# calico
wget -c https://projectcalico.docs.tigera.io/manifests/calico.yaml
images=`grep -irn "image: " *|grep -v "#image"| awk -F "image: " '{print $2}'|sort|uniq`
for i in $images ; do
    echo "pulling image: $i"
    docker pull $i
done
# harbor镜像
helm repo add harbor https://helm.goharbor.io
helm repo update
images=`helm template harbor harbor/harbor --version 1.8.2 --set metrics.enabled=true --set metrics.serviceMonitor.enabled=true | grep -i "image: "|awk -F "image: " '{print $2}'|sort|uniq`
for i in $images ; do
    echo "pulling image: $i"
    docker pull $i
done

Helm应用

Helm App 安装的原理是通过在 helm pull 到 tgz 包,解压之后,创建一个名为 dok-values.yaml 的文件,将 DOK 部署需要用到的 value 值注入,在集群创建的最后阶段,在 master0 处实现的 helm install -f dok-values.yaml,以上是 DOK 中部署应用的逻辑。

重新打包

当引入新的组件的时候,安装包需要重新打包,不建议重头开始执行这个脚本,因为仅仅是为了添加几行命令就要把所有流程走一遍非常不划算,下面简单介绍一下怎么可以在最小化的成本下更新安装包。

# 假设在某台主机上已经有dok-release-without-app-image.gz
tar zxvf dok-release-without-app-image.gz
# 解压之后按照安装包的组织方法添加需要的文件