通过接触Knative来学习Kubernetes
只需一个选项,以中国语言本地重新表达以下内容:
对无服务器感兴趣的人们
初次见面,我叫“ながの”,一个对Serverless产生了浓厚兴趣以至于晚上只能睡6小时的人。
我来到这个新工作已经八个月了,过去我从未尝试过的事情让我得到了很多机会,并度过了充满挑战的每一天。
然而,由于这是一份难得的圣诞倒数日历,所以我想去探索一些我在工作中从未涉猎过的事情,并选择了Knative作为主题。如果您愿意,我们可以一起深入了解Knative知识。
为什么选择Knative?
为什么想要加深对Knative的了解?这有明确的原因。
我想学习Kubernetes。
哎?那就学习Kubernetes好了吧?
是的,确实是这样。但是现在开始学习Kubernetes也太晚了!这样说出来感觉太拖沓,让人觉得很尴尬呢…再加上在公私方面都没有遇到需要使用Kubernetes的情境,所以很难找到学习的动力呢…
这就是Knative。(如果是Knative的话,现在还不会有太多的晚了的感觉,不是吗?)
另外,Knative似乎是一种可以在Kubernetes上构建无服务器架构的东西。没错!因为Knative是构建在Kubernetes上的无服务器架构,所以想要学习Knative必须先了解Kubernetes。
当事者がk8sとサーバーレスについて理解するためには、Knativeを試してみることが一番です。ただし、私はこの時点では誤解していました。Knativeは難しいだけでなく、k8sも難しいという結果が待っていたことに気付くことはできませんでした。
ということで私はKnativeを選択したというわけです。
首先,学习Knative的知识。
そもそもKnativeってなに?ってことになるかと思いますので、確認していきましょう。
参考にさせていただいたのは以下。全部メルペイの杉田さん(About Me – DoorLog)のものです。
-
- Kubernetes・Serverlessとの出会いと、Knative入門 – ログミーTech
-
- Knativeの歩き方 KubernetesからServerlessを訪ねて 第2版 #技術書典 – カエルと空 – BOOTH
- Knativeソースコードリーディング入門 Knativeで学ぶKubernetesのカスタムリソースとカスタムコントローラ – BOOTH
我的Knative知識的120%是從杉田先生的輸出中獲得的。
那么,最终Knative是什么呢?
最初我只是简单地认为Knative就像AWS Lambda一样,是用于在AWS之外构建FaaS的开源软件。
不过经过进一步的调查,我发现这不仅仅是一个问题。
我不怕误解地说,我理解Knative是为了更高效地实现试图通过使用Kubernetes实现的事情而存在的一个选项解决方案。
您对于使用Kubernetes来实现的目标是什么?
これは私のようなKubernetes未経験者でも、ちょっとKubernetesを気にしてセミナーに通っているような人であれば、セミナーでよく耳にするアレです。こんな事ができるからKubernetesって凄いんだよって紹介されているアレです。
-
- コンテナを使ったマイクロサービス
-
- ブルーグリーンデプロイメント
-
- カナリアリリース
-
- オートスケール
- ゼロスケール
在Kubernetes中,我们经常听说可以实现上述的功能。
でもどうやら上記のようなことをKubernetesだけで実現するとなると結構大変な部分もあるようなんです。
私なんて最初はKubernetesを使うだけで上記に列挙したようなCloudNativeなことがすぐにできちゃんだろうな、すごいなあって思っていたのですが、Kubernetesが抽象化したのはインフラ部分のようで、Kubernetes上で作られたサービス(インフラより上層にあるサービス)が、CICDを行い、ブルーグリーンデプロイメントを実現したり、負荷が高まった時にオートスケールしたり、はたまたアクセスがない時はリソース節約のためにゼロスケールしたり、というようなことは割と手間をかけて実現しないといけなかったという事実があるようです。
所以,幸好通过Kubernetes对基础设施进行抽象化,不必再关心繁琐的基础设施细节,可以利用很棒的资源。因此,从此之后(从基础设施以上的服务),我们也希望能够很好地进行抽象化,不需深入思考,只需做出CloudNative应有的事情。这就是Knative的出现的原因(虽然有不同的说法,这是我的理解)。
所以,杉田先生的书中也记载着以下内容。
Knativeはつぎのような、コンテナアプリケーションを開発する上で必ずとおるが難しい課題を解決します
– コンテナの迅速なデプロイ
– ソースコードからURLをアクセスできるアプリケーションへ
– ブルー/グリーンデプロイを伴うルーティングとトラフィック管理
– オートスケーリングと需要に基づくワークロードのサイズ設定
– 実行中のサービスをイベントエコシステムに結び付ける
所以,我们逐渐了解了Knative的实际情况。
暂时运行Knative
では、ひとまずKnativeを動かす環境をつくりましょう。
我参考的是杉田先生在2019年东京无服务器日活动中进行的工作坊。
- GitHub – toshi0607/build-your-own-platform-with-knative: Knativeのコンポーネントを理解しながらFaaSプラットフォームをDIYするワークショップです
我只会尝试建立簇和理解每个组件中的服务器。
使用 Google Cloud Platform
KubernetesはGKEで作成します。(さっそくKubernetesの勉強になってますね)やり方はワークショップ通りで私は問題なく進めることができました。
build-your-own-platform-with-knative/step0.md
軽く補足すると(補足なので基本はワークショップの通り進めてくださいね)
创建Kubernetes集群的命令大致如下。
gcloud beta container clusters create $CLUSTER_NAME \
--addons=HorizontalPodAutoscaling,HttpLoadBalancing,Istio \
--machine-type=n1-standard-2 \
--cluster-version=latest --zone=$CLUSTER_ZONE \
--enable-stackdriver-kubernetes --enable-ip-alias \
--enable-autoscaling --min-nodes=1 --max-nodes=5 \
--enable-autorepair \
--scopes cloud-platform
我确认一下
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
gke-knative-default-pool-743e9df0-8bg4 Ready <none> 5m54s v1.14.8-gke.17
gke-knative-default-pool-743e9df0-mbk3 Ready <none> 5m53s v1.14.8-gke.17
gke-knative-default-pool-743e9df0-z9bm Ready <none> 5m53s v1.14.8-gke.17
哦!很容易完成了。Kubernetes集群在一瞬间建立好了。
接下来,我们将在这里安装Knative。
$ kubectl apply --selector knative.dev/crd-install=true \
--filename https://github.com/knative/serving/releases/download/v0.9.0/serving.yaml \
--filename https://github.com/knative/eventing/releases/download/v0.9.0/release.yaml \
--filename https://github.com/knative/serving/releases/download/v0.9.0/monitoring.yaml
むむ。–selector knative.dev/crd-install=trueの意味はなんでしょうか?これはKnativeをKubernetes上で利用するためにカスタムリソースとして事前に登録しているコマンドのようです。Kubernetesはこんな感じでいろんなカスタムをすることで機能を追加していくんですね。
参考资料:关于CRD的笔记 – repl.info
由于事先准备工作已经完成,接下来我们将创建Knative的资源。
$ kubectl apply --filename https://github.com/knative/serving/releases/download/v0.9.0/serving.yaml \
--filename https://github.com/knative/eventing/releases/download/v0.9.0/release.yaml \
--filename https://github.com/knative/serving/releases/download/v0.9.0/monitoring.yaml
让我们确认一下。哦,全部都在动!!
$ kubectl get pods --namespace knative-serving
NAME READY STATUS RESTARTS AGE
activator-68d9f95cd-qx4jk 2/2 Running 3 3m59s
autoscaler-5655c9fcfd-mp74z 2/2 Running 1 3m58s
autoscaler-hpa-8668fc6f68-97krf 1/1 Running 0 3m59s
controller-5b77c5596c-85hr2 1/1 Running 0 3m57s
networking-istio-6d7d44d879-f78mb 1/1 Running 0 3m56s
webhook-75b4fc9999-m62gq 1/1 Running 0 3m56s
$ kubectl get pods --namespace knative-eventing
NAME READY STATUS RESTARTS AGE
eventing-controller-db9b58855-v69nz 1/1 Running 0 4m21s
eventing-webhook-595c6b4fd8-gj2qh 1/1 Running 0 4m20s
imc-controller-7b9b7f9f66-4p78h 1/1 Running 0 4m19s
imc-dispatcher-775c96b5b5-rwzvl 1/1 Running 0 4m19s
sources-controller-78655cd9f9-dzvkn 1/1 Running 0 4m21s
$ kubectl get pods --namespace knative-monitoring
NAME READY STATUS RESTARTS AGE
elasticsearch-logging-0 1/1 Running 0 4m44s
elasticsearch-logging-1 1/1 Running 0 3m33s
fluentd-ds-fdcgj 1/1 Running 0 4m43s
fluentd-ds-nkqjf 1/1 Running 0 4m43s
fluentd-ds-wczz5 1/1 Running 0 4m43s
grafana-85c86fb7b9-tndgp 1/1 Running 0 4m39s
kibana-logging-7cb6b64bff-wdjp8 1/1 Running 0 4m43s
kube-state-metrics-56f68467c9-t864j 4/4 Running 0 3m24s
node-exporter-k6drr 2/2 Running 0 4m40s
node-exporter-qlh4q 2/2 Running 0 4m40s
node-exporter-txv9k 2/2 Running 0 4m40s
prometheus-system-0 1/1 Running 0 4m37s
prometheus-system-1 1/1 Running 0 4m37s
Kubernetes集群和Knative的安装已经完成。接下来让我们尝试一下工作坊中“理解每个组件”的“Serving”部分。
服务
从这里开始,我们将以工作坊的形式进入 build-your-own-platform-with-knative/step1.md。
で、そもそもServingとは?ってことですが、Knativeの3大要素のうちの1つです。
-
- Serving
-
- Evneting
- Build(これはTektonとして独立したのでKnativeから外れた?)
据说,其中一种服务的角色如下所示。
オートスケールアウト・イン、トラフィックコントロール、バージョン管理などです。Servingは4つのコンポーネントから構成されます。
・Configuration: 最新の設定
・Revision: コードと設定の履歴
・Route: Revisionへのルーティング
・Service: RouteとConfigurationから構成されるサービス全体
嗯,因为感觉只是有点模糊,所以我们实际动手操作一下Serving吧。
请按照以下方式创建serving.yaml文件。
apiVersion: serving.knative.dev/v1alpha1
kind: Service
metadata:
name: helloworld
namespace: default
spec:
runLatest:
configuration:
revisionTemplate:
spec:
container:
image: "gcr.io/knative-samples/helloworld-go"
env:
- name: "TARGET"
value: "Knative serving"
然后开始执行。
$ kubectl apply -f service.yaml
我确认。
$ kubectl get ksvc,configuration,route
NAME URL LATESTCREATED LATESTREADY READY REASON
service.serving.knative.dev/helloworld http://helloworld.default.example.com helloworld-w89zj helloworld-w89zj True
NAME LATESTCREATED LATESTREADY READY REASON
configuration.serving.knative.dev/helloworld helloworld-w89zj helloworld-w89zj True
NAME URL READY REASON
route.serving.knative.dev/helloworld http://helloworld.default.example.com True
これでKnativeのServingのコンポーネントであるservice,configuration,routeができたってことですね。下の図の赤枠で囲んだものができたものです。
请参考以下链接:https://github.com/knative/docs/tree/master/docs/serving
で、これで何ができるようになったの?ってなりますよね。なので、以下の確認をしていきます。
# IPアドレスの取得
$ export IP_ADDRESS=$(kubectl get svc istio-ingressgateway --namespace istio-system --output 'jsonpath={.status.loadBalancer.ingress[0].ip}')
# curlでリクエスト
$ curl -H "Host: helloworld.default.example.com" http://$IP_ADDRESS
Hello Knative serving!
你好,Knative服务!成功输出Hello Knative serving!
これの何が凄いの??
Hello Knative Serving! 看似平凡地输出了出来,但它为何如此了不起呢?
首先,只需执行约15行的上述yaml,即可使Knative正常运行。
そして2つ目にKnativeのオブジェクトだけでなく、組み込みのKubernetesオブジェクトまで動いているというのが凄い点です。KnativeがKubernetes上にサーバーレスな仕組みを構築するものなので、当然といえば当然ですが、Kubernetesを意識することなくKubernetesのメリットを利用できるというのは凄いことなのではないでしょうか。
では、どんなKubernetesオブジェクトができているのか確認してみましょう。
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
helloworld-t75c2-deployment-54755c9bb5-tf6vl 2/2 Running 0 42s
$ kubectl get replicaset
NAME DESIRED CURRENT READY AGE
helloworld-t75c2-deployment-54755c9bb5 1 1 1 21m
$ kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
helloworld-t75c2-deployment 1/1 1 1 21m
$ kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
helloworld ExternalName <none> cluster-local-gateway.istio-system.svc.cluster.local <none> 20m
helloworld-t75c2 ClusterIP 10.0.0.176 <none> 80/TCP 21m
helloworld-t75c2-6l49j ClusterIP 10.0.13.34 <none> 80/TCP,8022/TCP 21m
helloworld-t75c2-metrics ClusterIP 10.0.2.146 <none> 9090/TCP,9091/TCP 21m
kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 45m
おおー。確かにKubernetesのオブジェクトが動いています。15行くらいのyamlを実行しただけなのに色々と動いてますね。
実はKubernetesの組み込みオブジェクトだけでこれと同じことをしようとすると結構な手間らしいんです。
- Migrating from Kubernetes Deployment to Knative Serving
真的是这样吗?
と疑問に思ってくればしめたものです!本当に手間がかかるかの確認のために、KubernetesのPod,ReplicaSet,Deplyment,ingressなどを調べて実際に動かしてみればいいのですから。こうしてKubernetesについて色々と知る必要がでてきました。
自分なりに少し調べてみた感じですと、まずKubernetesクラスタ内にコンテナをたてる部分、そしてそのコンテナに外部からアクセスする部分、それらを作成するだけでも15行以上のyamlを書く必要があるということです。そこにさらに外部からアクセスができるようになっている状況が15行のyamlで作成できてしまうというのは、凄いことなのかなと思っています。
整理
你觉得怎么样?
KnativeをきっかけにしてKubernetesに興味を持とうという主旨は伝わりましたでしょうか。個人的にはこのやり方は割といいんじゃないかと思っています。それにKnativeのワークショップが充実しているので、そこを紐解いていけばKubernetesについても詳しくなれる!そんな気がしています。
由于这次只接触了Serving部分(或者说只学习了Serving部分),所以接下来我想要涉及Knative的其他部分,为了增加学习Kubernetes的机会,加深对Kubernetes的理解。