Kubernetes 提供了兩種負載均衡的機制用於發布公共服務,一種是工作在傳輸層的Service資源,一種是Ingress資源。前者只能實現”TCP負載均衡”,而無法實現 HTTPS 協議,而Ingress 的出現為我們提供了應用層HTTP(S)的訪問能力。
部署 Ingress Controller
Ingress 是 Kubernetes API 的標准類型資源,它是一組 基於DNS 名稱或者 URL 路徑把用戶請求轉發到指定的Service資源的規則,用於將集群外部的請求流量轉發至集群內部完成服務發布。然而, Ingress 本身並不能進行流量轉發,它僅僅是一組路由規則,如果想要真正的使這對規則生效,則需要先部署 Ingress 的控制器,Ingress 控制器能夠監聽某一個套接字,然后根據Ingress上的路由規則對用戶的請求進行轉發。
~]# kubectl apply -f https://raw.githubusercontent.com/imirsh/kubernetes/master/mainfests/ingress-nginx/v0.33.0/deploy.yaml
驗證安裝
確認 ingress controller pods 是否啟動
~]# kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watch
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-hh2ht 0/1 Completed 0 20m
ingress-nginx-admission-patch-9npbv 0/1 Completed 0 20m
ingress-nginx-controller-566d9467c5-8lssn 1/1 Running 0 20m
~]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.103.127.175 <none> 80:30080/TCP,443:30443/TCP 21m
ingress-nginx-controller-admission ClusterIP 10.98.11.81 <none> 443/TCP 21m
測試http 7層負載
部署了完 ingress-nginx后,部署了一個 deployment,並它創建了一個名為 myapp-svc-v1 的 service:
~]# vim myapp-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-http-v1
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: myapp-v1
version: v1
template:
metadata:
namespace: default
labels:
app: myapp-v1
version: v1
spec:
containers:
- name: myapp-v1
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: myapp-svc-v1
namespace: default
labels:
app: myapp-v1
version: v1
spec:
type: ClusterIP
selector:
app: myapp-v1
version: v1
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
然后創建對應的一個ingress對象來暴露集群里這個 deployment 的 http 服務:
~]# vim ingress-myapp.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-myapp-v1
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: myapp-v1.linux.io
http:
paths:
- path: /
backend:
serviceName: myapp-svc-v1
servicePort: 80
hosts 文件解析后,即可通過域名訪問了
~]# curl http://myapp-v1.linux.io:30080/
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>