Ingress
可以簡單的理解成k8s
內(nèi)部的nginx
, 用作負載均衡器, 這樣是有很多好處的.
- 動態(tài)配置服務(wù)
如果按照傳統(tǒng)方式, 當新增加一個服務(wù)時, 我們可能需要在流量入口加一個反向代理
指向我們新的k8s服務(wù). 而如果用了Ingress
, 只需要配置好這個服務(wù), 當服務(wù)啟動時, 會自動注冊到Ingress的中, 不需要而外的操作.
- 減少不必要的端口暴露
配置過k8s的都清楚, 第一步是要關(guān)閉防火墻
的, 主要原因是k8s的很多服務(wù)會以NodePort
方式映射出去, 這樣就相當于給宿主機打了很多孔, 既不安全也不優(yōu)雅. 而Ingress
可以避免這個問題, 除了Ingress自身服務(wù)可能需要映射出去, 其他服務(wù)都不要用NodePort方式.
配置Ingress服務(wù)
相關(guān)配置文件參照
http://res.yinnote.com/kubernetes/traefik/
首先是授權(quán)相關(guān)
traefik-ingress-rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: traefik-ingress
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: traefik-ingress
subjects:
- kind: ServiceAccount
name: traefik-ingress
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
這個文件的內(nèi)容比較固定, 注意
ServiceAccount
的name
就可以了
創(chuàng)建Ingress
服務(wù)
traefik-ingress-lb.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: traefik-ingress-lb
namespace: kube-system
labels:
k8s-app: traefik-ingress-lb
spec:
replicas: 2
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
restartPolicy: Always
serviceAccountName: traefik-ingress
containers:
- image: traefik
name: traefik-ingress-lb
args:
- --web
- --kubernetes
---
kind: Service
apiVersion: v1
metadata:
name: traefik-ingress-service
namespace: kube-system
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
- port: 80
targetPort: 80
nodePort: 30080
type: NodePort
這里我將
Ingress
其中一個服務(wù)的端口通過NodePort
方式映射出去了, 當然網(wǎng)上很多教材, 包括官方的文檔都是用hostNetwork
方式, 也就是直接將容器的端口, 映射到宿主機的端口. 這里主要是因為我的80端口被占用了. 所以我還需要用nginx配置反向代理到這個非80端口的服務(wù)上
將web-ui
服務(wù)加入Ingress
traefik-web-ui.yaml
apiVersion: v1
kind: Service
metadata:
name: traefik-web-ui
namespace: kube-system
spec:
selector:
k8s-app: traefik-ingress-lb
ports:
- name: web
port: 80
targetPort: 8080
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: traefik-web-ui
namespace: kube-system
spec:
rules:
- host: traeflk.yinnote.com
http:
paths:
- path: /
backend:
serviceName: traefik-web-ui
servicePort: web
很多時候, 我們會把
Ingress
配置和Service
配置放在一起, 注意servicePort
的值, 和上面service
配置的ports
name
相對應(yīng)
以下是我配置的一些Ingress服務(wù)
查看相關(guān)服務(wù)情況
附:
對于host
的配置, 有兩種解決方案
- 每次添加了一個服務(wù), 將相對應(yīng)的域名指向k8s服務(wù)器
- 如果服務(wù)都是用同一個域名的二級域名, 可以將比如
*.yinnote.com
全部指向k8s服務(wù)器, 這樣只要我們在ingress
里面配置的host
都會指向k8s服務(wù)器 - 如果有使用
linkerd
, 可以將這個host
配置任意的域名, 但在請求這個服務(wù)的時候, 一定要將請求頭
中的host
改成所配置的域名, 這種方式我個人不推薦