Giới thiệu
Trong bài này ta tìm hiểu về Gateway API. Một open-source của Kubernetes SIG-NETWORK.
Có rất nhiều công cụ Gateway API trong thị trường. Để thống nhất tiêu chuẩn định nghĩa Gateway thì Kubernetes SIG-NETWORK đã phát triển Kubernetes Gateway API. Bao gồm các resource như: GatewayClass, Gateway, HTTPRoute, TCPRoute.
Với GatewayClass là thằng Gateway Controller đóng vai trò tạo Gateway trên hạ tầng tương ứng. Ví dụ như Cilium, Kong, Istio, …. Trong bài này ta sẽ dùng minikube để dựng Cluster và cài Kubernetes Gateway API + Cilium Gateway Controller.
Cài đặt
Tạo Cluster:
minikube start --network-plugin=cni --cni=false
Cài Cilium CLI (Linux):
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
Cài Kubernetes Gateway API:
kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v0.7.0/standard-install.yaml
Cài Cilium:
helm install cilium cilium/cilium --version 1.14.4 \
--namespace kube-system \
--set kubeProxyReplacement=true \
--set gatewayAPI.enabled=true
Để bật Cilium Gateway Controller ta thêm thuộc tính gatewayAPI.enabled=true
. Để kiểm tra cài thành công ta chạy câu lệnh:
cilium status --wait
/¯¯\
/¯¯\__/¯¯\ Cilium: OK
\__/¯¯\__/ Operator: OK
/¯¯\__/¯¯\ Hubble: disabled
\__/¯¯\__/ ClusterMesh: disabled
\__/
DaemonSet cilium Desired: 2, Ready: 2/2, Available: 2/2
Deployment cilium-operator Desired: 2, Ready: 2/2, Available: 2/2
Containers: cilium-operator Running: 2
cilium Running: 2
Image versions cilium quay.io/cilium/cilium:v1.9.5: 2
cilium-operator quay.io/cilium/operator-generic:v1.9.5: 2
Triển khai ứng dụng đơn giản
Cài ứng dụng demo:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.11/samples/bookinfo/platform/kube/bookinfo.yaml
Ứng dụng ta gồm có hai service chính là Product và Details. Để truy cập Product Service ta gọi vào đường dẫn /
và truy cập vào Detail Service với đường dẫn /details
.
kubectl get pod
details-v1-5498c86cf5-kjzkj 1/1 Running 0 2m39s
productpage-v1-65b75f6885-ff59g 1/1 Running 0 2m39s
ratings-v1-b477cf6cf-kv7bh 1/1 Running 0 2m39s
reviews-v1-79d546878f-r5bjz 1/1 Running 0 2m39s
reviews-v2-548c57f459-pld2f 1/1 Running 0 2m39s
reviews-v3-6dd79655b9-nhrnh 1/1 Running 0 2m39s
Ta sẽ tạo Gateway API để định hướng request tới từng Service. Tạo một tệp tin tên là gw.yaml
:
apiVersion: gateway.networking.k8s.io/v1beta1
kind: Gateway
metadata:
name: demo-gateway
spec:
gatewayClassName: cilium
listeners:
- protocol: HTTP
port: 80
name: web-gw
allowedRoutes:
namespaces:
from: Same
Thuộc tính gatewayClassName
ta chọn Cilium Gateway Controller. Chạy câu lệnh apply
:
kubectl apply -f gw.yaml
Sau khi tạo xong để kiểm tra ta làm như sau:
kubectl get gateway
NAME CLASS ADDRESS READY AGE
demo-gateway cilium 10.100.26.37 True 2h
Tiếp theo để điều hướng request tới ứng dụng ta tạo HTTPRoute, tạo tệp tin tên là gw-route.yaml
:
apiVersion: gateway.networking.k8s.io/v1beta1
kind: HTTPRoute
metadata:
name: http-app-1
spec:
parentRefs:
- name: my-gateway
namespace: default
rules:
- matches:
- path:
type: PathPrefix
value: /details
backendRefs:
- name: details
port: 9080
- matches:
- headers:
queryParams:
- type: Exact
name: great
value: example
path:
type: PathPrefix
value: /
method: GET
backendRefs:
- name: productpage
port: 9080
kubectl apply -f gw-route.yaml
Tiếp theo ta gọi vào Gateway để kiểm tra kết quả, lấy địa chỉ IP của Gateway:
GATEWAY=$(kubectl get gateway my-gateway -o jsonpath='{.status.addresses[0].value}')
Kiểm tra Details Service:
curl --fail -s http://"$GATEWAY"/details/1 | jq
{
"id": 1,
"author": "William Shakespeare",
"year": 1595,
"type": "paperback",
"pages": 200,
"publisher": "PublisherA",
"language": "English",
"ISBN-10": "1234567890",
"ISBN-13": "123-1234567890"
}
Kiểm tra Product Service:
curl -v http://"$GATEWAY"\?great\=example
Kết luận
Vậy là ta đã tìm hiểu xong về cách cài đặt Kubernetes Gateway API + Cilium đơn giản. Bài tiếp theo ta tìm hiểu cách triển khai Kubernetes Gateway với Cilium lên trên EKS.
Nếu bài viết có gì sai hoặc cần cập nhật thì liên hệ Admin.
Tham gia nhóm chat của DevOps VN tại Telegram.
Kém tiếng Anh và cần nâng cao trình độ giao tiếp: Tại sao bạn học không hiệu quả?