创建您的第一个 Knative 应用

Knative 是使用 Kubernetes 快速开始无服务器开发的好方法。
100 位读者喜欢这篇文章。
Working from home at a laptop

Opensource.com

Knative 是一个开源社区项目,它向 Kubernetes 添加组件,用于部署、运行和管理 无服务器、云原生 应用程序。它可以通过减少与 Kubernetes 基础设施的交互,提高开发效率。

关于 Knative、网络和无服务器部署有大量信息,本入门教程仅涵盖一小部分。在本演练中,我将使用 Knative 和 Minikube 来创建一个 Knative 应用——一个简单的容器,它会打印消息以响应 curl 命令或在 Web 浏览器中由部署提供的链接处显示。

首先,一些背景知识

Knative 使用自定义资源定义 (CRD)、网络层和服务核心。在本演练中,我使用了 Ubuntu 18.04、Kubernetes 1.19.0、Knative 0.17.2 和 Kourier 0.17.0 作为 Knative 网络层,以及 Knative 命令行界面 (CLI)。

CRD 是 Kubernetes 中的自定义资源定义。资源是 Kubernetes API 中的一个端点,用于存储特定类型的 API 对象集合;例如,内置的 pod 资源包含 pod 对象集合。这允许使用新的定义扩展 Kubernetes API。一个例子是 Knative 服务核心,它被定义为具有内部自动缩放功能,并可以快速部署具有预定义的正确角色和访问权限的 pod。

Kourier 是一个 Ingress(一种允许外部网络流量进入的服务),用于 Knative 服务,并且是 Istio ingress 的轻量级替代方案。它的部署仅包含一个 Envoy 代理和它的控制平面。

为了理解本教程中的概念,我建议您对以下内容有所了解:

  • 无服务器、云原生应用程序
  • 带有 Envoy 代理的 Ingress,即 Istio
  • Kubernetes 中的 DNS
  • Kubernetes 补丁配置
  • Kubernetes 中的自定义资源定义
  • 为 Kubernetes 配置 YAML 文件

设置和安装

在使用 Knative 之前,您必须执行一些先决条件。

配置 Minikube

在执行任何其他操作之前,您必须配置 Minikube 以在您的家庭实验室中本地运行 Knative。以下是我建议的配置和设置它们的命令:

$ minikube config set kubernetes-version v1.19.0
$ minikube config set memory 4000
$ minikube config set cpus 4

要确保这些配置在您的环境中正确设置,请运行 Minikube 命令以删除并启动您的集群

$ minikube delete
$ minikube start

安装 Knative CLI

您需要 Knative CLI 来进行部署,并且需要 Go v1.14 或更高版本才能使用 CLI。我创建了一个单独的目录,以便更容易找到和安装这些工具。使用以下命令来设置命令行:

$ mkdir knative
$ cd knative/
$ git clone https://github.com/knative/client.git
$ cd client/
$ hack/build.sh -f
$ sudo cp kn /usr/local/bin
$ kn version
Version:  	v20201018-local-40a84036
Build Date:   2020-10-18 20:00:37
Git Revision: 40a84036
Supported APIs:
* Serving
  - serving.knative.dev/v1 (knative-serving v0.18.0)
* Eventing
  - sources.knative.dev/v1alpha2 (knative-eventing v0.18.0)
  - eventing.knative.dev/v1beta1 (knative-eventing v0.18.0)

安装 CLI 后,您可以在 Minikube 集群中配置 Knative。

安装 Knative

由于 Knative 由 CRD 组成,因此其大部分安装都使用带有 kubectl 命令的 YAML 文件。为了简化此操作,请在终端中设置一些环境变量,以便您可以更快地获取所需的 YAML 文件并使用相同的版本:

$ export KNATIVE="0.17.2"

首先,应用服务资源定义

$ kubectl apply -f https://github.com/knative/serving/releases/download/v$KNATIVE/serving-crds.yaml

然后将核心组件应用于 Knative

$ kubectl apply -f https://github.com/knative/serving/releases/download/v$KNATIVE/serving-core.yaml

这会将服务和部署部署到 knative-serving 命名空间。您可能需要等待一段时间才能完成部署。

要确认部署完成,请运行 kubectl 命令以从命名空间获取部署

$ kubectl get deployments -n knative-serving
NAME                 	READY   UP-TO-DATE   AVAILABLE   AGE
3scale-kourier-control   1/1 	1        	1       	107m
activator            	1/1 	1        	1       	108m
autoscaler           	1/1 	1        	1       	108m
controller           	1/1 	1        	1       	108m
webhook              	1/1 	1        	1       	108m

安装 Kourier

因为您要使用特定版本并收集正确的 YAML 文件,所以请使用另一个环境变量

$ export KOURIER="0.17.0"

然后应用您的网络层 YAML 文件

