Kubernetes中安裝traefik ingress

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運維

Kubernetes中安裝traefik ingress

相關文章
相關標籤/搜索