記錄在采用 ingress-nginx 暴露內(nèi)部服務(wù)的過(guò)程
安裝
ingress-nginx 是 ingress 的一個(gè)實(shí)現(xiàn)鸠真,目前它已經(jīng)被放在 kubernetes
項(xiàng)目下面了括蝠,可見(jiàn)算是親兒子了君旦,可更新頻率也非常高,再加上之前在別的環(huán)境用 nginx 的場(chǎng)景也很多千绪,沒(méi)想太多就覺(jué)得用它了。
在我安裝 ingress-nginx 的時(shí)候,其最新的版本是 0.16.2
橙数。首先遵循文檔先安裝 mandatory.yaml
:
kubectl apply -f \
https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.16.2/deploy/mandatory.yaml
這一步里面做了如下的事情:
- 創(chuàng)建
ingress-nginx
namespace - 部署默認(rèn)的 backend
- 創(chuàng)建相應(yīng)的 ConfigMap
- 創(chuàng)建 ServiceAccount 并授權(quán)
- 部署 nginx-ingress-controller
創(chuàng)建 service 暴露到集群外部
這也是一個(gè)神奇的操作,雖說(shuō) ingress 才是真正將服務(wù)暴露到外面的資源帅戒,但是實(shí)際上反而是一個(gè) service
完成了最終將服務(wù)暴露出去的任務(wù)灯帮。這里我們可以有多種選擇:
要么采用 NodePort
將 service 通過(guò)某一個(gè)特定的端口:
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app: ingress-nginx
要么采用 externalIPS
直接將 service
通過(guò)特定的 IP 暴露出去:
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
spec:
externalIPs:
- <external-ips>
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app: ingress-nginx
這里我采用的是第二種,這樣暴露出來(lái)的服務(wù)更干凈逻住。
然后測(cè)試一下看看是否工作:
curl http://<external-ip>
如果返回 404 說(shuō)明已經(jīng)鏈接到了默認(rèn)的 backend 了钟哥。
暴露服務(wù)到外部
然后我們?cè)賱?chuàng)建一個(gè) ingress
將我們的 java service 暴露到路徑 /api
下:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: openbayes-server-ing
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /api
backend:
serviceName: openbayes-server-svc
servicePort: 80
kubectl apply -f ingress.yaml
然后再?lài)L試一下 curl http://<external-ip>/api
看看是不是可以正常的訪(fǎng)問(wèn)這個(gè) api。
采用 annotation 對(duì)特定服務(wù)做配置
默認(rèn)的 nginx 配置未必適合我們的服務(wù)瞎访,訪(fǎng)問(wèn) Nginx Configuration 可以看到 ingress-nginx 所提供的三種 nginx 配置方式腻贰。其中 ConfigMaps 可以實(shí)現(xiàn)對(duì) nginx 默認(rèn)配置的修改;而 ingress annotation 則可以實(shí)現(xiàn)對(duì)特定 ingress 進(jìn)行配置扒秸。
比如我們的 /api
有上傳文件的需求播演,而默認(rèn)的請(qǐng)求尺寸最大為 1m
會(huì)導(dǎo)致文件上傳報(bào)錯(cuò) 413
,通過(guò)添加注解 nginx.ingress.kubernetes.io/proxy-body-size
可以指定請(qǐng)求大小限制:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: openbayes-server-ing
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "1024m"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /api
backend:
serviceName: openbayes-server-svc
servicePort: 80
每次修改 ingress 后鸦采,nginx-ingress-controller 會(huì)默認(rèn)更新 nginx.conf宾巍,立即生效。