Knative 入门系列5:Knative 安装
Knative 是一个基于 Kubernetes 的,用于构建、部署和管理现代 serverless 应用的平台。Getting Started with Knative 是一本由 Pivotal 公司赞助 O’Reilly 出品的电子书,公众号后台回复“knative”获取英文版下载地址。本书中文版由 ServiceMesher 社区自发翻译系列文章,这是该系列的第5章。
在开始使用 Knative 构建和托管工作负载前,你需要安装它。你还应该运行一些命令来验证它是否正常运行并按预期工作。本章将介绍从 Mac 或 Linux shell 安装和验证 Knative 的必要步骤。
建立一个 Knative 集群
首先,你需要已经有一个 Kubernetes 集群。Knative 要求 Kubernetes 的版本在1.11以上。你必须在集群上启用 MutatingAdmissionWebhook admission controller。为了简单,你可以在本地机器上使用 Minikube 或者在云上运行集群。
为什么我们需要安装 Istio
迄今为止,我们还没讨论过 Istio,但是它作为安装的一部分出现了。Istio 是什么?Knative 为什么需要它?
Istio 是一个服务网络。它在 Kubernetes 之上提供了很多特性,包括流量管理、网络策略执行和可观察性。我们不认为 Istio 是 Knative 的组件,而是它的依赖项之一,就像 Kubernetes 一样。所以 Knative 最终使用 Istio 运行在 Kubernetes 集群之上。
本报告的目的不是详细说明 Istio 的内部工作。在这一章中,我们将介绍 Istio 与 Knative 一起使用时要用到的关于 Istio 的所有知识。如果你想了解更多,可以从 What is Istio? 以及 Istio documentation 开始。
须知
建立 Kubernetes 集群有许多选择。决定使用哪种工具取决于您的需求和提供者对特定工具集的熟悉程度。在 GitHub 中参考 Knative’s installation documentation 以获得特定提供者的指令。
在您的本地机器上,请确保您已经安装了 kubectl v1.11或更高版本。将上下文设置指向 Knative 设置的集群。您将使用 kubectl 以 YAML 文件的形式应用于所有的 crd。
集群建立之后,使用以下两个命令设置 Istio:
kubectl apply --filename https://storage.googleapis.com/knative-releases/serving/latest/istio.yaml
kubectl label namespace default istio-injection=enabled
第一个命令将所有必需的 Istio 对象导入集群。第二个命令在 default 命名空间中启用 Istio 自动注入。这可以确保 Istio 在 default 命名空间中为每个 Pod 创建时自动注入边车(sidecar)。(你会注意到所有 Pod 至少都有两个容器。一个是用户的容器;一个是 istio-proxy。) Knative 依赖于 Istio 组件。使用以下命令验证 Istio 安装,直到所有 Pod 显示为运行或完成:
kubectl get pods -n istio-system --watch
现在您已经使用 Istio 运行了集群,可以开始安装 Knative。使用 kubectl 命令安装 Knative 的核心组件 Serving 和 Build。YAML 声明文件可以从 Google Storage 或 GitHub 获取。您可以使用特定的版本或使用最新的 release 版本。下面的命令将从 Google Storage 中获取最新的版本:
kubectl apply --filename https://storage.googleapis.com/knative-releases/serving/latest/release.yaml
kubectl apply --filename https://storage.googleapis.com/knative-releases/build/latest/release.yaml
再次验证这些对象是否正确导入。使用以下命令监视它们,直到所有 Pod 显示为运行:
kubectl get pods --namespace knative-serving --watch
kubectl get pods --namespace knative-build --watch
小贴士:轻量安装
如果您正在本地机器上安装 Knative 或刚刚开始安装,您可能希望在不使用内置监控(在 monitoring 命名空间下)组件的情况下安装 Knative。在这种情况下,您可以使用以下命令来安装服务:
kubectl apply --filename https://storage.googleapis.com/knative-releases/serving/latest/release-no-mon.yaml
这避免了在 monitoring 命名空间中安装任何组件。想要获取更多信息,请看 第7章指标和日志。
Serving 和 Build 安装完成并运行后,按照类似的步骤启动 Eventing 模块:
kubectl apply --filename https://storage.googleapis.com/knative-releases/eventing/latest/release.yaml
kubectl get pods --namespace knative-eventing --watch
最后,你可以选择安装你需要的 Build 模板。这一步与第三章中的步骤完全相同。下面是安装 Kaniko 和 Buildpacks 模板的命令:
kubectl apply -f https://raw.githubusercontent.com/knative/build-templates/master/kaniko/kaniko.yaml
kubectl apply -f https://raw.githubusercontent.com/knative/build-templates/master/buildpack/buildpack.yaml
须知
如果你计划使用 Build 模块将源代码打包到镜像中,你需要一个容器仓库来推送。在安装 Knative 的同时,考虑设置对所选容器仓库的访问。容器仓库你可以选择 Docker Hub 或谷歌容器仓库这样的公共托管方式,或者你也可以设置自己的私有仓库。有关访问和将镜像推送到仓库的更多信息,请参阅第4章中的 Build 组件。
您可以使用 kubectl get buildtemplates 命令验证 Build 模板是否已成功安装。这将返回 default 命名空间中安装的所有构建模板的列表:
$ kubectl get knative
NAME AGE
buildpack 1m
kaniko 1m
删除 Knative 对象
您可能希望在添加某些 Knative 组件之后删除它们。可以使用 kubectl delete 命令从集群中删除任何 Knative 对象。正如您使用 kubectl apply 引用 YAML 文件一样,您也可以使用 kubectl delete 执行相同的操作:
kubectl delete -f https://raw.githubusercontent.com/knative/build-templates/master/kaniko/kaniko.yaml
Kubernetes 集群已启动。Istio 已经安装。已添加了 Serving 、 Build 和 Eventing 组件。您可能已经添加了一两个 Build 模板。您几乎已经准备好开始使用 Knative 了。剩下的只需要获取一些关于如何在网络上访问它的信息。
安装方法选择
本章中的步骤展示了如何使用本地的 kubectl apply 命令分别安装 Knative 组件。然而,一些构建在 Knative 之上的无服务器框架也可能包含安装系统的快捷方式。例如, riff 提供了一个在 Kubernetes 集群上安装和运行 Knative 的一行程序:
riff system install
这需要 riff CLI 和 Kubernetes 集群已经建立且 kubectl 已经指向正确的上下文。
访问 Knative 集群
设置好 Knative 集群之后,就可以将应用程序部署到 Knative 上了。但你需要知道如何使用它们。它们如何暴露在集群中?Knative 在 istio-system 命名空间中使用 LoadBalancer 方式。使用以下命令获取外部 IP 地址,列名:EXTERNAL-IP
$ kubectl get svc istio-ingressgateway --namespace istio-system
NAME TYPE CLUSTER-IP EXTERNAL-IP
istio-ingressgateway LoadBalancer 10.23.247.74 35.203.155.229
正如您将在第6章中看到的,这个 IP 地址加上正确的 HTTP HOST 头就可以向集群上的应用程序发起请求。为了方便使用,可以把外部 IP 地址设置为 KNATIVE_INGRESS 这个环境变量:
$ export KNATIVE_INGRESS=$(kubectl get svc istio-ingressgateway --namespace istio-system --output 'jsonpath={.status.loadBalancer.ingress[0].ip}')
$ echo $KNATIVE_INGRESS
35.203.155.229
现在,使用与我们在第2章中看到的类似的 curl 命令,我们可以使用这个环境变量向 Knative 环境中的服务发出请求:
curl -H "Host: my-knative-service-name.default.example.com" http://$KNATIVE_INGRESS
不支持 Load Balancer?
如果你的 Kubernetes 实例不支持 load balancer(比如:Minikube),命令会略有不同因为 EXTERNAL-IP 会显示为。使用以下命令返回节点的 IP 和端口:
$ export KNATIVE_INGRESS=$(kubectl get node --output 'jsonpath={.items[0].status.addresses[0].address}'):$(kubectl get svc istio-ingressgateway> --namespace istio-system --output 'jsonpath={.spec.ports[?(@.port==80)].nodePort}')
$ echo $KNATIVE_IN
10.10.0.10:32380
结论
现在已经设置好了一切,可以将应用程序部署到 Knative 了。在第6章,您将看到一些不同的示例。您还将了解通过设置静态 IP、自定义域名以及 DNS 配置来公开集群的更健壮的方式。
END
- 装箱与值类型虽然很容易理解,但是在实际使用中,并不总是能100%用对
- Jexus 配置ssl
- 局部打印插件 jquery.PrintArea.js
- FluorineFx应用中“页面长时间不动”导致无法连接的解决办法
- Mysql主从同步(1)-主从/主主环境部署梳理
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
- 网站压力测试软件WebBench以及压测Jexus
- Gershon Dublon & Nan Zhao:用传感器网络感知世界
- 即日起珠海可用微信乘公交,腾讯乘车码助力智慧城市建设
- 利用mk-table-checksum监测Mysql主从数据一致性操作记录
- mysql主从同步(4)-Slave延迟状态监控
- 浏览器窗口尺寸改变时的图片自动重新定位
- Mongodb主从复制/ 副本集/分片集群介绍
- Paul-Adrien Menez:互联网与抵制食物浪费的故事
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AkShare-期货数据-分时数据
- Python 爬取留言板留言(三):多进程版+selenium模拟
- View事件分发、滑动冲突 详解
- Python Django开发 异常及其解决办法(一)
- 带你彻底搞懂-View的工作原理!
- Python 批量下载BiliBili视频 打包成软件
- 必要掌握!Window、WindowManager !
- 面试必备:ThreadLocal+Looper+Handler
- 子线程 真的不能更新UI ?
- Web前端开发 HTML设计 经验与技巧总结
- [OHIF-Viewers]医疗数字阅片-医学影像-辅助工具-Redux DevTools-DevTools for Redux with hot reloading, action replay,
- 全面理解:Android中的线程及线程池
- Ubuntu系统 安装与配置 常见异常与解决办法
- [OHIF-Viewers]医疗数字阅片-医学影像-Module: Panel-自定义面板-中二-Redux&react-redux状态管理详解
- Bitmap的加载和Cache