《四》Service – 與外界連通、Ingress

Service – 與外界連通

介紹Service

  • 防止Pod失聯
  • 定義一組Pod的訪問策略
  • 支持ClusterIP,NodePort以及LoadBalancer三種類型
  • Service的底層實現主要有iptables和ipvs二種網絡模式

Pod與Service的關係

  • • 通過label-selector相關聯
  • • 通過Service實現Pod的負載均衡( TCP/UDP 4層)

《四》Service – 與外界連通、Ingress

說明:service 通過selector 關聯到pod的labels 標籤

定義service

《四》Service – 與外界連通、Ingress

查看pod的app信息
《四》Service – 與外界連通、Ingress

詳細信息
《四》Service – 與外界連通、Ingress

Service 類型

  • • ClusterIP:默認,分配一個集羣內部可以訪問的虛擬IP(VIP),不需要外部訪問
  • • NodePort:在每個Node上分配一個端口作爲外部訪問入口
  • • LoadBalancer:工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack

NodePort

《四》Service – 與外界連通、Ingress

node上採用的是ipvs的工具(定義如下):
《四》Service – 與外界連通、Ingress

《四》Service – 與外界連通、Ingress

LoadBalancer
比如阿里雲(slb)、aws的負載均衡器

《四》Service – 與外界連通、Ingress

總結:
NodePort:
用戶 ===》域名===》負載均衡器(nginx、lvs)===>NodeIP:Port===> PodIP:Port

LoadBalancer(提供特定的雲提供商LB的底層接口(slb,aws,openstack)):
用戶 ===》域名===》負載均衡器(阿里雲、aws,這一步是自動完成的,不需要手動的添加)===>NodeIP:Port===> PodIP:Port

固定node的端口:
《四》Service – 與外界連通、Ingress

創建一個pod分配到了一個node上,只要ENDPOINTS的方式,所有node都可以訪問:
《四》Service – 與外界連通、Ingress

Service 代理模式

底層流量轉發與負載均衡實現:
• Iptables 通過iptables 的規則匹配,有問題時就比較麻煩的處理,得清空 iptables -F
1、創建很多iptables規則(更新,非增量更新,因爲iptables都是從上往下執行的,一條一條匹配)
2、以上帶來的問題就是 若是規則越多,很難管理

• IPVS
1、只執行4層(阿里雲SLB就是根據這個來做的)
2、ipvsadm -ln
3、設置策略(rr,wrr,lc,wlc,ip hash)

《四》Service – 與外界連通、Ingress

        systemctl restart kube-proxy

DNS
內部通訊不可能根據ip來通信,因爲ip不是固定的,爲每一個Service創建DNS記錄用於域名解析。

參考地址:https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns

[root@docker demo]# kubectl apply -f coredns.yaml
《四》Service – 與外界連通、Ingress

驗證是否可以解析
《四》Service – 與外界連通、Ingress

如果解析不同的命名空間下的(在kube-system 解析default下的service):
《四》Service – 與外界連通、Ingress

Ingress
Pod與Ingress的關係如下:

通過label-selector相關聯
通過Ingress Controller實現Pod的負載均衡,支持TCP/UDP 4層和HTTP 7層

《四》Service – 與外界連通、Ingress

Ingress Controller
說明:必須通過ingress控制器與service綁定

《四》Service – 與外界連通、Ingress

部署文檔:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md

注意事項:
• 鏡像地址修改成國內的:lizhenliang/nginx-ingress-controller:0.20.0
• 使用宿主機網絡:hostNetwork: true

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml

修改(這個源下載不了):
《四》Service – 與外界連通、Ingress

執行:
kubectl apply -f mandatory.yaml

驗證:
《四》Service – 與外界連通、Ingress

若是失敗,則查詢:

《四》Service – 與外界連通、Ingress

以上Ingress Controller 創建完成,現在編輯Ingress 規則

查看文檔:https://kubernetes.io/docs/concepts/services-networking/ingress/

[root@docker ingress]# cat ingress1.yaml 
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: simple-fanout-example
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /
        backend:
          serviceName: my-service
          servicePort: 802

多個域名訪問:

《四》Service – 與外界連通、Ingress

查看控制器分配在了哪個node上,然後做域名綁定到這個node
《四》Service – 與外界連通、Ingress

編寫hosts:
《四》Service – 與外界連通、Ingress

訪問驗證:http://foo.bar.com/

基於https訪問
1、需要ca自簽證書:

2、執行:bash certs.sh
生成以下兩個文件:

《四》Service – 與外界連通、Ingress

3、創建密鑰
[root@docker ingress]# kubectl create secret tls sslexample-foo-com --cert=sslexample.foo.com.pem --key=sslexample

《四》Service – 與外界連通、Ingress

需要指定secrets
《四》Service – 與外界連通、Ingress

4、執行:
[root@docker ingress]# kubectl apply -f httpsingress1.yaml

5、綁定域名訪問(hosts):

https://sslexample.foo.com/

說明:如果secretName 寫錯了,k8s會自動頒發一個證書,頒發者就不是kubernetes

總結
Ingress
1、四層、七層負載均衡轉發
2、支持自定義service訪問策略
3、只支持基於域名的網站訪問
4、執行TLS
5、需要部署多個Ingress Controller,避免一個掛了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章