使用minikube在本地一台机器上运行Knative,直到完成
概况
在Google Cloud Next ’18上,宣布了Knative。Knative是在Kubernetes上运行应用程序时,用于简化构建、部署和服务管理的容器编排工具。
在这篇文章中,我们将介绍如何利用本地设备(mac)一台使用Kubernetes环境构建工具”Minikube”来创建Kubernetes环境,并在其上运行Knative的步骤。
目标读者
-
- Knativeの動かし方を確認したい方
- Kubernetesが何をしてくれるものかの知識がある方
前提
本文使用了截至2018年7月25日可用的以下版本。
Minikube : 0.28.2
Knative : (2018/7/25時点の最新版)
macOS : 10.13.2
VirtualBox : 5.2.16
Macbook Pro(15-inch, Mid 2014)
在使用Minikube运行服务时,需要相当数量的内存。如果主机内存为8GB,可以尝试更改分配给Minikube虚拟机的内存(例如,本文作者在拥有16GB内存的机器上,将8GB分配给虚拟机进行执行)。
直到Minikube可运行(准备Kubernetes环境)
首先,我们需要在本地机器上准备好Kubernetes环境。
基本上,我们会按照Minikube网站上列出的安装步骤进行操作,但在这篇文章中,我会简单介绍我们正在使用的方法。
超级虚拟机 jī)
在本篇文章中,我们会使用VirtualBox。在进行常规安装后,还会安装“扩展包”。
Kubernetes命令行工具
在macOS上使用brew来进行安装。(brew的安装本身就像在brew的官网上所说的那样,在上面用一行代码就能完成。)
$ brew install kubernetes-cli
==> 正在下载 https://homebrew.bintray.com/bottles/kubernetes-cli-1.11.1.high_sierra.bottle.tar.gz
################################################################## 100.0%
==> 正在倒入 kubernetes-cli-1.11.1.high_sierra.bottle.tar.gz
==> 注意事项
Bash补全已安装到:
/usr/local/etc/bash_completion.d
zsh补全已安装到:
/usr/local/share/zsh/site-functions
==> 概要
? /usr/local/Cellar/kubernetes-cli/1.11.1:196个文件,53.7MB
“`
迷你立方
从发布页面获取最新版本(在创建条目时是v0.28.2)。下载适用于macOS的「minikube-darwin-amd64」。
使用Knative网站上提供的选项启动Minikube。与上方相同,–vm-driver选项指定为virtualbox。(如果疏忽地单独执行”minikube”命令,生成的虚拟机将默认配置为约2G内存,并可能遇到在之后增加服务时出现的问题。)
因为命令有点长,所以我把它写成了脚本并执行了。
#!/bin/sh
minikube start --memory=8192 --cpus=4 \
--kubernetes-version=v1.10.5 \
--vm-driver=virtualbox \
--bootstrapper=kubeadm \
--extra-config=controller-manager.cluster-signing-cert-file="/var/lib/localkube/certs/ca.crt" \
--extra-config=controller-manager.cluster-signing-key-file="/var/lib/localkube/certs/ca.key" \
--extra-config=apiserver.admission-control="LimitRanger,NamespaceExists,NamespaceLifecycle,ResourceQuota,ServiceAccount,DefaultStorageClass,MutatingAdmissionWebhook"
Istio: Istio
按照网站上提供的步骤开始使用服务网格Istio。
curl -L https://storage.googleapis.com/knative-releases/serving/latest/istio.yaml \
| sed 's/LoadBalancer/NodePort/' \
| kubectl apply -f -
我会等待服务提高。
NAME READY STATUS RESTARTS AGE
istio-citadel-7bdc7775c7-2nqq6 0/1 正在创建容器 0 1分钟
istio-cleanup-old-ca-vgg5g 0/1 正在创建容器 0 1分钟
istio-egressgateway-795fc9b47-fkpw9 1/1 运行中 0 1分钟
istio-ingress-84659cf44c-46rmd 0/1 正在创建容器 0 1分钟
istio-ingressgateway-7d89dbf85f-vkgcw 0/1 正在创建容器 0 1分钟
istio-mixer-post-install-4jgcb 0/1 已完成 0 1分钟
istio-pilot-66f4dd866c-f4kpt 0/2 正在创建容器 0 1分钟
istio-policy-76c8896799-2lggq 0/2 正在创建容器 0 1分钟
istio-sidecar-injector-645c89bc64-hgcbq 0/1 正在创建容器 0 1分钟
istio-statsd-prom-bridge-949999c4c-9dzd7 1/1 运行中 0 1分钟
istio-telemetry-6554768879-sz59r 0/2 正在创建容器 0 1分钟
名称 准备好的 状态 重启次数 年龄
istio-citadel-7bdc7775c7-2nqq6 1/1 运行中 0 3分钟
istio-cleanup-old-ca-vgg5g 0/1 已完成 0 3分钟
istio-egressgateway-795fc9b47-fkpw9 1/1 运行中 0 3分钟
istio-ingress-84659cf44c-46rmd 1/1 运行中 0 3分钟
istio-ingressgateway-7d89dbf85f-vkgcw 1/1 运行中 0 3分钟
istio-mixer-post-install-4jgcb 0/1 已完成 0 3分钟
istio-pilot-66f4dd866c-f4kpt 1/2 运行中 0 3分钟
istio-policy-76c8896799-2lggq 2/2 运行中 0 3分钟
istio-sidecar-injector-645c89bc64-hgcbq 1/1 运行中 0 3分钟
istio-statsd-prom-bridge-949999c4c-9dzd7 1/1 运行中 0 3分钟
istio-telemetry-6554768879-sz59r 2/2 运行中 0 3分钟
Knative 服务
我们将引入Knative Serving。
按照网站上的指示开始。
curl -L https://storage.googleapis.com/knative-releases/serving/latest/release-lite.yaml \
| sed 's/LoadBalancer/NodePort/' \
| kubectl apply -f -
> | sed ‘s/LoadBalancer/NodePort/’ \
> | kubectl apply -f –
总共 总计 已接受 客户有效数据传输平均速率 时间 总时间 平均等待时间 平均连接时间 平均速度
0% 0 0 0 0 0 0 0 –:–:– –:–:– –:–:– 0创建命名空间/knative-build
创建集群角色.rbac.authorization.k8s.io/knative-build-admin
创建服务账号/build-controller
创建集群角色绑定.rbac.authorization.k8s.io/build-controller-admin
创建自定义资源定义.apiextensions.k8s.io/builds.build.knative.dev
创建自定义资源定义.apiextensions.k8s.io/buildtemplates.build.knative.dev
创建服务/build-controller
创建服务/build-webhook
创建配置映射/config-logging
创建部署.app/build-controller
创建部署.app/build-webhook
创建命名空间/knative-serving
创建集群角色.rbac.authorization.k8s.io/knative-serving-admin
创建集群角色.rbac.authorization.k8s.io/knative-serving-write
创建服务账号/controller
创建服务账号/autoscaler
创建集群角色绑定.rbac.authorization.k8s.io/knative-serving-controller-admin
创建集群角色绑定.rbac.authorization.k8s.io/knative-serving-autoscaler-write
创建网关.networking.istio.io/knative-shared-gateway
创建服务/knative-ingressgateway
创建部署.app/knative-ingressgateway
创建水平Pod自动缩放器.autoscaling/knative-ingressgateway
创建自定义资源定义.apiextensions.k8s.io/configurations.serving.knative.dev
创建自定义资源定义.apiextensions.k8s.io/revisions.serving.knative.dev
创建自定义资源定义.apiextensions.k8s.io/routes.serving.knative.dev
创建自定义资源定义.apiextensions.k8s.io/services.serving.knative.dev
创建服务/activator-service
创建服务/controller
创建服务/webhook
创建部署.app/activator
创建服务/autoscaler
创建部署.app/autoscaler
创建配置映射/config-autoscaler
创建配置映射/config-controller
创建配置映射/config-domain
创建配置映射/config-logging
创建配置映射/config-network
创建配置映射/config-observability
创建部署.app/controller
创建部署.app/webhook
创建命名空间/monitoring
创建配置映射/grafana-dashboard-definition-istio
创建配置映射/grafana-dashboard-definition-mixer
创建配置映射/grafana-dashboard-definition-pilot
创建服务账号/kube-state-metrics
创建角色.rbac.authorization.k8s.io/kube-state-metrics-resizer
创建角色绑定.rbac.authorization.k8s.io/kube-state-metrics
创建集群角色.rbac.authorization.k8s.io/kube-state-metrics
创建集群角色绑定.rbac.authorization.k8s.io/kube-state-metrics
创建部署.app/kube-state-metrics
创建服务/kube-state-metrics
创建配置映射/grafana-dashboard-definition-kubernetes-deployment
创建配置映射/grafana-dashboard-definition-kubernetes-capacity-planning
83 485k 83 403k 0 0 167k 0 0:00:02 0:00:02 –:–:– 167k创建配置映射/grafana-dashboard-definition-kubernetes-cluster-health
创建配置映射/grafana-dashboard-definition-kubernetes-cluster-status
创建配置映射/grafana-dashboard-definition-kubernetes-control-plane-status
创建配置映射/grafana-dashboard-definition-kubernetes-resource-requests
100 485k 100 485k 0 0 160k 0 0:00:03 0:00:03 –:–:– 160k
创建配置映射/grafana-dashboard-definition-kubernetes-nodes
创建配置映射/grafana-dashboard-definition-kubernetes-pods
创建配置映射/grafana-dashboard-definition-kubernetes-statefulset
创建服务账号/node-exporter
创建集群角色.rbac.authorization.k8s.io/node-exporter
创建集群角色绑定.rbac.authorization.k8s.io/node-exporter
创建守护进程集.extensions/node-exporter
创建服务/node-exporter
创建配置映射/scaling-config
创建服务/fluentd-ds
创建配置映射/grafana-dashboard-definition-knative-efficiency
创建配置映射/grafana-dashboard-definition-knative
创建配置映射/grafana-datasources
创建配置映射/grafana-dashboards
创建服务/grafana
创建部署.app/grafana
创建日志记录.config.istio.io/requestlog
创建日志记录处理器.fluentd.config.istio.io/requestloghandler
创建规则.config.istio.io/requestlogtofluentd
创建度量.config.istio.io/revisionrequestcount
创建度量.config.istio.io/revisionrequestduration
创建度量.config.istio.io/revisionrequestsize
创建度量.config.istio.io/revisionresponsesize
创建普罗米修斯配置.config.istio.io/revisionpromhandler
创建规则.config.istio.io/revisionpromhttp
创建服务/kube-controller-manager
创建服务/prometheus-system-discovery
创建配置映射/prometheus-scrape-config
创建服务账号/prometheus-system
创建角色.rbac.authorization.k8s.io/prometheus-system
创建角色.rbac.authorization.k8s.io/prometheus-system
创建角色.rbac.authorization.k8s.io/prometheus-system
创建角色.rbac.authorization.k8s.io/prometheus-system
创建集群角色.rbac.authorization.k8s.io/prometheus-system
创建角色绑定.rbac.authorization.k8s.io/prometheus-system
创建角色绑定.rbac.authorization.k8s.io/prometheus-system
创建角色绑定.rbac.authorization.k8s.io/prometheus-system
创建角色绑定.rbac.authorization.k8s.io/prometheus-system
创建集群角色绑定.rbac.authorization.k8s.io/prometheus-system
创建服务/prometheus-system-np
创建有状态集.app/prometheus-system
日志记录.config.istio.io/requestlog 无变化
fluentd.config.istio.io/requestloghandler 无变化
规则.config.istio.io/requestlogtofluentd 无变化
度量.config.istio.io/revisionrequestcount 无变化
度量.config.istio.io/revisionrequestduration 无变化
度量.config.istio.io/revisionrequestsize 无变化
度量.config.istio.io/revisionresponsesize 无变化
普罗米修斯配置.config.istio.io/revisionpromhandler 无变化
规则.config.istio.io/revisionpromhttp 无变化真实 0m7.227秒
用户 0m0.604秒
系统 0m0.154秒
我会检查动作。
$ kubectl get pods -n knative-serving
NAME READY STATUS RESTARTS AGE
activator-5f78d674df-b7f2v 2/2 Running 4 17m
autoscaler-5787568ff8-5mg79 2/2 Running 4 17m
controller-c8dd5d467-8hnhx 1/1 Running 2 17m
webhook-78f58769cb-m5s7z 1/1 Running 2 17m
在Knative上运行示例
尝试在Knative网站上运行《Knative应用部署入门》指南中的示例。
准备 services.yaml 文件
我将准备这样一个文件。使用了指南中提供的”gcr.io/knative-samples/helloworld-go”的映像。
apiVersion: serving.knative.dev/v1alpha1 # Current version of Knative
kind: Service
metadata:
name: helloworld-go # The name of the app
namespace: default # The namespace the app will use
spec:
runLatest:
configuration:
revisionTemplate:
spec:
container:
image: gcr.io/knative-samples/helloworld-go # The URL to the image of the app
env:
- name: TARGET # The environment variable printed out by the sample app
value: "Go Sample v1"
让其运行起来。(这里的简易性是Knative的优点之一)
$ kubectl apply -f service.yaml
service.serving.knative.dev/helloworld-go created
在这一行代码中,Knative将负责以下事项:
– 创建此应用程序的普遍版本
– 创建路由、入口和负载均衡器
– 对pod进行扩缩容。
我会确认动作情况。
$
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
knative-ingressgateway NodePort 10.104.55.123 <none> 80:32380/TCP,443:32390/TCP,32400:32400/TCP 25m
请查找服务的URL。
$ kubectl get services.serving.knative.dev helloworld-go -o=custom-columns=NAME:.metadata.name,DOMAIN:.status.domain
NAME DOMAIN
helloworld-go helloworld-go.default.example.com
在Knative的网站上查找连接目标的IP地址的方法,
$ echo $(minikube ip):$(kubectl get svc knative-ingressgateway -n istio-system -o 'jsonpath={.spec.ports[?(@.port==80)].nodePort}')
192.168.99.101:32380
将这个地址设置为变量。
export IP_ADDRESS=192.168.99.100:32380
我试着连接一下。
$ curl -H "Host: ${HOST_URL}" http://${IP_ADDRESS}
Hello World: Go Sample v1!
我发现了来自Go程序的输出。
稍微修改services.yaml文件的内容
value: "Go Sample version2"
重新註冊服務。
$ kubectl apply -f service.yaml
service.serving.knative.dev/helloworld-go configured
稍过一段时间后,服务的环境变量将会更新,并且可以通过控制台输出的变化来确认。
$ curl -H "Host: ${HOST_URL}" http://${IP_ADDRESS}
Hello World: Go Sample version2
$ minikube dashboard
当您执行该操作时,您可以在Web控制台上确认服务部署的情况(请参考本条目开头的图表)。
整理
本篇介绍了如何在一台本地机器上尝试Knative。推荐使用Minikube,可以方便地在一台机器上进行测试。