Fission x Istio 迸出新滋味

Fission x Istio 整合教學

ta-ching chen

2 minute read

系列文章

Introduction

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

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

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

測試環境

  • Google Kubernetes Engine: 1.8.4-gke.0 alpha cluster

安裝

建立 Kubernetes v1.8+ alpha cluster

我們需要 RBAC 跟 initializer 功能,因此需要透過下列指令建立 GKE Alpha Cluster。

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

設定叢集 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.2.12

curl -L https://git.io/getLatestIstio | sh -

Apply Istio 相關的 YAML 檔

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

由於目前 Istio Pilot 針對 jobs 注入 sidecar 的已知問題,導致沒有辦法正確地透過 Helm 安裝 Fission,我們稍微做個 workaround 避免這個問題。

$ kubectl edit initializerconfigurations
apiVersion: admissionregistration.k8s.io/v1alpha1
initializers:
- name: sidecar.initializer.istio.io
  rules:
  - apiGroups:
    - '*'
    apiVersions:
    - '*'
    resources:
    - deployments
    - statefulsets
    # As a workaround right now, remove jobs here 
    # due to a known issue (https://github.com/istio/issues/issues/93) 
    - jobs
    - daemonsets

設定預設 namespace 為 fission

$ kubectl config set-context $(kubectl config current-context) --namespace=fission

安裝 Fission

$ git clone https://github.com/fission/fission.git
$ cd fission/charts && git checkout istio-integration

作為範例的 fission-bundle Docker 映像檔: life1347/fission-istio-integration:latest

$ helm init
$ helm install --debug --namespace fission --set enableIstio=true,image=life1347/fission-istio-integration,imageTag=latest,pullPolicy=Always --name istio-demo fission-all

建立、存取自定義的 function

設定 Fission 相關環境變數

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

Nodejs hello function: hello.js

// hello.js
module.exports = async function(context) {
    console.log(context.request.headers);
    return {
        status: 200,
        body: "Hello, World!\n"
    };
}

建立 function 的執行環境

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

建立 function

$ 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

  • Prometheus
$ kubectl apply -f istio-0.2.12/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 istio-0.2.12/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

Reference

comments powered by Disqus