$ kubectl apply -f https://github.com/knative/net-kourier/releases/download/v$KOURIER/kourier.yaml

您将在 kourier-system 命名空间中找到部署。要确认部署已正确启动并运行,请使用 kubectl 命令获取部署

$ kubectl get deployments -n kourier-system
NAME                 	READY   UP-TO-DATE   AVAILABLE   AGE
3scale-kourier-gateway   1/1 	1        	1       	110m

接下来,配置 Knative 服务以使用 Kourier 作为默认值。如果您不设置此项,则外部网络流量将无法运行。使用此 kubectl patch 命令设置它

$ kubectl patch configmap/config-network \
  --namespace knative-serving \
  --type merge \
  --patch '{"data":{"ingress.class":"kourier.ingress.networking.knative.dev"}}'

配置 DNS

在访问负载均衡器之前,您需要在单独的终端窗口中运行 minikube tunnel 命令。此命令创建到以 LoadBalancer 类型部署的服务的路由,并将其 Ingress 设置为其 ClusterIP。如果没有此命令,您将永远无法从负载均衡器获得 External-IP。您的输出将如下所示

Status:    
    machine: minikube
    pid: 57123
    route: 10.96.0.0/12 -> 192.168.39.67
    minikube: Running
    services: [kourier]
	errors:
   	 minikube: no errors
   	 router: no errors
   	 loadbalancer emulator: no errors
Status:    
    machine: minikube
    pid: 57123
    route: 10.96.0.0/12 -> 192.168.39.67
    minikube: Running
    services: [kourier]
	errors:
   	 minikube: no errors
   	 router: no errors
   	 loadbalancer emulator: no errors

现在服务和部署已完成,请配置集群的 DNS。这使您未来可部署的应用程序能够支持 DNS 网址。要配置此项,您需要使用 kubectl get 命令从 Kourier 服务获取一些信息

$ kubectl get service kourier -n kourier-system 
NAME  	TYPE       	CLUSTER-IP   	EXTERNAL-IP  	PORT(S)                  	
kourier   LoadBalancer   10.103.12.15   10.103.12.15   80:32676/TCP,443:30558/TCP 

获取 CLUSTER-IP 地址并将其保存以供下一步使用。接下来,配置域以确定您在本地 DNS 上的内部网站。(我在 nip.io 中结束了我的,您也可以使用 xip.io。)这需要另一个 kubectl patch 命令

$ kubectl patch configmap -n knative-serving config-domain -p "{\"data\": {\"10.103.12.15.nip.io\": \"\"}}"

修补后,您将看到此输出

configmap/config-domain patched

使用 Knative CLI

现在您的配置已完成,您可以创建一个示例应用程序来看看会发生什么。

部署服务

在本演练的前面,您安装了 Knative CLI,它用于 Kubernetes 集群中的 Serving 和 Eventing 资源。这意味着您可以部署示例应用程序并管理服务和路由。要调出命令行菜单,请键入 kn。这是一个输出片段

$ kn
kn is the command line interface for managing Knative Serving and Eventing resources

 Find more information about Knative at: https://knative.k8s.ac.cn

Serving Commands:
  service  	Manage Knative services
  revision 	Manage service revisions
  route    	List and describe service routes

接下来,使用 Knative CLI 部署一个带有 Web 前端的基本“hello world”应用程序。Knative 提供了一些您可以使用的示例;这个示例执行基本部署

kn service create hello --image gcr.io/knative-samples/helloworld-go

您的输出应如下所示

$ kn service create hello --image gcr.io/knative-samples/helloworld-go
Creating service 'hello' in namespace 'default':

  0.032s The Configuration is still working to reflect the latest desired specification.
  0.071s The Route is still working to reflect the latest desired specification.
  0.116s Configuration "hello" is waiting for a Revision to become ready.
 34.908s ...
 34.961s Ingress has not yet been reconciled.
 35.020s unsuccessfully observed a new generation
 35.208s Ready to serve.

Service 'hello' created to latest revision 'hello-dydlw-1' is available at URL:
http://hello.default.10.103.12.15.nip.io

这表明该服务已部署到命名空间 default 中的 URL。您可以通过运行以下命令来部署到另一个命名空间,然后查看输出

$ kn service create hello --image gcr.io/knative-samples/helloworld-go --namespace hello
Creating service 'hello' in namespace 'hello':

  0.015s The Configuration is still working to reflect the latest desired specification.
  0.041s The Route is still working to reflect the latest desired specification.
  0.070s Configuration "hello" is waiting for a Revision to become ready.
  5.911s ...
  5.958s Ingress has not yet been reconciled.
  6.043s unsuccessfully observed a new generation
  6.213s Ready to serve.

Service 'hello' created to latest revision 'hello-wpbwj-1' is available at URL:
http://hello.hello.10.103.12.15.nip.io

