了解如何从Kubernetes集群内的Dockerfile构建容器映像源,并将映像推送到IBM Cloud Container Registry; 所有这一切都使用谷歌的Kaniko工具。
Kaniko是一个从容器或Kubernetes集群内的Dockerfile构建容器映像的工具。
如果您还没有安装Knative和Istio的Kubernetes集群,建议您按照我之前的帖子中提到的说明,他还向您介绍了Knative的组件 - 使用Istio安装Knative并在IBM Cloud上部署应用程序
本教程使用Knative 的Build和Serving组件来编排端到端部署。
Knative 构建扩展了Kubernetes并利用现有的Kubernetes原语为您提供从源代码运行群集上容器构建的能力。例如,您可以编写一个构建,该构建使用Kubernetes本机资源从存储库中获取源代码,将其构建到容器中,然后运行该映像。
Knative Serving以Kubernetes和Istio为基础,支持无服务器应用程序和功能的部署和服务。服务很容易上手和扩展以支持高级方案。
BuildTemplate
是Knative构建的关键特性之一,用于定义可重用模板,并使用一些有限的参数化功能封装可共享构建过程。build-templates
回购中提供了一组策划和支持的构建模板。我们将在教程中使用Kaniko BuildTemplate。
Kaniko不依赖于Docker守护程序,并且在用户空间中完全执行Dockerfile中的每个命令。这样可以在无法轻松或安全地运行Docker守护程序的环境中构建容器映像,例如标准Kubernetes集群。
让我们首先创建一个Kaniko BuildTemplate并将其另存为 kaniko.yaml
apiVersion: build.knative.dev/v1alpha1
kind: BuildTemplate
metadata:
name: kaniko
spec:
parameters:
- name: IMAGE
description: registry.<region>.bluemix.net/<namespace>/knative-node-kaniko #replace <region> and <namespace>
- name: DOCKERFILE
description: ./Dockerfile
default: /workspace/Dockerfile
steps:
- name: build-and-push
image: gcr.io/kaniko-project/executor
args:
- --dockerfile=${DOCKERFILE}
- --destination=${IMAGE}apiVersion : build.knative.dev/v1alpha1
IMAGE
:要应用于新构建的图像的Docker镜像名称。使用适当的值替换<region>
和<namespace>
。请记住这些值,因为您必须在YAML下面的脚本中替换这些值。DOCKERFILE
:要执行的到Dockerfile
的路径(默认值 :./Dockerfile
) 。*注意:要检查您的区域,运行ibmcloud cr region并设置新的命名空间,请参阅此链接*
如果您正在寻找具有Dockerfile,YAML模板和脚本的示例,请克隆此存储库
git clone https://github.com/VidyasagarMSC/knative-deploy
并参考 Kaniko文件夹。
Kaniko构建一个图像并将其推送到定义为参数的目标。为了正确地对远程容器注册表(IBM Cloud Container Registry)进行身份验证,构建需要具有适当的凭据。这是使用ServiceAccount
构建实现的。
在此之前,让我们定义一个Secret
,它包含构建用于对IBM Cloud Container Registry进行身份验证(基本)的用户名和密码:
apiVersion: v1
kind: Secret
metadata:
name: basic-user-pass
annotations:
build.knative.dev/docker-0: registry.<region>.bluemix.net # replace the <region>
type: kubernetes.io/basic-auth
stringData:
username: token # username
password: <password> # token-value
对于<password>
,运行以下命令
$ ibmcloud cr token-add --description “This is a token” --non-expiring --readwrite
Returns:
Token identifier 58669dd6–3ddd-5c78–99f9-ad0a5aabd9ad
Token <token_value>
使用返回的
token_value
作为密码并将文件另存为secret.yaml
。有关令牌的更多详细信息,请参阅 此链接
现在您可以使用秘密用 ServiceAccount
创建一个serviceaccount.yaml
文件,如下所示:
apiVersion: v1
kind: ServiceAccount
metadata:
name: build-bot
secrets:
- name: basic-user-pass
让我们在我们的Build
中使用ServiceAccount
并保存文件为build.yaml
apiVersion: build.knative.dev/v1alpha1
kind: Build
metadata:
name: kaniko-build
spec:
serviceAccountName: build-bot
source:
git:
url: https://github.com/VidyasagarMSC/knative-deploy # source code from GitHub
revision: master
template:
name: kaniko
arguments:
- name: IMAGE
value: registry.<region>.bluemix.net/<namespace>/knative-node-kaniko # replace <region> and <namespace>
执行构建
$ kubectl apply --filename kaniko.yaml
$ kubectl apply --filename secret.yaml
$ kubectl apply --filename serviceaccount.yaml
$ kubectl apply --filename build.yaml
构建应该已经开始了。让我们来看看。
运行kubectl get pods
时,您应该看到一个名为kaniko-build
的pod ,有后缀(比如说XXXXX)。
对于日志,请运行此命令
$ kubectl logs kanika-build-XXXXX -c build-step-build-and-push
如果一切都按预期运行,您应该在运行以下命令时看到列表中的图像:
$ ibmcloud cr images
恭喜!你刚刚创建了一个没有Docker Daemon的容器图像。让我们部署并提供应用程序,以便我们可以从任何地方访问它。为此,让我们创建一个service.yaml
文件:
apiVersion: serving.knative.dev/v1alpha1 # Current version of Knative
kind: Service
metadata:
name: knative-node-kaniko # The name of the app
namespace: default # The namespace the app will use
spec:
runLatest:
configuration:
revisionTemplate:
spec:
container:
image: registry.<region>.bluemix.net/<namespace>/knative-node-kaniko # The URL to the image of the app on IBMCLOUD Registry
env:
- name: TARGET # The environment variable printed out by the sample app
value: "Kaniko Node App running on IBM Cloud"
执行服务:
$ kubectl apply --filename service .yaml
要查找服务的IP地址,请使用kubectl get svc knative-ingressgateway -n istio-system
来获取群集的入口IP。如果您的群集是新的,则可能需要一些时间为服务分配外部IP地址。
$ export IP_ADDRESS = $(kubectl get svc knative-ingressgateway --namespace istio-system --output'jsonpath = {.status.loadBalancer.ingress [0] .ip}')
要查找服务的URL,请使用kubectl get services.serving.knative.dev knative-node-app --output jsonpath='{.status.domain}'
:
$ export HOST_URL = $(kubectl get services.serving.knative.dev knative-node-kaniko --output jsonpath ='{。status.domain}')
现在,您可以向应用发出请求以查看结果。
$ curl -H "Host: ${HOST_URL}" http://${IP_ADDRESS}
Response: Kaniko Node App running on IBM Cloud$ curl -H “主持人:$ {HOST_URL} ” http:// $ {IP_ADDRESS}
运行以下命令从群集中删除示例应用程序:
$ kubectl delete --filename service .yaml
删除其他的secret,ServiceAccount and Build
:
$ kubectl delete --filename build.yaml
$ kubectl delete --filename serviceaccount.yaml
$ kubectl delete --filename secret.yaml
$ kubectl delete --filename kaniko.yaml
要删除群集(删除所有内容),请输入以下命令:
$ ibmcloud cs cluster - rm $ CLUSTER_NAME
原文标题《Build a Container Image Inside a K8s Cluster》
译者:February
不代表云加社区观点,更多详情请查看原文链接
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系外文翻译,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。