最近我在學習 Kubernetes,我有問我 K8S 裡面使用 load balance 能不能做到 Cookies 第一次指向到某一台 Server
我那時後才學到 Service ,Service 是使用 iptable 所以應該無法做到
我剛看到 Ingress 章節,應該是可以做到我朋友需求
但仔細想想,探討這個問題也應該沒有意義
使用 K8S 應該就是使用微服務架構,探討 Server 會不會掛掉或更新, Pod 都一定會重置
搜為網路上看一下, 單獨 Ingress 不是可以做到,需要一個 Ingress Controller 才能做到(這邊這個好像就是 nginx 這種東西)
不過,Ingress 和 Ingress Controller
Ingress 本身並沒有提供負載平衡的功能,還需要透過 Ingress Controller 來實現。Ingress Controller 目前主要支援兩種型別 GCE 與 Nginx,而今天我們將透過 Nginx Ingress Controller 在 Kubernetes Cluster 內部架設 load balancer。
來源: [Day 19] 在 Kubernetes 中實現負載平衡 - Ingress Controller - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
2021-02-04
我找到我朋友說的使用 load balance 能不能做到 Cookies 第一次指向到某一台 Server
專有述語叫做 Sticky Session
Nginx Ingress Controller 可以做到
- Sticky Sessions - NGINX Ingress Controller
- Services - Traefik
- Ingress session sticky_总结、分享、交流-CSDN博客
結論還是能做到的
前言
之前有碰過 traefik ,在使用 docker 情況下 ,traefik 是使用 docker label 去抓設定
我原本以為 K8s 應該也差不多
後來看到 Ingress 跟 Ingress Controller 一直在想這件事情
突然想到 Ingress 應該就控制網站Virtual Server(不確定是不是這樣叫) 設定
Ingress Controller 可能是 Apache , nginx (類似這些東西做反向代理)
這樣換不同 Ingress Controller 也不用重新設定
應該是這樣定位吧(我自己想的)
教學還是建議看 [Day 19] 在 Kubernetes 中實現負載平衡 - Ingress Controller - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
我這邊還是以操作紀錄為主
Kind 由於先前發現做 NodePort 會有問題,這邊用 minikube 可能比較不會出狀況
當然官方也是有方法可以避免
可以看一下官方操作方法kind – Ingress
主要是 expose port
Kind 官方設定教學
對應環境設定 (Kind)
1 | kind delete cluster # 確定刪除 |
安裝 Contour (Ingress Controller)
1 | kubectl apply -f https://projectcontour.io/quickstart/contour.yaml |
設定 daemonsets
1 | { |
1 | kubectl patch daemonsets -n projectcontour envoy -p '{"spec":{"template":{"spec":{"nodeSelector":{"ingress-ready":"true"},"tolerations":[{"key":"node-role.kubernetes.io/master","operator":"Equal","effect":"NoSchedule"}]}}}}' |
先設定,之後代研究這個是做什麼用
但我發現這個沒設定好像也能跑 = =a
使用 Ingress
預設好像就有這個,所以不需要特別裝
1 | kind: Pod |
上面建立兩個pod,service,然後新增 Ingress 設定
1 | kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/usage.yaml |
執行內容
1 | # should output "foo" |
查看 Ingress 指令
1 | kubectl get ingress |
kubernetes之ingress error: endpoints “default-http-backend” not found
1 | 翻譯: |
參考:kubernetes之ingress error: endpoints “default-http-backend” not found - Mr.zou - 博客园
使用 host 名稱對應 service
由於書中跟 [Day 19] 在 Kubernetes 中實現負載平衡 - Ingress Controller - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
為了加速實作,這邊使用上面範例
使用 minikube
1 | # 啟用 minikube 的 ingress |
service ,pod , ingress 設定
1 | # 建立測試 pod |
事後想想這邊可以用上面範例 echo 出不同字串
這樣就可以知道用到哪一個 pod
建立兩個測試用 serivce 都倒同一個 service
1 | apiVersion: v1 |
1 | apiVersion: v1 |
1 | kubectl create -f https://raw.githubusercontent.com/zxcvbnius/k8s-30-day-sharing/master/Day19/demo-ingress/helloworld-service.yaml |
確認是否成功
1 | # 進去 node 確認狀況 |
繼續建立 ingress controller
1 | # 官方安裝 nginx ingress controller |
參考 k8s-30-day-sharing/ingress-example-2.yaml at master · zxcvbnius/k8s-30-day-sharing
裡面 service name 有錯誤,建議使用下面複製1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-2
spec:
rules:
- host: helloworld-v1.example.com
http:
paths:
- path: /
backend:
serviceName: helloworld-v1
servicePort: 80
- host: helloworld-v2.example.com
http:
paths:
- path: /
backend:
serviceName: helloworld-v2
servicePort: 80
測試 host 方法
- curl -H
之前在 Raspberry PI 架設 Traefik 初體驗 | 程式狂想筆記這篇有紀錄
通常改 /etc/hosts 檔案或者curl 指令可以做到(這當初看到 traefik 官方文件寫的,還滿神奇的,畢竟很多教學沒這樣教)
- /etc/hosts
1 | # 這個 IP 是 node IP |
SSL termination(代理端做 tls)
ingress-ssl-sceret.yaml1
2
3
4
5
6
7
8
9apiVersion: v1
data:
tls.crt: YmFzZTY0X2VuY29kZWRfY2VydA==
tls.key: YmFzZTY0X2VuY29kZWRfa2V5
kind: Secret
metadata:
name: ssh-secret
namespace: default
type: Opaque
example3-ingress.yaml1
2
3
4
5
6
7
8
9
10apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-3
spec:
tls:
- secretName: ssh-secret
backend:
serviceName: helloworld-v1
servicePort: 3000
運行多個 Ingress Controller
一個叢集中運行多個Ingress 控制器,可以搭配 Annotation 的 kubernetes.io/ingress.class
如果沒有配置 kubernetes.io/ingress.class
,會有多個不同Ingress Controller 搶 Ingress 使用權,並寫入Ingress 件的status 欄位
後面兩個就不先仔細研究
wildcard host
rewrite url
ingress-nginx 中 Rewrite 的使用-阳明的博客|Kubernetes|Istio|Prometheus|Python|Golang|云原生
感想
之前有操作 Traefik 使用 Docker Label 讓 Traefik 可以自動抓到想要的 host
使用 Ingress 來看,這個設計能做到模組化分離,可算非常棒!!
以後有用到 Traefik Ingress 再回來填坑