0
  1. 可否像 docker-compose 一样通过指定 Dockerfile 来自行构建镜像?
  2. 在真实的生产环境中,是怎样做到 k8s 拿到自己开发的应用程序的镜像的?我猜测有两种方案:

    • 第一种:搭建私有镜像仓库,在本地 build 然后 push 到私有仓库,然后 k8s 从私有仓库拉取镜像
    • 第二种:docker client 远程连接到 k8s 集群所在的服务器上的 docker server,将应用镜像构建到服务器本地,然后 k8s 从本地获取镜像
  3. 真实世界里,大家一般是采取的哪种方案,或者两者都不是?这两种方案有什么利弊吗?
  4. 请分别做回答

2019.12.03 更新:

问题已解决,第二种方案不可行的原因在于在 k8s 多节点的情况下无法保证每个节点本地都有镜像,而条件已经限制创建 Pod 要从节点本地拉取镜像。

除了第一种方案外,还有更先进的 CI/CD 方案:

代码  --push-->  代码仓库  --触发-->  CI/CD 软件拉取代码、构建镜像  --push image-->  私有镜像仓库

之后 k8s 从私有镜像仓库拉取镜像。

Xavier 288
11月21日提问
3 个回答
1

已采纳

第一种。

k8s 本身不应该关心镜像是什么构建的,它只负责部署,而第二种方式恰恰是耦合在一起了。

k8s 支持指定 registry,且是和 k8s 所在的宿主机 /etc/docker/daemon.json 的配置分离的,不需要也不应该去改 k8s 宿主机 docker-client 的配置,一切都应该通过 k8s 本身去完成。

常见的私有仓库的搭建方式有:

  • registry:由 docker 官方提供的私有仓库镜像,只提供了基本的基于账号密码的安全策略。
  • harbor:在 registry 基础上做的企业级服务,提供了基于角色的安全策略;使用比较复杂,但对有审计、LDAP、二次开发等方面的需要,用它是最顺手的。
  • nexus:一种支持多种格式的私有仓库,除 docker 外还支持 apt / yum / nuget / maven / npm 等;可通过插件支持多种安全策略。
  • 除此之外,还有很多云厂商也提供了私有仓库的云服务,如阿里云的容器镜像服务、AWS 的 Amazon Elastic Container Registry 等等。
1
回复 Xavier

对的。你 CI/CD 的一整套东西(CI/CD 工具、源代码仓库、docker 镜像仓库等等),应该是跟业务 k8s 分离的。至于你这套玩意儿是怎么部署(甚至可以是另一个 k8s 集群来维护),业务 k8s 不 care。

然后去远足 · 12月3日

展开评论
1

一定要搭建私有镜像的:第一是速度问题,第二是安全问题,私有镜像出于保密的原因不应该上传到公开的docker hub上。
常用的镜像软件有: harbor

1

推荐使用Harbor 基于docker-compose搭建一下,不用在k8s里部署,当然也可以在k8s里部署,会麻烦一些。

安装好harbor后,确保能够通过https://hub.domain.com 访问。然后在kubectl里执行 :

kubectl create secret docker-registry regcred --docker-server=hub.domain.com --docker-username=xxxx --docker-password=xxxx --namespace=xxxx
1

不建议你在k8s里装,我到现在还是:harbor-harbor-notary-server-57db8d4fb9-j9kjh 0/1 CrashLoopBackOff 1290 5d 。 不过我docker compose的已经running很好了。用起来了。

konakona · 12月3日

展开评论

撰写答案

推广链接