Fission x Istio 迸出新滋味

Fission x Istio 整合教學

ta-ching chen

3 minute read

 文章目錄

系列文章 

前言 

Fission 是基於 Kubernetes 之上的 Serverless 框架,而 Istio 是前陣子由 Google、IBM、Lyft 共同推出用來管理、連結微服務的開放平台,透過將兩者整合在一起便能夠提供使用者更多強大的功能。

這陣子花了些時間做實驗跟開發將 Fission 跟 Istio 做初步的整合。雖就目前的狀況來說還有許多地方尚待改進,但相信過陣子就能夠將兩者更好的結合在一起了。

若對 Fission 以及 Istio 整合有興趣的人,下面是完整的安裝教學。

安裝 

測試環境 

  • Google Kubernetes Engine: 1.9.2-gke.1 cluster
  • Fission: 0.6.0
  • Istio: 0.6.0

建立 Kubernetes v1.9+ alpha cluster 

可用的區域 (ZONE) 可看這裡

$ export ZONE=<zone name>
$ gcloud container clusters create istio-demo-1 \
    --machine-type=n1-standard-2 \
    --num-nodes=1 \
    --no-enable-legacy-authorization \
    --zone=$ZONE \
    --cluster-version=1.9.2-gke.1

設定叢集 admin 權限 

  • 設定 kube-system service account 權限
# for system:serviceaccount:kube-system:default
$ kubectl create clusterrolebinding --user system:serviceaccount:kube-system:default kube-system-cluster-admin --clusterrole cluster-admin
  • 設定目前使用者的權限
# for current user
$ kubectl create clusterrolebinding cluster-admin-binding --clusterrole=cluster-admin --user=$(gcloud config get-value core/account)

安裝 Istio 環境 

以下為 Istio 0.6.0 的安裝教學,或者可以參考官方的安裝教學: Quick Start 以及 Sidecar Injection

下載 Istio 0.6.0

$ export ISTIO_VERSION=0.6.0
$ curl -L https://git.io/getLatestIstio | sh -
$ cd istio-0.6.0/

安裝 Istio 相關的 YAML 檔

如果不需要 sidecar 間相互做 TLS 認證:

$ kubectl apply -f install/kubernetes/istio.yaml

或,如果需要彼此做 TLS 認證:

$ kubectl apply -f install/kubernetes/istio-auth.yaml

自動注入 sidecar (istio-proxy)

請確認 admissionregistration API 是啟用的狀態

$ kubectl api-versions | grep admissionregistration
admissionregistration.k8s.io/v1beta1

安裝 sidecar injection configmap

$ ./install/kubernetes/webhook-create-signed-cert.sh \
    --service istio-sidecar-injector \
    --namespace istio-system \
    --secret sidecar-injector-certs

$ kubectl apply -f install/kubernetes/istio-sidecar-injector-configmap-release.yaml

安裝 sidecar injector

$ cat install/kubernetes/istio-sidecar-injector.yaml | \
     ./install/kubernetes/webhook-patch-ca-bundle.sh > \
     install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml

$ kubectl apply -f install/kubernetes/istio-sidecar-injector-with-ca-bundle.yaml

# Check sidecar injector status
$ kubectl -n istio-system get deployment -listio=sidecar-injector
NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
istio-sidecar-injector   1         1         1            1           26s

安裝 Fission 

指定 helm 的預設安裝 namespace, 這邊我們用 fission 做範例

$ export FISSION_NAMESPACE=fission

創建 namespace 並且加上對應 Label 方便 Istio 做 sidecar 注入

$ kubectl create namespace $FISSION_NAMESPACE
$ kubectl label namespace $FISSION_NAMESPACE istio-injection=enabled
$ kubectl config set-context $(kubectl config current-context) --namespace=$FISSION_NAMESPACE

透過下列指令安裝 fission

$ helm install --namespace $FISSION_NAMESPACE --set enableIstio=true --name istio-demo https://github.com/fission/fission/releases/download/0.6.0/fission-all-0.6.0.tgz

建立、存取自定義的 function 

設定 Fission 相關環境變數

$ export FISSION_ROUTER=$(kubectl --namespace fission get svc router -o=jsonpath='{..ip}')

首先我們建立一個用 Node.js 寫的小程式

建立 function 的執行環境

$ fission env create --name nodejs --image fission/node-env

建立 function

// hello.js
module.exports = async function(context) {
    console.log(context.request.headers);
    return {
        status: 200,
        body: "Hello, World!\n"
    };
}
$ fission fn create --name h1 --env nodejs --code hello.js --method GET

建立 route

$ fission route create --method GET --url /h1 --function h1

存取 function

$ curl http://$FISSION_ROUTER/h1
Hello, World!

安裝其他 Add-ons 

注意: 由於 Istio 0.6.0 的已知問題 issue, 現在 Grafana & Jaeger 只會呈現 TCP-level 的相關資訊。

  • Prometheus
$ kubectl apply -f install/kubernetes/addons/prometheus.yaml
$ kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 9090:9090

Web Link: http://127.0.0.1:9090/graph

  • Grafana

請先安裝 Prometheus

grafana

$ kubectl apply -f install/kubernetes/addons/grafana.yaml
$ kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 3000:3000

Web Link: http://127.0.0.1:3000/dashboard/db/istio-dashboard

  • Jaeger

jaeger

$ kubectl apply -n istio-system -f https://raw.githubusercontent.com/jaegertracing/jaeger-kubernetes/master/all-in-one/jaeger-all-in-one-template.yml
$ kubectl port-forward -n istio-system $(kubectl get pod -n istio-system -l app=jaeger -o jsonpath='{.items[0].metadata.name}') 16686:16686

Web Link: http://localhost:16686

參考連結 

comments powered by Disqus