Kubernetes 使用 ingress-nginx

記錄在采用 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

這一步里面做了如下的事情:

  1. 創(chuàng)建 ingress-nginx namespace
  2. 部署默認的 backend
  3. 創(chuàng)建相應的 ConfigMap
  4. 創(chuàng)建 ServiceAccount 并授權(quán)
  5. 部署 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,立即生效。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,511評論 19 139
  • 1、基礎(chǔ)架構(gòu) 1.1 Master Master節(jié)點上面主要由四個模塊組成:APIServer、scheduler...
    阿斯蒂芬2閱讀 11,141評論 0 44
  • Kubernetes是Google開源的容器集群管理系統(tǒng),其提供應用部署、維護、 擴展機制等功能,利用Kubern...
    devabel閱讀 6,519評論 0 13
  • 簡介 kubernetes 使用service和ingress共同構(gòu)建了,外部訪問k8s內(nèi)部容器的通道。 Serv...
    梅_梅閱讀 1,077評論 0 2
  • 1.VR和AR的黎明 VR和AR行業(yè)已達到了炒作周期的高峰,2017年,對制造軟件早期開發(fā)者而言是至關(guān)重要的時期,...
    科技銀兒閱讀 399評論 0 0

友情鏈接更多精彩內(nèi)容