本次實踐的主要目的就是將入口統一,不再通過 LoadBalancer 等方式將端口暴露出來,而是使用 Ingress 提供的反向代理負載均衡功能作爲我們的唯一入口。
kubernetes 版本爲1.16.0
部署tomcat
部署 Tomcat 但僅允許在內網訪問,我們要通過 Ingress 提供的反向代理功能路由到 Tomcat 之上
apiVersion: apps/v1
kind: Deployment
metadata:
name: tomcat-app
spec:
selector:
matchLabels:
app: tomcat
replicas: 2
template:
metadata:
labels:
app: tomcat
spec:
containers:
- name: tomcat
image: tomcat:8.5.47
ports:
# 容器的默認端口
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-http
spec:
ports:
# service 的端口
- port: 8081
# 容器默認端口,也就是將servcie8081 映射到 pods8080
targetPort: 8080
# ClusterIP, NodePort, LoadBalancer
type: ClusterIP
selector:
app: tomcat
安裝Nginx Ingress Controller
Ingress Controller 有許多種,我們選擇最熟悉的 Nginx 來處理請求,其它可以參考
mkdir -p /usr/local/kubernetes/yaml/ingress
cd /usr/local/kubernetes/yaml/ingress
# 下載配置文件
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.27.1/deploy/static/mandatory.yaml
修改配置文件vim mandatory.yaml
,找到配置如下位置 (搜索 serviceAccountName
) 在下面增加一句 hostNetwork: true
191 kind: Deployment
192 metadata:
193 name: nginx-ingress-controller
194 namespace: ingress-nginx
195 labels:
196 app.kubernetes.io/name: ingress-nginx
197 app.kubernetes.io/part-of: ingress-nginx
198 spec:
199 replicas: 1 # 建立改成多個.如 3
200 selector:
201 matchLabels:
202 app.kubernetes.io/name: ingress-nginx
203 app.kubernetes.io/part-of: ingress-nginx
204 template:
205 metadata:
206 labels:
207 app.kubernetes.io/name: ingress-nginx
208 app.kubernetes.io/part-of: ingress-nginx
209 annotations:
210 prometheus.io/port: "10254"
211 prometheus.io/scrape: "true"
212 spec:
213 # wait up to five minutes for the drain of connections
214 terminationGracePeriodSeconds: 300
215 serviceAccountName: nginx-ingress-serviceaccount
# 增加 hostNetwork: true,意思是開啓主機網絡模式,暴露 Nginx 服務端口 80
216 hostNetwork: true
217 nodeSelector:
218 kubernetes.io/os: linux
219 containers:
220 - name: nginx-ingress-controller
221 image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:master
222 args:
223 - /nginx-ingress-controller
224 - --configmap=$(POD_NAMESPACE)/nginx-configuration
225 - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
226 - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
227 - --publish-service=$(POD_NAMESPACE)/ingress-nginx
228 - --annotations-prefix=nginx.ingress.kubernetes.io
'''''''''
部署Ingress(即網關)
cd /usr/local/kubernetes/yaml/ingress
vim ingress.yml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: nginx-web
annotations:
# 指定 Ingress Controller 的類型
kubernetes.io/ingress.class: "nginx"
# 指定我們的 rules 的 path 可以使用正則表達式
nginx.ingress.kubernetes.io/use-regex: "true"
# 連接超時時間,默認爲 5s
nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
# 後端服務器迴轉數據超時時間,默認爲 60s
nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
# 後端服務器響應超時時間,默認爲 60s
nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
# 客戶端上傳文件,最大大小,默認爲 20m
nginx.ingress.kubernetes.io/proxy-body-size: "10m"
# URL 重寫
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
# 路由規則
rules:
# 主機名,只能是域名,修改爲你自己的
- host: k8s.test.com
http:
paths:
- path:
backend:
# 後臺部署的 Service Name,與上面部署的 Tomcat 對應
serviceName: tomcat-http
# 後臺部署的 Service Port,與上面部署的 Tomcat 對應
servicePort: 8081