k8s 中的 ingress 使用細節
k8s中的ingress
什麼是ingress
k8s 中使用 Service 為相同業務的 Pod 對象提供一個固定、統一的訪問介面及負載均衡的能力,那麼這些 Service 如何被外部的應用訪問,其中常用的就是藉助於 Ingress
對象。
Ingress 是 Kubernetes 中的一個資源對象,用來管理集群外部訪問集群內部服務的方式。
Ingress 對象由 Ingress Controller
和 Ingress 策略設置來共同完成。
-
Ingress 策略:用來配置不同的轉發規則;
-
Ingress Controller
:Ingress 對象的域名解析都由Ingress Controller
來完成,Ingress Controller 就是一個反向代理程式,它負責解析 Ingress 的反向代理規則,如果 Ingress 有增刪改的變動,所有的Ingress Controller
都會及時更新自己相應的轉發規則,當Ingress Controller
收到請求後就會根據這些規則將請求轉發到對應的 Service。
Ingress 如何使用
這裡來個簡單的 demo 來看下 Ingress 如何使用
1、部署ingress-controller
首先來部署下 Ingress Controller
這是使用的是 ingress-nginx
使用的 k8s 版本是 v1.19.9
,所以這裡選擇的 ingress-nginx 是 v1.1.3
裡面的鏡像是需要FQ的,這裡打包了鏡像到 docker-hub 安裝腳本
$ kubectl apply -f deploy.yaml
2、部署應用
cat <<EOF >./go-web.yaml
# deployment
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: go-web
name: go-web
namespace: study-k8s
spec:
replicas: 5
selector:
matchLabels:
app: go-web
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: go-web
spec:
containers:
- image: liz2019/test-docker-go-hub
name: go-app-container
resources: {}
status: {}
---
# service
apiVersion: v1
kind: Service
metadata:
name: go-web-svc
labels:
run: go-web-svc
spec:
selector:
app: go-web
ports:
- protocol: TCP
port: 8000
targetPort: 8000
name: go-web-http
---
# ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: go-web-ingress
annotations:
kubernetes.io/ingress.class: nginx
spec:
rules:
- host: www.go-web.com
http:
paths:
- path: /index
pathType: Prefix
backend:
service:
name: go-web-svc
port:
number: 8000
EOF
在最下面放了 ingress 的配置,通過 path: /index
將 ingress 請求轉發到 go-web-svc 的 service。
➜ ~ kubectl get ingress -n study-k8s
NAME CLASS HOSTS ADDRESS PORTS AGE
go-web-ingress <none> www.go-web.com 192.168.56.112,192.168.56.111 80 28m
訪問
$ curl '192.168.56.111:80/index' \
--header 'Host: www.go-web.com'
<h1>hello world</h1><div>你好</div>%
ingress 使用細節
1、一個集群中可以有多個 Ingress Controller
, 在 Ingress 中可以指定使用哪一個Ingress Controller
;
2、多個 Ingress 規則可能出現競爭;
3、Ingress 可以為多個命名空間服務;
4、關於如何暴露 ingress 服務,讓外面的服務訪問到?
1、Ingress Controller
用 Deployment 方式部署,給它添加一個 Service,類型為 LoadBalancer,這樣會自動生成一個 IP 地址,通過這個 IP 就能訪問到了,並且一般這個 IP 是高可用的(前提是集群支援 LoadBalancer,通常雲服務提供商才支援,自建集群一般沒有);
2、使用 hostPort;
-
1、
Ingress Controller
用 DaemonSet 方式部署,使用集群內部的某個或某些節點作為邊緣節點,給 node 添加 label 來標識,使用 nodeSelector 綁定到邊緣節點,保證每個邊緣節點啟動一個Ingress Controller
實例,用 hostPort 直接在這些邊緣節點宿主機暴露埠,然後我們可以訪問邊緣節點中Ingress Controller
暴露的埠,這樣外部就可以訪問到Ingress Controller
了; -
2、使用親和性調度策略,使需要部署
Ingress Controller
的節點,每個節點都有一個Ingress Controller
部署,然後用 hostPort 直接在這些邊緣節點宿主機暴露埠,我們就能通過這些節點的 IP 和 hostPort來訪問Ingress Controller
了。
我們上面部署 Ingress Controller
的方式就是使用的 hostPort 對外暴露埠。
參考
【Kubernetes的Ingress是啥】//www.cnblogs.com/chenqionghe/p/11726231.html
【理解k8s 的 Ingress】//www.jianshu.com/p/189fab1845c5
【Ingress】//www.huaweicloud.com/zhishi/Ingress.html
【Ingress 控制器】//kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers/
【k8s中的ingress】//boilingfrog.github.io/2022/11/05/k8s中的ingress/