.. _k8s_fuck_gfw: ================== 墙内K8s部署 ================== .. note:: 本文是一些实践经验和想法,并不是 Kubernetes 的真正技术,然而对于墙内技术工作者来说又是不得不面对的挑战。 墙内部署Kubernetes: `不能说的秘密 `_ ================================================================================== `使用国内的镜像源搭建 kubernetes(k8s)集群 `_ 方法如下: - 先使用 :ref:`kubeadm` 按照正常流程构建集群,显然下载镜像会失败 - 执行 ``kubeadm`` 检查当前集群需要的镜像列表: .. literalinclude:: k8s_fuck_gfw/kubeadm_config_images_list :language: bash :caption: 检查Kubernetes部署使用的镜像 - 根据输出镜像列表以及对应版本信息,将 ``docker pull`` 命令的镜像改写成阿里云镜像registry来下载K8s镜像 - 为下载好的镜像打上对应的 ``k8s.gcr.io/XXXX`` 标签,这样就相当于直接从Google的镜像registry下载了正确的镜像 - 继续完成K8s部署 lank8s.cn ============ 在墙内部署Kubernetes以及很多原生应用是非常麻烦的,有一些技术爱好者,例如 `申远鹏 `_ 创建了一个 `lank8s.cn服务 `_ 为墙内Kubernetes用户提供 ``Kubernetes基础镜像`` 墙内镜像网站。这个项目弥补了微软镜像代理节点 ``azk8s.cn`` 从2020年上半年开始只对微软云的国内服务器提供服务的缺憾。( 微软azure.cn文档 `GCR Proxy Cache 帮助 `_ 介绍了 **Proxy Server仅限于 Azure China IP 使用,不再对外提供服务** ,以及使用方法) .. note:: 如果是自建自用服务(不对外),可以采用 :ref:`squid_socks_peer` 方式,在墙内和墙外构建一个代理通道,通过 :ref:`docker_proxy` / :ref:`containerd_proxy` / :ref:`helm_proxy` 等组合配置,实现全系列穿墙部署Kubernetes 不过,作为个人项目 `lank8s.cn服务 `_ 依然存在不稳定的问题,我在一个项目部署上遇到一个问题,同事使用 :ref:`kubespray` 部署Kubernetes使用了 `lank8s.cn服务 `_ ,然而在升级更新时遇到报错:: failed to pull image "lank8s.cn/pause:3.2": failed to resolve image "lank8s.cn/pause:3.2": no available registry endpoint: unexpected status code https://lank8s.cn/v2/pause/manifests/3.2: 503 Service Unavailable 实际上是 `lank8s.cn服务 `_ 服务器后端异常,这卡住了我的应用升级重启 `使用国内的镜像源搭建 kubernetes(k8s)集群 `_ 采用的方法提示了我,可以从Google官方下载好镜像(如果你可以翻墙)或者阿里云镜像服务器(如果你的服务器能够访问阿里云)下载: - 检查集群部署需要的镜像: .. literalinclude:: k8s_fuck_gfw/kubeadm_config_images_list :language: bash :caption: 检查Kubernetes部署使用的镜像 显示出当前集群需要的镜像列表: .. literalinclude:: k8s_fuck_gfw/kubeadm_config_images_list_output :language: bash :caption: 检查Kubernetes部署使用的镜像列表 - 由于我们系统缺少 ``lank8s.cn/pause:3.2`` 实际上就是 ``k8s.gcr.io/pause:3.2`` ,所以我们下载阿里云提供的 ``k8s.gcr.io/pause:3.2`` 镜像: .. literalinclude:: k8s_fuck_gfw/ctr_images_pull :language: bash :caption: 从阿里云镜像下载gcr.io的镜像 - 此时系统还看不到 ``lank8s.cn/pause:3.2`` ,我们需要给下载的阿里云对应镜像打上同名 ``tag`` (当初同事部署Kubernetes集群的时候应该是指定了): docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 k8s.gcr.io/pause:3.2 .. literalinclude:: k8s_fuck_gfw/ctr_images_tag :language: bash :caption: 将阿里云下载gcr.io的镜像打上tag 似乎早期版本 ``ctr`` 不支持 ``tag`` 命令,提示错误:: No help topic for 'tag' .. _docker_ctr_images: 结合 ``docker images`` 和 ``ctr images`` 实现镜像下载导入 ----------------------------------------------------------- 采用变通方法,先导出再导入,导入时加上标签(晕倒,导出镜像没有成功):: ctr -n k8s.io images export pause_3.2.tar registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.2 报错:: ctr: export failed: content digest sha256:bbb7780ca6592cfc98e601f2a5e94bbf748a232f9116518643905aa30fc01642: not found .. note:: :ref:`ctr` 非常难用,实际上不如兼容Docker的 :ref:`nerdctl` 怎么办呢? 我改为使用 :ref:`docker` 命令来下载镜像,然后通过 :ref:`transfer_docker_image_without_registry` 相似方法,利用 ``docker`` 功能丰富的镜像管理命令,先导出镜像,再用 ``ctr`` 导入镜像到 :ref:`containerd` (是的, ``ctr`` 导入命令可以使用): .. literalinclude:: k8s_fuck_gfw/docker_images_pull :language: bash :caption: 使用 ``docker`` 从阿里云镜像下载gcr.io的镜像,然后 ``tag`` 上 ``lank8s.cn/pause:32`` 方便后续导出 此时检查 ``docker images`` 可以看到:: REPOSITORY TAG IMAGE ID CREATED SIZE lank8s.cn/pause 3.2 80d28bedfe5d 3 years ago 683 kB registry.cn-hangzhou.aliyuncs.com/google_containers/pause 3.2 80d28bedfe5d 3 years ago 683 kB ``docker`` 导出镜像: .. literalinclude:: k8s_fuck_gfw/docker_images_save :language: bash :caption: 使用 ``docker`` 导出(save)阿里云镜像下载gcr.io的镜像 现在使用 ``ctr`` 导入 ``docker`` 保存的镜像 : .. literalinclude:: k8s_fuck_gfw/ctr_images_import :language: bash :caption: ``ctr images import`` 导入 ``docker`` 保存的镜像(有 ``lank8s.cn/pause:3.2`` TAG) 此时就会看到导入的是 ``lank8s.cn/pause:3.2`` : .. literalinclude:: k8s_fuck_gfw/ctr_images_import_output :language: bash :caption: ``ctr images import`` 导入 ``docker`` 保存的镜像(有 ``lank8s.cn/pause:3.2`` TAG)提示信息显示标签正确 现在使用 ``ctr -n k8s.io images ls | grep lank8s.cn`` 就能够看到我们需要的镜像标记 参考 ======= - `使用国内的镜像源搭建 kubernetes(k8s)集群 `_ - `国内镜像列表 `_ 非常有用的镜像网站列表,需要时可以参考