本指南重点介绍了使用 Kaniko 镜像生成器在?Kubernetes?pod 中设置?Docker 映像构建的分步过程。
当涉及到CI / CD时,可能会有基于VM和容器的应用程序。理想情况下,应使用现有的 VM 基础结构来构建 Docker 映像。但是,如果您有容器化基础结构,最好将其用于 CI/CD 工作流。
在 CI 中,其中一个主要阶段是构建 Docker 镜像。在容器化构建中,您可以在 Docker 工作流中使用 Docker。
但这种方法有以下缺点。
docker.sock
这些问题可以使用 Kaniko 解决。
还有一个名为 podman 的实用程序,它可以在没有 root 权限的情况下运行和创建容器。
kaniko?是 Google 创建的开源容器镜像构建工具。
它不需要对主机进行特权访问即可生成容器映像。
Kaniko的工作原理,
如您所见,所有镜像构建操作都发生在 Kaniko 容器的用户空间内,并且不需要对主机进行任何特权访问。
Kaniko 支持以下类型的构建上下文。
对于这篇博客,我将使用 Github 存储库作为上下文。
此外,还可以推送到任何容器注册表。
为了演示 Kaniko 工作流,我将使用开源可用的工具,使用 Kaniko 在 Kubernetes 上构建 Docker 镜像。
这是你需要的
下图显示了我们将要构建的工作流。
我们必须为 kaniko pod 创建一个类型的?kubernetes 密钥,以验证 Docker hub 注册表并推送镜像。docker-registry
使用以下命令格式创建 docker 注册表密钥。替换以粗体标记的参数。
kubectl create secret docker-registry dockercred \
--docker-server=https://index.docker.io/v1/ \
--docker-username=<dockerhub-username> \
--docker-password=<dockerhub-password>\
--docker-email=<dockerhub-email>
此密钥被装载到 kaniko pod 中,以便它对 Docker 注册表进行身份验证以推送构建的镜像。
注意:如果您有自托管的 docker 注册表,则可以将服务器 URL 替换为 docker 注册表 API 端点。
现在,让我们使用 pod 部署来测试 kaniko 映像生成器。
我已将清单和 Dockerfile 托管在公共 GitHub 存储库中。这是一个带有说明的简单 Dockerfile。update
我将使用该存储库进行演示。您可以 fork?或使用类似的配置创建自己的存储库。
https://github.com/scriptcamp/kubernetes-kaniko
将以下清单另存为?pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: kaniko
spec:
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:latest
args:
- "--context=git://github.com/scriptcamp/kubernetes-kaniko"
- "--destination=<dockerhub-username>/kaniko-demo-image:1.0"
volumeMounts:
- name: kaniko-secret
mountPath: /kaniko/.docker
restartPolicy: Never
volumes:
- name: kaniko-secret
secret:
secretName: dockercred
items:
- key: .dockerconfigjson
path: config.json
GIT_USERNAME?
GIT_PASSWORD
<dockerhub-username>
bibinwilson/kaniko-test-image:1.0
所有其他配置保持不变。
现在部署 Pod。
kubectl apply -f pod.yaml
若要验证 docker 映像生成和推送,请检查 pod 日志。
kubectl logs kaniko --follow
注意:这里我们使用了一个静态的 pod 名称。所以要再次部署;首先,您必须删除 Kaniko Pod。当您将 kaniko 用于 CI/CD 管道时,Pod 会根据您使用的 CI 工具获取一个随机名称,并负责删除 Pod。
如果使用?Kubernetes 扩展 Jenkins 生成代理,则可以使用 Kaniko docker 生成 Pod 在 CI 管道中生成 docker 镜像。
若要将 Kaniko 用于生成管道,应将 Dockerfile 与应用程序一起使用。
此外,您应该将多容器 Pod 模板与 build 和 kaniko 容器一起使用。例如,用于 Java 构建的 maven 容器和 kaniko 容器使用存储库中存在的 Dockerfile 获取 jar 并构建 docker 映像。
这是一个基于多容器 pod 模板的 Jenkinsfile,您可以在其中构建应用程序并使用 kaniko 容器与应用程序一起构建 docker 镜像并将其推送到 Docker 注册表。
重要提示:?您应该在 pod 模板中使用带有 debug 标签的 kaniko 映像,因为我们将使用 bash 显式运行 kaniko 执行器。最新的标记图像没有 bash。
podTemplate(yaml: '''
apiVersion: v1
kind: Pod
spec:
containers:
- name: maven
image: maven:3.8.1-jdk-8
command:
- sleep
args:
- 99d
- name: kaniko
image: gcr.io/kaniko-project/executor:debug
command:
- sleep
args:
- 9999999
volumeMounts:
- name: kaniko-secret
mountPath: /kaniko/.docker
restartPolicy: Never
volumes:
- name: kaniko-secret
secret:
secretName: dockercred
items:
- key: .dockerconfigjson
path: config.json
''') {
node(POD_LABEL) {
stage('Get a Maven project') {
git url: 'https://github.com/scriptcamp/kubernetes-kaniko.git', branch: 'main'
container('maven') {
stage('Build a Maven project') {
sh '''
echo pwd
'''
}
}
}
stage('Build Java Image') {
container('kaniko') {
stage('Build a Go project') {
sh '''
/kaniko/executor --context `pwd` --destination bibinwilson/hello-kaniko:1.0
'''
}
}
}
}
}
您可以直接在流水线作业上使用上述 Jenkinsfile 并对其进行测试。它只是一个入门模板。您需要将存储库替换为代码存储库,并根据应用程序的需要编写生成逻辑。
使用 kaniko 构建 Docker 镜像是容器化 Docker 构建的安全方法。
您可以尝试在不影响安全性的情况下将 kaniko 整合到您的 pipline 中。