前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在K8s群集中构建容器映像

在K8s群集中构建容器映像

作者头像
February
修改2018-11-05 15:17:51
1.8K0
修改2018-11-05 15:17:51
举报
文章被收录于专栏:技术翻译技术翻译

了解如何从Kubernetes集群内的Dockerfile构建容器映像源,并将映像推送到IBM Cloud Container Registry; 所有这一切都使用谷歌的Kaniko工具。

那么,Kaniko是什么?

Kaniko是一个从容器或Kubernetes集群内的Dockerfile构建容器映像的工具。

如果您还没有安装Knative和Istio的Kubernetes集群,建议您按照我之前的帖子中提到的说明,他还向您介绍了Knative的组件 -  使用Istio安装Knative并在IBM Cloud上部署应用程序

本教程使用Knative 的BuildServing组件来编排端到端部署。

Knative 构建扩展了Kubernetes并利用现有的Kubernetes原语为您提供从源代码运行群集上容器构建的能力。例如,您可以编写一个构建,该构建使用Kubernetes本机资源从存储库中获取源代码,将其构建到容器中,然后运行该映像。

Knative Serving以Kubernetes和Istio为基础,支持无服务器应用程序和功能的部署和服务。服务很容易上手和扩展以支持高级方案。

什么是构建模板?

BuildTemplate是Knative构建的关键特性之一,用于定义可重用模板,并使用一些有限的参数化功能封装可共享构建过程。build-templates回购中提供了一组策划和支持的构建模板。我们将在教程中使用Kaniko BuildTemplate。

Kaniko不依赖于Docker守护程序,并且在用户空间中完全执行Dockerfile中的每个命令。这样可以在无法轻松或安全地运行Docker守护程序的环境中构建容器映像,例如标准Kubernetes集群。

让我们首先创建一个Kaniko BuildTemplate并将其另存为 kaniko.yaml

代码语言:javascript
复制
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模板和脚本的示例,请克隆此存储库

代码语言:javascript
复制
git clone https://github.com/VidyasagarMSC/knative-deploy

并参考 Kaniko文件夹。

Kaniko构建一个图像并将其推送到定义为参数的目标。为了正确地对远程容器注册表(IBM Cloud Container Registry)进行身份验证,构建需要具有适当的凭据。这是使用ServiceAccount构建实现的。

在此之前,让我们定义一个Secret,它包含构建用于对IBM Cloud Container Registry进行身份验证(基本)的用户名和密码:

代码语言:javascript
复制
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>,运行以下命令

代码语言:javascript
复制
$ 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文件,如下所示:

代码语言:javascript
复制
apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-bot
secrets:
- name: basic-user-pass

让我们在我们的Build中使用ServiceAccount并保存文件为build.yaml

代码语言:javascript
复制
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>

执行构建

代码语言:javascript
复制
$ 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)。

对于日志,请运行此命令

代码语言:javascript
复制
$ kubectl logs kanika-build-XXXXX -c build-step-build-and-push

如果一切都按预期运行,您应该在运行以下命令时看到列表中的图像:

代码语言:javascript
复制
$ ibmcloud cr images

恭喜!你刚刚创建了一个没有Docker Daemon的容器图像。让我们部署并提供应用程序,以便我们可以从任何地方访问它。为此,让我们创建一个service.yaml文件:

代码语言:javascript
复制
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"

执行服务:

代码语言:javascript
复制
$ kubectl apply --filename  service .yaml

要查找服务的IP地址,请使用kubectl get svc knative-ingressgateway -n istio-system来获取群集的入口IP。如果您的群集是新的,则可能需要一些时间为服务分配外部IP地址。

代码语言:javascript
复制
$ 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}':

代码语言:javascript
复制
$ export  HOST_URL = $(kubectl get services.serving.knative.dev knative-node-kaniko --output jsonpath ='{。status.domain}')

现在,您可以向应用发出请求以查看结果。

代码语言:javascript
复制
$ curl -H "Host: ${HOST_URL}" http://${IP_ADDRESS}
Response: Kaniko Node App running on IBM Cloud$ curl  -H  “主持人:$ {HOST_URL} ” http:// $ {IP_ADDRESS}

清理

运行以下命令从群集中删除示例应用程序:

代码语言:javascript
复制
$ kubectl delete --filename  service .yaml

删除其他的secret,ServiceAccount and Build:

代码语言:javascript
复制
$ kubectl delete --filename build.yaml
$ kubectl delete --filename serviceaccount.yaml
$ kubectl delete --filename secret.yaml
$ kubectl delete --filename kaniko.yaml

要删除群集(删除所有内容),请输入以下命令:

代码语言:javascript
复制
$  ibmcloud  cs  cluster - rm  $ CLUSTER_NAME

原文标题《Build a Container Image Inside a K8s Cluster》

作者: Vidyasagar Machupalli

译者:February

不代表云加社区观点,更多详情请查看原文链接

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 那么,Kaniko是什么?
    • 什么是构建模板?
      • 参数
      • 清理
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档