前言
在還沒設定 Ingress 前,我們的Service服務會設成 NodePort 來讓外部訪問使用
但若服務一多則會造成混亂,且還要提供Port號才能讓外部訪問
而kubernetes 官方文件 - Ingress 可以讓我們透過設定Domain的方式 導引至不同的Service
然而 Ingress 的負載平衡功能 需由 Ingress Controller 提供
目前有許多 Ingress Controller 可供使用 可參考 kubernetes 官方文件 - Ingress Controllers
Kubernetes 維護了 ingress-gce 和 ingress-nginx,在GKE上 有預設提供 ingress-gce controller 可供使用
但在地端 則需要自行安裝 ingress controller
本文紀錄 如何 安裝 ingress-nginx
前置作業
預先準備
- K8S 環境 參考 w4560000 - 以 kubeadm 架設 K8S Cluster
- DockerImage w4560000 - .Net Core 3.1 WebAPI Build 的 Image 當範例,可自行選用其他 Image 操作
設定 Deployment、Service
記得設定成自己的 GCP ProjectID
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Namespace
metadata:
name: web-sample
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: dockersample-webapi
labels:
app: dockersample-webapi
namespace: web-sample
spec:
selector:
matchLabels:
app: dockersample-webapi
replicas: 1
template:
metadata:
labels:
app: dockersample-webapi
spec:
containers:
- name: web-container
image: 'asia.gcr.io/$GCP ProjectID/dockersample_webapi'
ports:
- name: http
containerPort: 80
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: dockersample-webapi
namespace: web-sample
spec:
type: ClusterIP
ports:
- name: http-port
port: 80
targetPort: 80
protocol: TCP
selector:
app: dockersample-webapi
EOF
# 輸出
namespace/web-sample created
deployment.apps/dockersample-webapi created
service/dockersample-webapi created
確認物件
kubectl get all -n web-sample
# 輸出
NAME READY STATUS RESTARTS AGE
pod/dockersample-webapi-7d66f7cdb7-57zgm 1/1 Running 0 109s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dockersample-webapi ClusterIP 10.106.152.16 <none> 80/TCP 109s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/dockersample-webapi 1/1 1 1 109s
NAME DESIRED CURRENT READY AGE
replicaset.apps/dockersample-webapi-7d66f7cdb7 1 1 1 109s
先測試服務 確認服務正常
curl -i http://10.106.152.16/weatherforecast
# 輸出
HTTP/1.1 200 OK
Date: Thu, 05 May 2022 15:57:02 GMT
Content-Type: text/plain; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked
dockerSample_Service
若要清除物件 重新建立 可參考
kubectl delete all --all -n web-sample kubectl delete ns web-sample
安裝 ingress-nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/cloud/deploy.yaml
設定 Ingress
cat <<EOF | kubectl create -f -
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
namespace: web-sample
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "false"
nginx.ingress.kubernetes.io/force-ssl-redirect: "false"
spec:
ingressClassName: nginx
rules:
- host: leozhengtest.dockersample-webapi.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: dockersample-webapi
port:
number: 80
EOF
查看 Ingress IP (因有安裝 MetalLB 會自動分配 IP Address,流程可參考 w4560000 - 地端 K8S 設定 MetalLB)
kubectl get ing -n web-sample -o wide
# 輸出
NAME CLASS HOSTS ADDRESS PORTS AGE
web-ingress nginx leozhengtest.dockersample-webapi.com 10.240.0.1 80 12m
新增 domain 測試
vi /etc/hosts
10.240.0.1 leozhengtest.dockersample-webapi.com
測試 Ingress 服務 確認是否有導向 dockersample-webapi 的 service
curl -i http://leozhengtest.dockersample-webapi.com/weatherforecast
補充
ingress-nginx 不強制轉導 https
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:
labels:
app: ingress-nginx
name: nginx-configuration
namespace: ingress-nginx
data:
ssl-redirect: "false"
hsts: "false"
EOF
轉載請註明來源,若有任何錯誤或表達不清楚的地方,歡迎在下方評論區留言,也可以來信至 leozheng0621@gmail.com
如果文章對您有幫助,歡迎斗內(donate),請我喝杯咖啡