Knative Serving Hello World
一个 Go 语言编写的极简 web 应用,用于测试。它读取环境变量 TARGET
并打印 Hello ${TARGET}!
。如果未指定 TARGET
,将 TARGET
内容替换为 World
。
可以按照下面的步骤创建示例代码,然后将应用程序部署到集群。也可以直接运行以下命令下载示例的代码:
|
|
开始前
重新创建示例代码
- 创建一个名为
helloworld.go
的新文件,然后粘贴以下代码。这段代码创建了一个监听 8080 端口上的 web 服务:
|
|
- 在项目的目录中,创建一个名为
Dockerfile
的文件,并将下面的代码复制到其中。有关对 Go 应用进行容器化的详细说明,请参见使用 Docker 部署 Go 服务。
|
|
- 创建一个新文件
service.yaml
,并将以下 service 定义复制到该文件中。请确保将{username}
替换为你的 Docker Hub 用户名。
|
|
- 使用 go tool 创建
go.mod
manifest。
|
|
构建示例并部署
重新创建示例代码文件(或使用 sample 文件夹中的文件)后,就可以构建和部署示例应用了。
- 使用 Docker 将示例代码构建为容器镜像。运行以下命令构建并推送到 Docker Hub,用你的 Docker Hub 用户名替换
{username}
:
|
|
- 构建完成并将镜像推送到 Docker Hub 之后,可以将应用部署到集群中。确保
service.yaml
中的容器镜像与上一步中构建镜像内容一致。使用kubectl
应用配置:
|
|
-
现在你的服务已经创建,Knative 将执行以下步骤:
- 为此版本的应用程序创建一个新的不可变版本。
- 为应用创建路由(route)、入口(ingress)、服务(service)和负载均衡(load balance)的网络编程。
- 自动缩放你的Pod(包括活动的 Pod 为零)。
-
运行以下命令来找到 service 的域名 URL: 返回集群的 ingress IP。如果只是创建集群,则可能需要等待并重新运行命令,直到为 service 分配了外部 IP 地址。
1 2 3 4 5 6 7 8 9 10 11
# In Knative 0.2.x and prior versions, the `knative-ingressgateway` service was used instead of `istio-ingressgateway`. INGRESSGATEWAY=knative-ingressgateway # The use of `knative-ingressgateway` is deprecated in Knative v0.3.x. # Use `istio-ingressgateway` instead, since `knative-ingressgateway` # will be removed in Knative v0.4. if kubectl get configmap config-istio -n knative-serving &> /dev/null; then INGRESSGATEWAY=istio-ingressgateway fi kubectl get svc $INGRESSGATEWAY --namespace istio-system
示例:
1 2
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE xxxxxxx-ingressgateway LoadBalancer 10.23.247.74 35.203.155.229 80:32380/TCP,443:32390/TCP,32400:32400/TCP 2d
-
运行以下命令来找到 service 的域名 URL:
|
|
示例:
|
|
-
通过发送请求来测试应用。将以下
curl
命令与在上一个域中获取的域 URLhelloworld-go.default.example.com
和EXTERNAL-IP
地址一起使用脚步:1
curl -H "Host: helloworld-go.default.example.com" http://{EXTERNAL_IP_ADDRESS}
示例:
1 2
curl -H "Host: helloworld-go.default.example.com" http://35.203.155.229 Hello Go Sample v1!
注意:如果
curl
命令失败,请添加-v
选项以获取更多详细信息。
移除示例应用的 Deployment
要从集群中删除示例应用,请删除 service 记录:
|
|
排错
执行 curl 命令与预期不符
检查 isito ingressgateway 是否为 pending 状态,如果是有 2 种方法,给设置个外部 IP 或者 NodePort 方式访问。