Kubernetes中安裝traefik ingress
# 下載配置清單
wget https://github.com/containous/traefik/tree/v1.7/examples/k8s
# 連接中以traefik-開頭的文件有3個,均可以見名知意,其中traefik-deployment.yaml咱們這裏沒有用到
# traefik-deployment.yaml跟traefik-ds.yaml兩者選其一便可,因爲底下的配置是根據traefik-ds.yaml來的因此建議使用
# ui.yaml 是定義traefik 的dashboard的svc及ingress 這裏沒有用是由於8080端口直接監聽在node上的
下載上面連接中如下兩個文件
traefik-rbac.yaml traefik-ds.yaml
# 因爲默認經過svc使用NodePort,且端口範圍只能是30000-32767,若是kubernetes是編譯安裝的則可自定義端口範圍
# 這裏使用的是kubeadm安裝的,因此只能使用30000-32767了
# 這裏說下爲何使用30000-32767端口範圍不方便,主要是由於內部一些項目須要調用其餘項目的域名,而域名則是經過
# ingress來發布對外服務的,若是不是80端口的話就須要在 ingress前端再加個nginx或者是流量繞到網關防火牆再回來
# 這樣就極其不方便及內部訪問耗時
# 因此這裏咱們須要作的是將 traefik的容器(traefik-ds.yaml這個文件中定義的資源)使用hostNetwork的方式共享主機的網絡空間來監聽80端口
# 接下來,來修改traefik-ds.yaml中定義的資源清單
vim traefik-ds.yaml
# 在DaemonSet.spec.template.spec 下加入
# ...
spec:
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
# 在此添加
hostNetwork: true
serviceAccountName: traefik-ingress-controller
terminationGracePeriodSeconds: 60
containers:
- image: traefik
name: traefik-ingress-lb
ports:
- name: http
containerPort: 80
hostPort: 80
- name: admin
containerPort: 8080
# 8080端口是traefik的dashboard,可用於查看一些數據
# 若是不想使用8080端口 則可修改以下端口爲其餘任意端口,須要注意的是修改的端口在node上沒有監聽才能夠
# 這裏默認
hostPort: 8080
# ...
---
# 將此文件中定義的svc的清單所有註釋掉,因爲咱們使用了hostNetwork直接共享了node的網絡名稱空間,因此這裏的svc已經沒有必要用了
#kind: Service
#apiVersion: v1
#metadata:
# name: traefik-ingress-service
# namespace: kube-system
#spec:
# selector:
# k8s-app: traefik-ingress-lb
# ports:
# - protocol: TCP
# port: 80
# name: web
# - protocol: TCP
# port: 8080
# name: admin
# end
# 應用配置清單
kubectl apply -f ./
# 應用完成後稍等片刻 可去非master節點上查看本機的80端口及8080端口是否直接監聽的
netstat -tnlp | grep 80
tcp6 0 0 :::8080 :::* LISTEN 7499/traefik
tcp6 0 0 :::80 :::* LISTEN 7499/traefik
# 因爲咱們traefik pod是以DaemonSet控制器運行的,因此每一個node上都會監聽如上兩個端口
# 在生產環境中可在防火牆上將80端口轉發至任意一個或多個node上的80端口,以便於對互聯網外部的用戶訪問
# 假設有20個Node,又不想在每一個Node上都運行traefik,每一個Node都運行一個traefik,這樣也不太合理.
# 因此咱們能夠給某些個節點打上對應的標籤,讓DaemonSet(deploy等控制器資源也可一樣定義)控制器控制的pod只運行在某個或多個Node上
# 而後使用ds.spec.template.spec.nodeSelector 來選擇剛纔定義的節點標籤,便可讓DaemonSet控制器資源只運行在定義的節點上
# 配置以下.假設這裏有5個node,只讓traefik以DameonSet控制器運行在node1,node2這兩個節點上
kubectl get node
NAME STATUS ROLES AGE VERSION
kubernetes-master Ready master 37d v1.13.3
kubernetes-node1 Ready <none> 37d v1.13.3
kubernetes-node2 Ready <none> 37d v1.13.3
kubernetes-node3 Ready <none> 37d v1.13.3
kubernetes-node4 Ready <none> 37d v1.13.3
kubernetes-node5 Ready <none> 37d v1.13.3
1,打標籤,標籤根據本身須要定義
kubectl label node kubernetes-node1 node_type=ingress
kubectl label node kubernetes-node2 node_type=ingress
2,修改traefik-ds.yaml配置清單 增長ds.spec.template.spec.nodeSelector配置項
vim traefik-ds.yaml
# ...
spec:
template:
metadata:
labels:
k8s-app: traefik-ingress-lb
name: traefik-ingress-lb
spec:
# 添加在此處
nodeSelector:
# 標籤名及標籤值要與上面定義的標籤一致
node_type: ingress
# end
hostNetwork: true
# ...
3,應用修改後的配置清單
kubectl apply -f traefik-ds.yaml
4,驗證
# 查看traefik-ds的pod是否只有兩個
# 須要明白的是DaemonSet控制器資源默認狀況下會在每一個node上運行1個,上面咱們有5個node,而後咱們只給node1 2打了標籤,因此只會運行兩個pod
kubectl get pod -n kube-system | grep traefik
# 查看是否只在node1,2上監聽了80,8080端口
# 因爲上面咱們修改了pod使用hostNetwork 來共享使用node的網絡名稱空間 因此會在node監聽
# 在node1 2上查看
netstat -tnlp | grep 80
5,防火牆將80端口轉發至node1,2這兩個主機的IP上便可對外發布服務了
# Ingress資源定義示例
---
apiVersion: examples/v1beata1
kind: Ingress
metadata:
# ingress名稱
name: ingress-tsp
namespace: default
annotations:
# 表示ingress的類型
kubernetes.io/ingress.class: traefik
# 後端應用的根
traefik.ingress.kubernetes.io/app-root: /tsp
spec:
rules:
# 域名
- host: tsp.xxxxx.com
http:
paths:
# 映射的路徑此路徑是前端的路徑
- path: /
backend:
# 後端pod的service名稱
serviceName: tsp
# service端口
servicePort: 8080
更多好文關注馬哥linux運維