UK8S Ingress 配置
kubectl apply -f http://uk8s.cn-bj.ufileos.com/yaml/ingress/nginx/mandatory.yaml
在上述文章第二步的時候,參照 通過外網(wǎng)ULB訪問Service,在 yaml 中添加關(guān)于 ULB 配置的聲明,
具體例如如下:
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
annotations:
service.beta.kubernetes.io/ucloud-load-balancer-id: "ulb-xxx"
service.beta.kubernetes.io/ucloud-load-balancer-vserver-protocol: "TCP"
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
上面是TCP L4層的代理,沒有搞L7,因為存在不同namespace下,需要用到不同 https 證書, 的場景,我們后續(xù)會使用 cert-manager 來解決 https 證書問題。
Nginx 配置
由于特定業(yè)務(wù)的特殊需求,需要對 Nginx 進(jìn)行特殊配置,例如增大客戶端允許上傳數(shù)據(jù)的大小??蓞⒖次臋n Annotation-NGINX Ingress Controller
Multi Ingress
以上是外網(wǎng) Ingress 配置,我們還需要個內(nèi)網(wǎng) ingress 配置,解決思路有兩種,1種是切換另一種 ingress,還有一種是繼續(xù)使用 nginx ingress。我們選擇第二種方案,方便維護(hù)。
具體來講,就是對 http://uk8s.cn-bj.ufileos.com/yaml/ingress/nginx/mandatory.yaml 進(jìn)行定制??蓞⒄?Google Multi Nginx-ingress 文檔,具體步驟如下:
1. 修改 外網(wǎng) Nignx Controller 配置
- 給 外網(wǎng) Nignx Controller 添加 Label, 方便和內(nèi)網(wǎng)區(qū)分開來,如:
ingress-type: outer - 給 外網(wǎng) Ingress 添加 Selector, 內(nèi)容為第一步多加的 Label
2. 修改 Role 配置
nginx-ingress-role 的 resourceNames 添加一行 ingress-controller-leader-internal-nginx。
使得先前創(chuàng)建的 nginx-ingress-serviceaccount 可以操縱將要創(chuàng)建的 internal-nginx。
3. 部署 internal-nginx-controller
kind: ConfigMap
apiVersion: v1
metadata:
name: internal-nginx-configuration
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: internal-tcp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
kind: ConfigMap
apiVersion: v1
metadata:
name: internal-udp-services
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: internal-nginx-ingress-controller
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
template:
metadata:
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
ingress-type: inner
annotations:
prometheus.io/port: "10254"
prometheus.io/scrape: "true"
spec:
serviceAccountName: nginx-ingress-serviceaccount
containers:
- name: internal-nginx-ingress-controller
image: uhub.service.ucloud.cn/library/nginx-ingress-controller:0.23.0
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/internal-nginx-configuration
- --tcp-services-configmap=$(POD_NAMESPACE)/internal-tcp-services
- --udp-services-configmap=$(POD_NAMESPACE)/internal-udp-services
- --publish-service=$(POD_NAMESPACE)/internal-ingress-nginx
- --ingress-class=internal-nginx
- --annotations-prefix=nginx.ingress.kubernetes.io
securityContext:
allowPrivilegeEscalation: true
capabilities:
drop:
- ALL
add:
- NET_BIND_SERVICE
# www-data -> 33
runAsUser: 33
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
initialDelaySeconds: 10
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 10254
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: internal-ingress-nginx
namespace: ingress-nginx
annotations:
service.beta.kubernetes.io/ucloud-load-balancer-id: "ulb-xxx"
service.beta.kubernetes.io/ucloud-load-balancer-vserver-protocol: "TCP"
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
ingress-type: inner
這個 yaml 對比老的來說,修改點有:
- nginx-ingress-controller 的 args、label 和 名稱 ,尤其是
--ingress-class=internal-nginx, Ingress 要用到,前面的 nginx-ingress-role 的修改也和它有關(guān)聯(lián)。 - service 對應(yīng)的內(nèi)網(wǎng)ULB ID,以及 selector 里的
ingress-type: inner。 - ConfigMap 的名稱,如果你想內(nèi)外網(wǎng)都用統(tǒng)一的配置,也可以不改。
Ingress 區(qū)分使用
以上配置默認(rèn)會使用外網(wǎng)Ingress Controller,
內(nèi)網(wǎng) Ingress 的 Annotation 里面要添加 kubernetes.io/ingress.class: internal-nginx, 才能告知 內(nèi)網(wǎng)Ingress Controller 如何 forward 流量。
獲取客戶端IP
參考 UCloud 文檔: https://docs.ucloud.cn/compute/uk8s/service/getresourceip