這個網上有一些參考,
最終我都測試在成功,並運用到在公司了。
作一個記錄.
============================
概念
ingress可以簡單理解爲service的service,他通過獨立的ingress對象來制定請求轉發的規則,把請求路由到一個或多個service中。這樣就把服務與請求規則解耦了,可以從業務維度統一考慮業務的暴露,而不用爲每個service單獨考慮。
ingress可以簡單理解爲service的service,他通過獨立的ingress對象來制定請求轉發的規則,把請求路由到一個或多個service中。這樣就把服務與請求規則解耦了,可以從業務維度統一考慮業務的暴露,而不用爲每個service單獨考慮。
在同一個k8s集羣裏,部署兩個ingress nginx。一個deploy部署給A的API網關項目用。另一個daemonset部署給其它項目作域名訪問用。這兩個項目的更新頻率和用法不一致,暫時不用合成一個。
方案
A項目組的,按標準的yaml文檔作部署。而更改daemonset的配置文件,讓其支持不同的ingress-class名稱。
步驟
1.更新ingress-controller的啓動參數(在yaml文件中)
containers:
- name: nginx-ingress-controller
image: harbor.demo.cn/3rd_part/nginx-ingress-controller:0.26.1
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/udp-services
- --annotations-prefix=nginx.ingress.kubernetes.io
# - --publish-service=$(POD_NAMESPACE)/ingress-nginx
- --report-node-internal-ip-address
- --ingress-class=ngx-ds
- --election-id=ingress-controller-leader-bg
- λ--ingress-class=ngx-ds 當設置這個參數後只會Watch Ingress class爲 ngx-ds的
- λ--election-id= ingress-controller-leader-bg 用於Ingress狀態更新的選舉ID。(默認ingress-controller-leader)
- λ--report-node-internal-ip-address 默認情況下是–publish-service但是在裸機部署的時候要使用kubectl get ingress無法顯示ADDRESS,所以我們需要使用–report-node-internal-ip-address參數
- λ--publish-service=$(POD_NAMESPACE)/ingress-nginx 非公有云情況下使用kubectl get ingress無法顯示ADDRESS
2.更新configmap對應的resourceName(在yaml文件中)
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: Role
metadata:
name: nginx-ingress-role
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
rules:
- apiGroups:
- ""
resources:
- configmaps
- pods
- secrets
- namespaces
verbs:
- get
- apiGroups:
- ""
resources:
- configmaps
resourceNames:
# Defaults to "-"
# Here: "-"
# This has to be adapted if you change either parameter
# when launching the nginx-ingress-controller.
# - "ingress-controller-leader-nginx"
- "ingress-controller-leader-bg-ngx-ds"
- λ注意:這裏的名稱是<election-id>-<ingress-class>拼接而成
- λ此段主要是允許訪問一個叫ingress-controller-leader-ngx-ds的configmap(通過RoleBinding綁定從而限制針對某一個命名空間中定義的一個ConfigMap實例的訪問)
3.更新ClusterRole對應的name(在yaml文件中)
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
name: nginx-ingress-ds-clusterrole
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
4.更新ClusterRoleBinding對應的roleRefName(在yaml文件中)
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
name: nginx-ingress-clusterrole-ds-binding
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: nginx-ingress-ds-clusterrole
subjects:
- kind: ServiceAccount
name: nginx-ingress-serviceaccount
namespace: ingress-nginx
##### 有了前面4步,纔可以讓ingress nginx在不同的namespace及cluster範圍內完全隔開。
##### 官網文檔,及網上大多數文檔,並未涉及第3,4兩步。我今天遇到rbac權限問題了。切記切記。
5.應用到羣集
Kubectl apply -f (SIS-ITIL-INGRESS-NGX)
6.更改Ingress配置文件,指向新的ingress實例。
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: other-ngx-k8s
namespace: other-ngx
annotations:
kubernetes.io/ingress.class: "ngx-ds"
spec:
rules:
- host: other-ngx-k8s.demo.com.cn
http:
paths:
- path: /
backend:
serviceName: other-ngx-k8s-ngx-svc
servicePort: 9001