尝试使用Knative建立一个应用

本文使用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

$ 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

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}')

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


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

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


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

综上所述
简而言之,我们必须了解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修改过]