使用 Kubernetes Ingress
虛擬 K8s 服務將於建立時自動安裝 Ingress-Nginx Controller。關於 Ingress-Nginx Controller 的詳細說明,請參考此文件。本文將介紹如何設置和使用 Kubernetes Ingress。
開始之前
- 請先參考此文件建立並存取 K8s 叢集。
操作步驟
使用 Kubernetes Ingress 的步驟大致如下,以下將更詳細說明各步驟的操作流程。
- Step 1. 建立 pod,提供後端伺服器服務。
- Step 2. 建立 load balancer,提供後端伺服器服務的對外端點。
- Step 3. 建立 ingress,提供集群路由轉發功能,讓 HTTP request 可以正確地傳遞到後端伺服器服務中。
Step 1. 建立 pod
- 首先建立一個 echo server,並同時建立對應的 Kubernetes service 元件
vim echoserver.yaml
apiVersion: v1
kind: Pod
metadata:
name: echo-server
namespace: ingress-test
labels:
app: echo-server
spec:
containers:
- name: echo-server
image: gcr.io/google-containers/echoserver:1.10
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: echo-server-service
namespace: ingress-test
spec:
selector:
app: echo-server
ports:
- protocol: TCP
port: 2145
targetPort: 8080
注意
以上範例建立在 ingress-test 這個 namespace 之下,若尚未建立該 namespace,可以參考以下步驟建立 namespace。
vim ingresstest.yaml
apiVersion: v1
kind: Namespace
metadata:
name: ingress-test
- 套用設定
kubectl apply -f ingresstest.yaml
- 驗證 namespace 已建立
kubectl get ns
- 套用設定
kubectl apply -f echoserver.yaml
進行驗證
- 確認 pod 已建立
kubectl get po -n ingress-test
- 進入 pod
kubectl exec -it -n ingress-test <pod_name> -- bash
- 使用 curl 確認服務是否正常
curl localhost:8080
- 若使用其他 pod 則可用 cluster ip 透過 2145 port 來連線
kubectl get svc -n ingress-test
curl <cluster_ip>:2145
Step 2. 建立 load balancer
此步驟用於提供上述 echo server 對外 IP,讓外部使用者可以透過此 IP 連線至 echo server。
需注意此 load balancer 所在的 namespace 必須為 ingress-nginx
。另外可透過 spec.loadbalancerSourceRanges
設定 IP 白名單,限制特定範圍的 IP 進入。
vim ingress-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/instance: ingress-nginx
app.kubernetes.io/component: controller
name: loadbalancer-ingress-nginx
namespace: ingress-nginx
#annotations:
#loadbalancer.openstack.org/proxy-protocol: "true"
spec:
type: LoadBalancer
# 以下可限制來源IP白名單,以下範例僅允許10.96.150.0 - 10.96.150.255範圍的IP進入
# loadBalancerSourceRanges:
# - 10.96.150.0/24
externalTrafficPolicy: Cluster
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
- name: https
port: 443
protocol: TCP
targetPort: https
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
- 套用設定
kubectl apply -f ingress-svc.yaml
- 進行驗證
kubectl get svc -n ingress-nginx
Step 3. 建立 ingress
- 建立 ingress,設定對應的 url 或 path,以下範例為任何路徑為
/vkstestpath
的請求都轉送到 echo server 中。
vim ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: echo-ingress
namespace: ingress-test
# 以下可使用Ingress功能進行來源IP白名單
# annotations:
# nginx.ingress.kubernetes.io/whitelist-source-range: 140.110.154.116/32
spec:
rules:
- http:
paths:
- path: /vkstestpath
pathType: Prefix
backend:
service:
name: echo-server-service
port:
number: 2145
- 套用設定
kubectl apply -f ingress.yaml
- 進行驗證,於 Kubernetes 集群外使用 curl,透過 load balancer IP 與路徑(
/vkstestpath
)來確認是否可以連線至 echo server
curl <loadbalancer_ip>/vkstestpath