测试您的新部署

检查您部署的新服务是否已启动并运行。有两种方法可以检查

  1. 在浏览器中检查您的网址
  2. 运行 curl 命令以查看返回的内容

如果您在 Web 浏览器中检查地址,您应该会看到如下内容

很好!看起来您的应用程序的前端已启动!

接下来,测试 curl 命令以确认一切都可以从命令行运行。这是一个 curl 到我的应用程序的示例以及输出

$ curl http://hello.default.10.103.12.15.nip.io
Hello World!

与 Knative 应用交互

从这里,您可以使用 Knative CLI 进行一些基本更改并测试功能。描述服务并检查输出

$ kn service describe hello
Name:   	hello
Namespace:  default
Age:    	12h
URL:    	http://hello.default.10.103.12.15.nip.io

Revisions:  
  100%  @latest (hello-dydlw-1) [1] (12h)
    	Image:  gcr.io/knative-samples/helloworld-go (pinned to 5ea96b)

Conditions:  
  OK TYPE               	AGE REASON
  ++ Ready              	12h
  ++ ConfigurationsReady	12h
  ++ RoutesReady        	12h

看起来一切都已启动并准备就绪,就像您配置的那样。您可以使用 Knative CLI 执行的其他一些操作(由于此示例中的最小配置,现在不会显示)是用该应用描述和列出路由

$ kn route describe hello
Name:   	hello
Namespace:  default
Age:    	12h
URL:    	http://hello.default.10.103.12.15.nip.io
Service:	hello

Traffic Targets:  
  100%  @latest (hello-dydlw-1)

Conditions:  
  OK TYPE                  	AGE REASON
  ++ Ready                 	12h
  ++ AllTrafficAssigned    	12h
  ++ CertificateProvisioned	12h TLSNotEnabled
  ++ IngressReady          	12h
jess@Athena:~/knative/client$ kn route list hello
NAME	URL                                    	READY
hello   http://hello.default.10.103.12.15.nip.io   True

当您需要排除部署问题时,这可能会派上用场。

清理

就像您部署应用程序一样容易,您可以清理它

$ kn service delete hello
Service 'hello' successfully deleted in namespace 'default'.

jess@Athena:~/knative/client$ kn service delete hello --namespace hello
Service 'hello' successfully deleted in namespace 'hello'.

创建您自己的应用

本演练使用了现有的 Knative 示例,但您可能想知道如何制作您想要的东西。您是对的,所以我将提供此示例 YAML,然后解释如何使用 kubectl 应用它并使用 Knative CLI 管理它。

示例 YAML

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld
  namespace: default
spec:
 template:
  spec:
   containers:
     - image: gcr.io/knative-samples/helloworld-go
       ports: 
             - containerPort: 8080
       env:
    	- name: TARGET
      	  value: "This is my app"

将此保存到 apps.yaml,然后您可以对某些内容进行更改。 例如,您可以更改您的 metadatanamenamespace。您还可以更改目标的值(我将其设置为 This is my app),以便在您部署文件时,您将看到一条新消息,显示 Hello ${TARGET} ! 而不是 Hello World

要部署这样的文件,您必须使用 kubectl apply -f apps.yaml

首先,使用 apply 命令部署您的新服务

$ kubectl apply -f apps.yaml
service.serving.knative.dev/helloworld created

接下来,您可以描述您的新部署,这是 YAML 文件中提供的名称

$ kn service describe helloworld
Name:   	helloworld
Namespace:  default
Age:    	50s
URL:    	http://helloworld.default.10.103.12.15.nip.io

Revisions:  
  100%  @latest (helloworld-qfr9s) [1] (50s)
    	Image:  gcr.io/knative-samples/helloworld-go (at 5ea96b)

Conditions:  
  OK TYPE               	AGE REASON
  ++ Ready              	43s
  ++ ConfigurationsReady	43s
  ++ RoutesReady        	43s

运行 curl 命令以确认它会产生您在 YAML 文件中定义的新输出

$ curl  http://helloworld.default.10.103.12.15.nip.io
Hello This is my app!

通过转到简单的 Web 前端进行双重检查。

这证明您的应用程序正在运行!恭喜!

最后的想法

Knative 是一种让开发人员能够使用网络服务快速进行无服务器开发的好方法,该服务使用户能够立即看到应用程序中的更改。它可以很有趣地玩,并让您更深入地了解无服务器以及 Kubernetes 的其他探索性用途!

接下来阅读什么
User profile image.
科技游牧者,从事我能找到的几乎所有工作。 IT 领域孤岛预防的倡导者,信息与所有团队共享的重要性。 坚信教育所有人并进行开源开发。 热爱所有科技。 专注于 K8s、混沌以及任何我能找到的新鲜事物! Mastodon ID

评论已关闭。

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.