使用minikube在本地一台机器上运行Knative,直到完成

概况

在Google Cloud Next ’18上,宣布了Knative。Knative是在Kubernetes上运行应用程序时,用于简化构建、部署和服务管理的容器编排工具。

在这篇文章中,我们将介绍如何利用本地设备(mac)一台使用Kubernetes环境构建工具”Minikube”来创建Kubernetes环境,并在其上运行Knative的步骤。

minikube_dashboard.png

目标读者

    • 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
这样就安装了Kubernetes-cli 1.11.1。“`
==> 正在下载 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 -

我会等待服务提高。

确认状态后,最初包含了“ContainerCreating”状态的服务如下所示:$ kubectl get pods -n istio-system
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分钟

确认状态,如果全部是“Running”或“Completed”,就可以了。$ kubectl get pods -n istio-system
名称 准备好的 状态 重启次数 年龄
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 -
时间 curl -L https://storage.googleapis.com/knative-releases/serving/latest/release-lite.yaml \
> | 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,可以方便地在一台机器上进行测试。

广告
将在 10 秒后关闭
bannerAds