記錄在采用 ingress-nginx 暴露內(nèi)部服務的過程
安裝
ingress-nginx 是 ingress 的一個實現(xiàn),目前它已經(jīng)被放在 kubernetes 項目下面了,可見算是親兒子了,可更新頻率也非常高,再加上之前在別的環(huán)境用 nginx 的場景也很多,沒想太多就覺得用它了。
在我安裝 ingress-nginx 的時候,其最新的版本是 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-nginxnamespace - 部署默認的 backend
- 創(chuàng)建相應的 ConfigMap
- 創(chuàng)建 ServiceAccount 并授權(quán)
- 部署 nginx-ingress-controller
創(chuàng)建 service 暴露到集群外部
這也是一個神奇的操作,雖說 ingress 才是真正將服務暴露到外面的資源,但是實際上反而是一個 service 完成了最終將服務暴露出去的任務。這里我們可以有多種選擇:
要么采用 NodePort 將 service 通過某一個特定的端口:
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 通過特定的 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
這里我采用的是第二種,這樣暴露出來的服務更干凈。
然后測試一下看看是否工作:
curl http://<external-ip>
如果返回 404 說明已經(jīng)鏈接到了默認的 backend 了。
暴露服務到外部
然后我們再創(chuàng)建一個 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
然后再嘗試一下 curl http://<external-ip>/api 看看是不是可以正常的訪問這個 api。
采用 annotation 對特定服務做配置
默認的 nginx 配置未必適合我們的服務,訪問 Nginx Configuration 可以看到 ingress-nginx 所提供的三種 nginx 配置方式。其中 ConfigMaps 可以實現(xiàn)對 nginx 默認配置的修改;而 ingress annotation 則可以實現(xiàn)對特定 ingress 進行配置。
比如我們的 /api 有上傳文件的需求,而默認的請求尺寸最大為 1m 會導致文件上傳報錯 413,通過添加注解 nginx.ingress.kubernetes.io/proxy-body-size 可以指定請求大小限制:
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 會默認更新 nginx.conf,立即生效。