1. 程式人生 > >《四》Service – 與外界連通、Ingress

《四》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)

     ![](http://i2.51cto.com/images/blog/201812/17/bd4780b77b8c05bc565159751564f997.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

        systemctl restart kube-proxy

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

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

[[email protected] 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
《四》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

若是失敗,則查詢:
《四》Service – 與外界連通、Ingress

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

檢視文件:https://kubernetes.io/docs/concepts/services-networking/ingress/

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

[[email protected] 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自簽證書:
《四》Service – 與外界連通、Ingress

2、執行:bash certs.sh
生成以下兩個檔案:
《四》Service – 與外界連通、Ingress

3、建立金鑰
[[email protected] ingress]# kubectl create secret tls sslexample-foo-com --cert=sslexample.foo.com.pem --key=sslexample

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

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

4、執行:
[[email protected] ingress]# kubectl apply -f httpsingress1.yaml

5、繫結域名訪問:
《四》Service – 與外界連通、Ingress

https://sslexample.foo.com/

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

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