Ingress出現的原因
由于每個Service都要有一個負載均衡服務,這種做法實際上既浪費成本又高。作為使用者,我們其實更希望看到Kubernetes内置一個全局的負載均衡器。然後通過我通路的URL,把請求轉發到不同的後端Service。
這種全局的、為了代理不同後端 Service 而設定的負載均衡服務,就是 Kubernetes 裡的 Ingress 服務。
是以,Ingress 的功能其實很容易了解:所謂 Ingress,就是 Service 的“Service”。
執行個體:把tomcat service通過ingress釋出出去
- 部署Nginx Ingress Controller
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/baremetal/deploy.yaml
kubectl get pod -n ingress-nginx -o wide NAME READY STATUS RESTARTS AGE IP NODE nginx-ingress-controller-775d945fdd-xjc7b 1/1 Running 1 30d 10.244.0.248 10.10.13.127
- 部署service-nodeport
service-nodeport服務,實作把叢集外部流量接入到叢集中來。
kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx NodePort 10.100.44.0 <none> 80:31454/TCP,443:31077/TCP 1y
3. 部署tomcat-svc
[[email protected] ingress]# cat tomcat-demo.yaml
apiVersion: v1
kind: Service
#必須設定為無頭service
metadata:
name: tomcat
namespace: default
spec:
selector:
app: tomcat
release: canary
ports:
- name: http
targetPort: 8080 #這是容器port
port: 8080 #這是service port
- name: ajp
targetPort: 8009
port: 8009
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-deploy
namespace: default
spec:
replicas: 2
selector: #标簽選擇器
matchLabels: #比對的标簽為
app: tomcat
release: canary
template:
metadata:
labels:
app: tomcat #和上面的myapp要比對
release: canary
spec:
containers:
- name: tomcat
image: tomcat:8.5.34-jre8-alpine #在https://hub.docker.com/r/library/tomcat/tags/上面找
ports:
- name: http
containerPort: 8080
- name: ajp
containerPort: 8009
kubectl apply -f tomcat-demo.yaml
[[email protected]]$kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tomcat ClusterIP 10.103.174.6 <none> 8080/TCP,8009/TCP 6h
[[email protected]]$kubectl get pods
NAME READY STATUS RESTARTS AGE
tomcat-deploy-85799c8666-4l2hd 1/1 Running 0 6h
tomcat-deploy-85799c8666-6x6f7 1/1 Running 0 6h
4.部署ingress
[[email protected] ingress]# cat ingress-tomcat.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-tomcat
namespace: default #要和deployment和要釋出的service處于同一個名稱空間
annotations: #這個注解說明我們要用到的ingress-controller是nginx,而不是traefic,enjoy
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: tomcat.zhixin.com #表示通路這個域名,就會轉發到後端myapp管理的pod上的服務:
http:
paths:
- path:
backend:
serviceName: tomcat
servicePort: 8080
kubectl apply -f ingress-tomcat.yaml
[[email protected]]$kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
ingress-tomcat tomcat.zhixin.com 80 6h
[[email protected]]$kubectl describe ingress ingress-tomcat
Name: ingress-tomcat
Namespace: testing-wmh
Address:
Default backend: default-http-backend:80 (<none>)
Rules:
Host Path Backends
---- ---- --------
tomcat.zhixin.com
tomcat:8080 (<none>)
Annotations:
Events: <none>
5.本機hosts裡增加域名-ip映射
10.10.13.127 tomcat.zhixin.com
原了解釋:
建立service,能夠從外網通路Ingress controller。這個 Pod 本身,就是一個監聽 Ingress 對象以及它所代理的後端 Service 變化的控制器。當一個新的 Ingress 對象由使用者建立後,nginx-ingress-controller 就會根據 Ingress 對象裡定義的内容,生成一份對應的 Nginx 配置檔案(/etc/nginx/nginx.conf),并使用這個配置檔案啟動一個 Nginx 服務。
nginx server_name對應請求header中的host
參考資料:
https://kubernetes.io/docs/concepts/services-networking/ingress/
https://time.geekbang.org/column/article/69214