尝试使用Knative建立一个应用

18-08-20 banq
              

本文使用Knative构建一个应用的尝试:

Knative有一些非常有趣的功能:应用可伸缩到零,可从源代码直接构建到容器、事件和路由策略,看起来非常有前景。

了解Knative

Knative是利用Kubernetes提供的一种称为自定义资源定义(CRD)的扩展技术,我们可以定义自己对象并通过Kubernetes API访问它们。

与Knative所有交互是通过kubectl,Kubernetes官方的CLI。kubectl用于在Kubernetes API中创建,更新或删除资源,Knative对这些资源中的更改(例如启动容器)做出反应并确保系统随时间的一致性。

Knative定义了不同的CRD,但最接近应用的概念是“服务”。


一个“服务”是由Knative的“路径”和“配置”组成。默认情况下,会创建一个让你的应用可访问的路由,因此我们可以直接关注“配置”。

一个“配置”资源包含了“构建”和“修订”。一个“构建”定义了一系列关于如何构建应用的步骤,但不用担心,有叫第二资源BuildTemplate的东东,它提供了根据不同的用例如何定义这些步骤的模板。最后,“修订”指定了运行应用的配置,其中包含用于容器的Docker镜像等字段。

为应用定义服务

为了定义一个从源代码构建和部署应用所需的最小配置,我们必须遵循以下步骤:

1. 选择适合你的用例的构建模板BuildTemplate,并将其应用于Kube群集。在我的例子中,我选择了Buildpack模板,因为它能够自动检测并安装我的应用程序的任何依赖项。

$ kubectl apply -f https://raw.githubusercontent.com/knative/build-templates/master/buildpack/buildpack.yaml

2. Knative需要将应用程序上传到Docker Registry,因此我们需要有一个注册器,为了简单起见,我决定使用Docker Hub。

3.要让Knative推送镜像,我们需要定义ServiceAccount用户名和密码才能使用Docker Hub,并在集群中配置它们:

---
apiVersion: v1
kind: Secret
metadata:
  name: basic-user-pass
  annotations:
    build.knative.dev/docker-0: https://index.docker.io
type: kubernetes.io/basic-auth
stringData:
  username: jszroberto
  password: <REMOVED>

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-bot
secrets:
- name: basic-user-pass
<p>

$ kubectl apply -f serviceaccount.yml

4.我们现在可以定义服务:

---
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
  name: buildpack-example
  namespace: default
spec:
  runLatest:
    configuration:
      build:
        serviceAccountName: build-bot # ServiceAccount with the authentication for Docker Hub
        source:
          git:
            url: https://github.com/jszroberto/helloworld-go
            revision: master
        template:
          name: buildpack
          arguments:
          - name: IMAGE
            value: jszroberto/buildpack-example # Published Docker image to Docker Hub
      revisionTemplate:
        metadata:
          labels:
            knative.dev/type: app
        spec:
          container:
            image: jszroberto/buildpack-example # Used Docker image to run the app
<p>

5.使用服务配置部署应用:

$ kubectl apply -f service.yml

6.构建和部署应用程序需要几分钟,只需等待pod运行:

$ kubectl -n default get pods

7.所有应用程序的流量都通过knative-ingressgateway。要在群集中获取其IP,请使用以下命令。如果你的群集是新的,则服务可能需要一些时间才能获得外部IP地址:

export IP_ADDRESS = $(kubectl get svc knative-ingressgateway -n istio-system -o'jsonpath = {.status.loadBalancer.ingress [0] .ip}')
<p>

8.要查找服务的URL,请键入:

export HOST_URL = $(kubectl get services.serving.knative.dev buildpack-example -o jsonpath ='{。status.domain}')
<p>

最后,我们可以用curl访问应用程序:

curl -H "Host: ${HOST_URL}" http://${IP_ADDRESS}
Hello World: Go Sample v1!
<p>

综上所述

简而言之,我们必须了解Knative使用自定义资源定义(CRD)来扩展Kubernetes API以及如何定义这些资源,这样我们的应用程序才得以构建和部署。我们使用kubectl 实现与Knative交互并配置资源。此外,我们必须以我们可以将映像拉推到Docker Hub的方式来配置Kubernetes。

让我们退后一步,考虑一下这对开发人员来说意味着什么,Knative能够构建并运行我们的应用程序,但我们必须熟悉许多新概念(例如CRD,构建,构建模板,配置,修订,服务,安全,服务帐户,Docker注册表,Istio Ingress,路由,kubectl,等等)。在我看来,开发人员必须尽可能地专注于代码。代码的运行位置和方式无关紧要,必须学习所有这些新概念会使事情变得更加复杂,并可能会使你远离代码,感觉Knative缺少一种更直接的方式来在云中部署应用程序。

Running my first application on Knative – Roberto

[该贴被banq于2018-08-21 09:27修改过]

              

1