在K8s群集中构建容器映像

了解如何从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

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》

作者: Vidyasagar Machupalli

译者:February

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

原文链接:https://dzone.com/articles/build-a-container-image-inside-a-k8s-cluster

原文作者:Vidyasagar Machupalli

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

Ubuntu18.04下VMware or VirtualBox 虚拟化的问题

This host supports Intel VT-x, but Intel VT-x is disabled. Intel VT-x might be d...

2064
来自专栏散尽浮华

记录一次redis cluster集群故障-运维笔记

公司的一个系统业务出现故障,提示查询redis失败。查询相关日志,分析过程记录如下:

4815
来自专栏大魏分享(微信公众号:david-share)

隆重介绍!CI/CD手下的开源界六大金刚

Jenkins 2 image based on Red Hat Enterprise Linux的镜像

4863
来自专栏bboysoul

记载一次删除mysql的默认数据库mysql的过程

今天终于尝到了什么叫删库跑路,妈的真的悲剧,早上想在树莓派里安装个wordpress,想放点街舞视频给大家分享一下,突然发现数据库里面还有一个以前的论坛数据库,...

873
来自专栏从零学习云计算

kubernetes学习记录(10)——建立Heapster+Influxdb+Grafana集群性能监控平台

采用的是Heapster+Influxdb+Grafana建立集群性能监控平台。 据说Heapster需要与Kubernetes Master进行安全连接,所以...

4870
来自专栏乱炖

国内主机安装kubenetes1.9.0

链接:https://pan.baidu.com/s/1kjhCqh5DlcBHkqRyHOx8oQ 密码:9dma

3278
来自专栏瓜大三哥

tensorflow版本安装

我是在Anaconda里安装tensorflow的,安装命令可以在控制台输入: pip install tensorflow 卸载命令: pip uninsta...

2818
来自专栏Jerry的SAP技术分享

最简单的dockerfile使用教程 - 创建一个支持SSL的Nginx镜像

什么是dockerfile?简单的说就是一个文本格式的脚本文件,其内包含了一条条的指令(Instruction),每一条指令负责描述镜像的当前层(Layer)如...

1270
来自专栏搜云库

可能是最详细的部署:Docker Registry企业级私有镜像仓库Harbor管理WEB UI

上一篇文章搭建了一个具有基础功能,权限认证、TLS 的私有仓库,但是Docker Registry 作为镜像仓库,连管理界面都没有,甚至连一些运维必备的功能都是...

6638

了解微服务,第6部分:健康检查

随着我们的微服务和它们运营的环境变得越来越复杂,让我们的服务为Docker Swarm提供一种安全检查机制也变得日益重要。因此,我们将在博客系列的第六部分中介绍...

8173

扫码关注云+社区

领取腾讯云代金券