kubernetes 實戰 2:Traefik 的安裝和使用

目前經常使用的k8s經常使用服務暴露方式有 LoadBalancer、NodePort、Ingress 三種;node

  • LoadBalancer 依賴雲服務商的環境,須要使用雲服務商提供的底層和資源的支持,好比阿里雲的 SLB。
  • NodePort 我的感受更適合我的學習、測試、或者某些特殊場景使用,由於服務一旦多了很難管理。
  • Ingress 主要提供反向代理和負載均衡功能,管理方便,能夠做爲集羣服務的統一流量入口,目前有 traefik 和 nginx ingress,爲何這裏咱們要寫 Traefik? 由於用的人多啊O.o,羣衆的眼睛是雪亮的...,Traefik 目前比 nginx ingress 要活躍不少,並且對後端節點的變化反應更迅速;nginx ingress 以前接觸的時候還在beta版本,如今貌似是正式版了,也支持了grpc,後面有機會再嘗試一下作個對比。

環境信息:

  • kubernetes version: v1.15.1
  • traefik version: v1.7

一. 安裝Traefik

  安裝方式有兩種 Deployment 和 DaemonSet,官網比較有詳細的解釋,我就直接貼上了了:nginx

  • The scalability can be much better when using a Deployment, because you will have a Single-Pod-per-Node model when using a DaemonSet, whereas you may need less replicas based on your environment when using a Deployment.
  • DaemonSets automatically scale to new nodes, when the nodes join the cluster, whereas Deployment pods are only scheduled on new nodes if required.
  • DaemonSets ensure that only one replica of pods run on any single node. Deployments require affinity settings if you want to ensure that two pods don't end up on the same node.
  • DaemonSets can be run with the NET_BIND_SERVICE capability, which will allow it to bind to port 80/443/etc on each host. This will allow bypassing the kube-proxy, and reduce traffic hops. Note that this is against the Kubernetes Best Practices Guidelines, and raises the potential for scheduling/scaling issues. Despite potential issues, this remains the choice for most ingress controllers.
  • If you are unsure which to choose, start with the Daemonset.

  這裏咱們聽官方的,先用 DaemonSet 吧,主要考慮兩個緣由:git

  1. 咱們目前是測試環境,用 DaemonSet 能夠直接使用80和443端口,比較方便。
  2. 流量不用走 kube-proxy,效率更高一些

  1. 建立 RBAC 受權: 

kubectl apply -f https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-rbac.yaml

  2. 建立 DaemonSet

  • 這裏能夠把這個文件下載下來,咱們要略做修改github

wget https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/traefik-ds.yaml
  • 官方的 example 只啓用了http,這裏咱們要打開https;添加args參數
# 先添加一個https 的 containerPort
- name: https
  containerPort: 443
  hostPort: 443

# 添加args
- --defaultentrypoints=http,https
- --entrypoints=Name:https Address::443 TLS
- --entrypoints=Name:http Address::80

  • 建立
kubectl create -f traefik-ds.yaml
  • 這個yaml文件下面還有建立 service 聲明,這裏注意下
  • 若是你在測試環境使用,那這裏基本不用變更什麼
  • 若是你是在生產環境使用,而且集羣是雲服務商提供的,這裏修改一下 service 的 type 爲 LoadBalancer,這樣集羣會向雲服務商申請一個外網的負載均衡器,經過負載均衡器將 Traefik 暴露到外網,這樣咱們就能夠建立 ingress 並把域名解析到這個 LB 的公網地址,由 Traefik 做爲集羣的一個入口網關
  • 這裏我是在本地環境測試的,我嘗試修改了一下 type 爲 LoadBalancer,看下圖你就會發現,由於我本地獲取不到 LB 的資源, service 一直在 pending 狀態

  • 若是在雲環境成功下成功獲取到了 LB 資源,集羣會作什麼呢?其實上面的圖上能夠看出來,集羣內該服務會以 NodePort 方式暴露出來(3078八、3270五、32537), 集羣請求到 LB 資源後會將 LB 的 80 負載均衡到全部 worker node 的 30788 端口,443 負載均衡到 32705,8080 負載均衡到 32537,這樣就基本保證了 Traefik 的可用性

  3. 檢查pod

kubectl get pod -n kube-system
  • 官方鏡像是在 dockerhub 的,若是 pull 不下來就去阿里雲找一個,將上面的yaml文件下載下來,替換一下image地址docker

  4. 建立 service和ingress 暴露 Traefik Web UI

  • 這裏官方例子是使用 traefik-ui.minikube 這個域名,這裏有須要的話能夠自行修改域名,好比我這裏改爲了 k8s.mytest.com後端

wget https://raw.githubusercontent.com/containous/traefik/v1.7/examples/k8s/ui.yaml

 

  • 建立ingress,而後在咱們本地綁定一下/etc/hostsbash

kubectl create -f ui.yaml
# 添加 hosts (若是是生產環境,直接添加域名的DNS解析就行)
sudo echo "192.168.199.204  k8s.mytest.com" >> /etc/hosts
  • 訪問本身綁定的域名,這裏已經能看到ui了app

  5. 給Web Ui 添加一個 基礎認證

  • 建立包含用戶名密碼的認證文件,建立完檢查一下,文件內容應該是 用戶名:密碼(md5)負載均衡

htpasswd -c ./auth admin
  •  建立 secretless

kubectl create secret generic traefik-secret --from-file auth --namespace=kube-system
  • 修改 Traefik Web UI 的 ingress,這裏繼續修改前面下面的ui.yaml,添加:

annotations:
  kubernetes.io/ingress.class: traefik
  traefik.ingress.kubernetes.io/auth-type: basic
  traefik.ingress.kubernetes.io/auth-secret: traefik-secret

 

  • 更新 ingress

kubectl apply -f ui.yaml
  • 從新訪問 Traefik Web UI,使用剛纔建立的用戶名密碼登陸便可

  簡單的安裝和使用就寫到這裏,上面暴露 Traefik Web UI 其實就是一個暴露服務的例子,Traefik還有不少更高級的配置,好比使用 acme 自動申請和管理 let's encrypt 證書,你們能夠從官網瞭解一下。

 

二.  導入並使用 SSL 證書

  • 首先生成證書,你們若是有域名的話能夠申請一個免費的DV證書,阿里雲上就能夠免費申請
  • 使用證書文件建立 secret
kubectl create secret tls mytest-secret --cert=mytest.crt --key=mytest.key -n kube-system
  • 在 ingress 中使用證書,編輯 ingress,在spec.rules 下添加便可
tls:
  - secretName: mytest

 

參考:官方文檔

相關文章
相關標籤/搜索