Kong merupakan sebuah API gateway yang keren sekali. Kong ini sangat berguna untuk kita yang menerapkan microservice pada layanan / apps kita. Kemudian ada juga yang namanya konga, ini adalah GUI / WebUI dari kong namun bukan official dari kong.
Selain kong dan konga, nantinya kita juga membutuhkan DBMS yang berfungsi untuk menyimpan data data dari kong dan konga. Mereka support menggunakan postgresql, jadi kita akan gunakan postgresql untuk DBMS nya.
Sebelumnya tkjpedia pernah membuat postingan tentang bagaimana cara menjalankan kong dan konga di docker pada halaman berikut:
Prasyarat
Untuk mengikuti tutorial ini ada beberapa prasyarat.
- Menggunakan kubernetes
- Menginstall kubectl
- Clusterissuer (menggunakan ssl gratis letsencrypt)
Install Postgresql
Pada kasus ini tkjpedia tidak menggunakan postgresql versi terbaru alih alih menggunakan postgresql versi 9.6. Alasan nya adalah kompatibilitas, dimana kong dan konga saat ini belum support postgresql versi baru.
tkjpedia akan menggukan image postgresql dari bitnami berikut: https://hub.docker.com/r/bitnami/postgresql
Statefulset Postgresql
Gunakan statefulset untuk postgresql pada kubernetes. Sesuaikan storageClassName dengan yang kalian digunakan.
buat file bernama statefulset-postgresql.yml
apiVersion: apps/v1 kind: StatefulSet metadata: name: postgresql namespace: tkjpedia spec: selector: matchLabels: name: postgresql serviceName: "postgresql" replicas: 1 minReadySeconds: 0 template: metadata: labels: name: postgresql spec: terminationGracePeriodSeconds: 10 containers: - name: postgresql image: bitnami/postgresql:9.6 ports: - containerPort: 5432 name: 5432app volumeMounts: - name: postgresql mountPath: /bitnami/postgresql env: - name: "POSTGRESQL_USERNAME" value: "postgres" - name: "POSTGRESQL_PASSWORD" value: "rahasia" - name: "POSTGRESQL_DATABASE" value: "kong" volumeClaimTemplates: - metadata: name: postgresql namespace: dev spec: accessModes: [ "ReadWriteOnce" ] # storageClassName: "my-storage-class" resources: requests: storage: 1Gi
Kemudian apply postgres dengan perintah berikut:
kubectl apply -f statefulset-postgresql.yml
Service Postgresql
buat file bernama service-postgresql.yml
apiVersion: v1 kind: Service metadata: name: postgresql-service namespace: tkjpedia labels: name: postgresql spec: ports: - port: 5432 name: 5432app selector: name: postgresql type: ClusterIP
Kemudian apply service dengan perintah berikut:
kubectl apply -f service-postgresql.yml
Install Kong
Untuk kong nya tkjpedia menggunakan image official dari kong berikut: https://hub.docker.com/_/kong
Sebelum menjalankan container kong, kita jalankan dulu database migration dari untuk kong tersebut dengan perintah sebagai berikut:
Job Kong Migration
Sebelum digunakan, kong membutuhkan database migration di awal. Untuk penggunaan sekali pakai, di kubernetes kita bisa menggunakan Job.
apiVersion: batch/v1 kind: Job metadata: name: kong-migration namespace: tkjpedia spec: template: spec: containers: - name: kong-migration image: kong command: ["kong", "migrations", "bootstrap"] env: - name: "KONG_DATABASE" value: "postgres" - name: "KONG_PG_HOST" value: "postgresql-service" - name: "KONG_PG_DATABASE" value: "kong" - name: "KONG_PG_USER" value: "postgres" - name: "KONG_PG_PASSWORD" value: "rahasia" - name: "KONG_PROXY_ACCESS_LOG" value: "/dev/stdout" - name: "KONG_ADMIN_ACCESS_LOG" value: "/dev/stdout" - name: "KONG_PROXY_ERROR_LOG" value: "/dev/stderr" - name: "KONG_ADMIN_ERROR_LOG" value: "/dev/stderr" - name: "KONG_ADMIN_LISTEN" value: "0.0.0.0:8001, 0.0.0.0:8444 ssl" restartPolicy: Never backoffLimit: 1
Kemudian apply job dengan perintah berikut:
kubectl apply -f job-kong.yml
Deployment Kong
apiVersion: apps/v1 kind: Deployment metadata: name: kong namespace: tkjpedia labels: name: kong spec: replicas: 1 selector: matchLabels: name: kong template: metadata: name: kong labels: name: kong spec: containers: - name: kong image: kong ports: - containerPort: 8000 name: http - containerPort: 8443 name: https - containerPort: 8001 name: api-http - containerPort: 8443 name: api-https resources: limits: cpu: 500m memory: 512Mi requests: cpu: 250m memory: 256Mi env: - name: "KONG_DATABASE" value: "postgres" - name: "KONG_PG_HOST" value: "postgresql-service" - name: "KONG_PG_DATABASE" value: "kong" - name: "KONG_PG_USER" value: "postgres" - name: "KONG_PG_PASSWORD" value: "rahasia" - name: "KONG_PROXY_ACCESS_LOG" value: "/dev/stdout" - name: "KONG_ADMIN_ACCESS_LOG" value: "/dev/stdout" - name: "KONG_PROXY_ERROR_LOG" value: "/dev/stderr" - name: "KONG_ADMIN_ERROR_LOG" value: "/dev/stderr" - name: "KONG_ADMIN_LISTEN" value: "0.0.0.0:8001, 0.0.0.0:8444 ssl"
Kemudian apply deployment dengan perintah berikut:
kubectl apply -f deployment-kong.yml
HPA Kong
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: kong namespace: tkjpedia spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: kong minReplicas: 1 maxReplicas: 4 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 80 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 70
Kemudian apply HPA dengan perintah berikut:
kubectl apply -f hpa-kong.yml
Service Kong
apiVersion: v1 kind: Service metadata: name: kong-service namespace: tkjpedia annotations: spec: ports: - name: 8000app port: 8000 protocol: TCP targetPort: 8000 - name: 8443app port: 8443 protocol: TCP targetPort: 8443 - name: 8001app port: 8001 protocol: TCP targetPort: 8001 - name: 8444app port: 8444 protocol: TCP targetPort: 8444 selector: name: kong type: ClusterIP
Kemudian apply service dengan perintah berikut:
kubectl apply -f service-kong.yml
Ingress Kong
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: kong-ingress namespace: tkjpedia generation: 1 annotations: nginx.ingress.kubernetes.io/proxy-body-size: "0" nginx.ingress.kubernetes.io/proxy-read-timeout: "600" nginx.ingress.kubernetes.io/proxy-send-timeout: "600" cert-manager.io/cluster-issuer: lets-encrypt spec: tls: - hosts: - api.tkjpedia.com secretName: api-tkjpedia-com-tls ingressClassName: public rules: - host: api.tkjpedia.com http: paths: - path: / pathType: Prefix backend: service: name: kong-service port: number: 8000
Kemudian apply ingress dengan perintah berikut:
kubectl apply -f ingress-kong.yml
Install Konga
Job Konga Migration
apiVersion: batch/v1 kind: Job metadata: name: konga-migration namespace: tkjpedia spec: template: spec: containers: - name: konga-migration image: pantsel/konga command: ["node", "./bin/konga.js", "prepare"] env: - name: "TOKEN_SECRET" value: "rahasia" - name: "NODE_ENV" value: "development" - name: "KONGA_ENV" value: "development" - name: "DB_ADAPTER" value: "postgres" - name: "DB_URI" value: "postgresql://postgres:rahasia@postgresql-service:5432/konga" restartPolicy: Never backoffLimit: 1
Kemudian apply job dengan perintah berikut:
kubectl apply -f job-konga.yml
Deployment Konga
apiVersion: apps/v1 kind: Deployment metadata: name: konga namespace: tkjpedia labels: name: konga spec: replicas: 1 selector: matchLabels: name: konga template: metadata: name: konga labels: name: konga spec: containers: - name: konga image: pantsel/konga ports: - containerPort: 1337 name: http resources: limits: cpu: 500m memory: 512Mi requests: cpu: 250m memory: 256Mi env: - name: "TOKEN_SECRET" value: "rahasia" - name: "NODE_ENV" value: "development" - name: "DB_ADAPTER" value: "postgres" - name: "DB_URI" value: "postgresql://postgres:rahasia@postgresql-service:5432/konga"
Kemudian apply deployment dengan perintah berikut:
kubectl apply -f deployment-konga.yml
Service Konga
apiVersion: v1 kind: Service metadata: name: konga-service namespace: tkjpedia annotations: spec: ports: - name: 1337app port: 1337 protocol: TCP targetPort: 1337 selector: name: konga type: ClusterIP
Kemudian apply service dengan perintah berikut:
kubectl apply -f service-konga.yml
Ingress Konga
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: konga-ingress namespace: tkjpedia generation: 1 annotations: cert-manager.io/cluster-issuer: lets-encrypt nginx.ingress.kubernetes.io/whitelist-source-range: <ip>/<prefix> # optional whitelist spec: tls: - hosts: - konga.tkjpedia.com secretName: konga-tkjpedia-com-tls ingressClassName: public rules: - host: konga.tkjpedia.com http: paths: - path: / pathType: Prefix backend: service: name: konga-service port: number: 1337
Kemudian apply ingress dengan perintah berikut:
kubectl apply -f ingress-konga.yml
Konfigurasi Konga
Buka domain yang sudah di atur, tadi saya bikin whitelist IP, maka saya harus menggunakan IP yang ada di whitelist, jika tidak maka hasilnya adalah forbidden seperti ini.
Ketika dibuka menggunakan IP yang di whitelist, maka bisa dan muncul formulir pendaftaran.
Setelah mendaftar dan login. Konfigurasikan konga untuk terhubung ke kong menggunakan http dan arahkan ke service nya kong dengan port 8001
Selamat! kong kalian sudah terinstall di kubernetes.
Uji Coba
Coba kita buat service dan route kemudian mengaksesnya.
Buat service
Buat route
Coba kita akses api nya melalui kong api gateway
Selamat!