Kubernetes實錄系列記錄文檔完整目錄參考: Kubernetes實錄-目錄
相關記錄鏈接地址 :
一、kubernetes暴露服務模式介紹。
Kubernetes暴露服務的方式有3種,分別爲
- LoadBlancer Service
LoadBlancer Service 是 kubernetes 深度結合雲平臺,使用 LoadBlancer Service 暴露服務時,實際上是通過向底層雲平臺申請創建一個負載均衡器來向外暴露服務。支持的雲平臺還是很廣泛的,例如GCE、DigitalOcean,AWS,阿里雲,OpenStack等。 - NodePort Service
實質上就是通過在集羣的每個 node 上暴露一個端口(默認範圍:30000-32767,可以在apiserver啓動命令中修改)。由於安全性弱以及管理不方便,實際使用較少。在小規模集羣中使用還是挺方便的。 - Ingress
通過 Ingress,用戶可以實現使用 開源的反向代理負載均衡器(例如nginx)實現對外暴露服務。分爲3個組件:反向代理負載均衡器,Ingress Controller和ingress。- 反向代理負載均衡器 nginx, traefik,haproxy等,可以額外部署,例如使用deployment,daemonset等
- Ingress Controller 通過不斷地訪問 kubernetes API ,實時的感知後端 service、pod 等變化,比如新增和減少 pod,service 增加與減少等;當得到變化信息後,再結合 Ingress 生成配置,更新反向代理負載均衡器刷新其配置,達到服務發現的作用
- Ingress 規則定義,用於轉發請求進行服務發現和負載均衡,相當於請求路由。
Traefik 是一個爲了讓部署微服務更加便捷而誕生的現代HTTP反向代理、負載均衡工具。 它支持多種後臺 (Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd, Zookeeper, BoltDB, Rest API, file…) 來自動化、動態的應用它的配置文件設置。
更多介紹,參考官方網站: https://docs.traefik.io/
traefik 在Kubernetes中的部署方式有2種: Deployment 以及DaemonSet。區別主要是:
- 相比一個節點只部署一個daemonset的traefik,採用deployment會更易於伸縮和擴展;
- Daemonset可以利用taints和tolerations字段在自定義的節點上部署traefik服務;
- 採用Daemonset方式,可以在任何節點上訪問80和443端口,而使用deployment者必須依賴service裏面定義的對象去訪問,端口使用Nodeport模式暴露。
我的環境使用DaemonSet模式,在Kubernetes的3個master節點部署。直接使用hostport方式暴露80端口作爲默認的負載均衡器。非默認負載均衡器採用Deployment方式部署以滿足其他獨立業務的需要。本記錄是DaemonSet模式部署。
二、使用DaemonSet模式部署traefik(在kubernetes master節點)
1. kubernetes環境
主機名稱 | ip地址 | 操作系統 | 角色 | 軟件版本 | 備註 |
---|---|---|---|---|---|
ejucsmaster-shqs-1 | 10.99.12.201 | CentOS 7.5 | proxy, master,traefik | DaemonSet | |
ejucsmaster-shqs-2 | 10.99.12.202 | CentOS 7.5 | proxy, master,traefik | DaemonSet | |
ejucsmaster-shqs-3 | 10.99.12.203 | CentOS 7.5 | proxy, master,traefik | DaemonSet | |
ejucsnode-shqs-1 | 10.99.12.204 | CentOS 7.5 | worker | ||
ejucsnode-shqs-2 | 10.99.12.205 | CentOS 7.5 | worker | ||
ejucsnode-shqs-2 | 10.99.12.206 | CentOS 7.5 | worker |
2. 從GitHub下載treafik部署文件
mkdir -p kubernetes/traefik
cd kubernetes/traefik
wget https://github.com/containous/traefik/archive/v1.7.8.zip
unzip v1.7.8.zip
cd traefik-1.7.8/examples/k8s/
# tree
.
├── cheese-default-ingress.yaml
├── cheese-deployments.yaml
├── cheese-ingress.yaml
├── cheese-services.yaml
├── cheeses-ingress.yaml
├── traefik-deployment.yaml
├── traefik-ds.yaml # DaemonSet模式文件
├── traefik-rbac.yaml # rbac
└── ui.yaml # 使用treafik代理traefik-ui的配置文件
這裏使用的DaemonSet,只是用traefik-ds.yaml ,traefik-rbac.yaml , ui.yaml
3. 部署traefik
3.1 rbac
kubectl apply -f traefik-rbac.yaml
kubectl get clusterrole
traefik-ingress-controller 3h29m
3.2 treafik
github上下載的部署文件traefik-ds.yaml,會在所有節點部署traefik,而我們只需要在3個master節點部署,因此需要添加nodeSelector過濾。
# cat traefik-ds.yaml
# ...
kind: DaemonSet
apiVersion: extensions/v1beta1
# ...
spec:
template:
# ...
spec:
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 60
#=================添加nodeSelector信息:只在master節點創建===================
tolerations:
- key: node-role.kubernetes.io/master
operator: "Equal"
value: ""
effect: NoSchedule
nodeSelector:
node-role.kubernetes.io/master: ""
#=========================================================================
containers:
- image: traefik
name: traefik-ingress-lb
# ...
kubectl apply -f traefik-ds.yaml
kubectl get svc -n kube-system
traefik-ingress-service ClusterIP 10.107.214.109 <none> 80/TCP,8080/TCP 4h37m
kubectl get pods -n kube-system -o wide
traefik-ingress-controller-4dcwd 1/1 Running 0 4h38m 192.168.2.4 ejucsmaster-shqs-3 <none> <none>
traefik-ingress-controller-dc5s4 1/1 Running 0 4h38m 192.168.1.3 ejucsmaster-shqs-2 <none> <none>
traefik-ingress-controller-dmn5w 1/1 Running 0 4h38m 192.168.0.4 ejucsmaster-shqs-1 <none> <none>
3.3 訪問測試
以上treafik daemonset方式部署完成,可以通過master_ip:8080訪問traefik-ui,例如10.99.12.201:8080
可以看到目前裏面什麼都沒有,因爲我們只是配置好了traefik,但是還沒有使用。
4. traefik-ui使用traefik進行代理(相當於一個demo實驗)
上面3.3節使用的是master_ip:8080(traefik_ui服務端口,可以修改),現在我們使用traefik來代理traefik-ui,我們使用域名traefik-ui.ejuops.com(該域名不存在,使用配置hosts的方式訪問).
4.1 配置traefik代理traefik-ui
# cat ui.yaml
# 具體內容根據實際情況修改,例如port,name,host等。
---
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根據實際情況進行修改。
- host: traefik-ui.ejuops.com
http:
paths:
- path: /
backend:
serviceName: traefik-web-ui
servicePort: web
kubectl apply -f ui.yaml
kubectl get svc -n kube-system
traefik-web-ui ClusterIP 10.107.53.86 <none> 80/TCP 2s
kubectl get ingress -n kube-system
NAME HOSTS ADDRESS PORTS AGE
traefik-web-ui traefik-ui.ejuops.com 80 29s
4.2 在主機上配置hosts文件(瀏覽器主機)
# C:\Windows\System32\drivers\etc\hosts
...
10.99.12.201 traefik-ui.ejuops.com
4.3 通過域名訪問traefik-ui
http://traefik-ui.ejuops.com 可以看到treafik-ui的代理情況(frontends,backends,Health),目前只有這個使用使用了代理。
以上使用daemonset配置treafik完成。