Apa itu Knative
2020/05/10
Akhir akhir ini serverless sedang booming. Beberapa penyedia layanan cloud computing sudah menyediakan product serverless. Misalnya pada AWS, ada AWS Lambda dimana kita sebagai pengembang tinggal upload binary function ke AWS lambda. Lalu pada GCP ada Cloud Function mirip seperti AWS Lambda dan belum lama ini mulai ramai Cloud Run yang mana sebenernya Cloud Run itu adalah Knative.
Knative sendiri berjalan diatas kubernetes atau extention dari kubernetes yang menjadi middleware untuk membuat aplikasi yang bisa berjalan dimanapun pada cloud yang menggunakan kubernetes. Aplikasinya harus berbasis yang kontainer ya.
Fungsi dari Knative ada 2 yaitu:
- run stateless workloads such as microservices
- event subscription, delivery and handling
Knative fokus ke dua komponen kunci, yaitu:, melayani trafffic (Knative Serving) dan memungkinkan aplikasi dengan mudah mengkonsumsi dan memproduksi events (Knative Eventing). Sebelumnya ada 3 komponen yaitu Knative Build. Komponen ini sudah tidak digunakan lagi atau deprecated bisa dilihat diissue #614. Alasannya karena sudah ada beberapa tools lain yang lebih fokus ke build contohnya Tekton Pipeline atau Kaniko atau buildpacks atau mau yang lebih kompleks bisa pake Jenkins dll.
-
Knative Serving Bagaimana kode kita menerima requests dan scaling dengan mereka (semua request itu).
Detail dari Knative serving:
- Request-driven compute runtime - Scale-to-zero / scale out per load - Deploy from container registry - Multiple revision of same app - Route traffic across revisions -
Bagaimana kode kita ditrigger oleh events
Knative Eventing details:
- Apps and functions consume and publish event streams - Multiple event source available - Encourages asynchronouse, loosely coupled architechture.
Install Knative
Knative punya 2 komponen yang diinstall secara independen dan membutuhkan kubernetes v.1.5 atau yang terbaru. Dan tulisan ini mengasumsikan kita sudah menginstall kubenetes cluster dikomputer.
Knative Serving
Tulisan ini diambil dari https://knative.dev/docs/install/any-kubernetes-cluster/.
1. Install Curtom Resource Definitions (aka CRDs)
kubectl apply --filename https://github.com/knative/serving/releases/download/v0.14.0/serving-crds.yaml
2. Install core komponen dari serving
kubectl apply --filename https://github.com/knative/serving/releases/download/v0.14.0/serving-core.yaml
3. Install Istio untuk Knative
Pada tulisan ini kita menggukan isto sebagai networking layer, Meski ada beberapa pilihan lain. misalnya:
Mungkin ditulisan lain akan mereview ke 5 pilihan networking layer.
Download istion dan install
-
Download istio
# Download and unpack Istio export ISTIO_VERSION=1.4.6 curl -L https://git.io/getLatestIstio | sh - cd istio-${ISTIO_VERSION} -
Install istio CRDs
for i in install/kubernetes/helm/istio-init/files/crd*yaml; do kubectl apply -f $i; done -
Bikin istio namespace.
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Namespace metadata: name: istio-system labels: istio-injection: disabled EOF -
Instal istio tanpa sidecar injection
Dalam menggunakan istio pada Knative kita bisa memilih apakah mau menggunakan automatic
sidecar injectionatau yang manual.Dan pada tulisan kali ini kami memilih untuk yang manual, alsannya kita tidak membutuhkan service mesh pada tulisan ini. hanya butuh traffic routing dan ingress.
Kita install menggunakan helm
helm template --namespace=istio-system \ --set prometheus.enabled=false \ --set mixer.enabled=false \ --set mixer.policy.enabled=false \ --set mixer.telemetry.enabled=false \ `# Pilot doesn't need a sidecar.` \ --set pilot.sidecar=false \ --set pilot.resources.requests.memory=128Mi \ `# Disable galley (and things requiring galley).` \ --set galley.enabled=false \ --set global.useMCP=false \ `# Disable security / policy.` \ --set security.enabled=false \ --set global.disablePolicyChecks=true \ `# Disable sidecar injection.` \ --set sidecarInjectorWebhook.enabled=false \ --set global.proxy.autoInject=disabled \ --set global.omitSidecarInjectorConfigMap=true \ --set gateways.istio-ingressgateway.autoscaleMin=1 \ --set gateways.istio-ingressgateway.autoscaleMax=2 \ `# Set pilot trace sampling to 100%` \ --set pilot.traceSampling=100 \ --set global.mtls.auto=false \ install/kubernetes/helm/istio \ > ./istio-lean.yaml kubectl apply -f istio-lean.yaml
install knative istio controller
kubectl apply --filename https://github.com/knative/net-istio/releases/download/v0.14.0/release.yaml
Fetch the External IP or CNAME:
kubectl --namespace istio-system get service istio-ingressgateway
Varifikasi instalasi istio
pastikan istio sudah berjalan dengan mengecek podsnya
kubectl get pods --namespace istio-system
Seting domain local pada etc/host
127.0.0.1 helloworld-go.default.knative.local
Kita coba untuk menjalankan hello-world project.
Jalankan di browser
export DOMAIN_NAME=`kubectl get route helloworld-go --output jsonpath="{.status.url}" | cut -d'/' -f 3`
echo -e "127.0.0.1 $DOMAIN_NAME" | sudo tee -a /etc/hosts
Referensi: