《四》Service – 與外界連通、Ingress
Service – 與外界連通
介紹Service
- 防止Pod失聯
- 定義一組Pod的訪問策略
- 支援ClusterIP,NodePort以及LoadBalancer三種類型
- Service的底層實現主要有iptables和ipvs二種網路模式
Pod與Service的關係
- • 通過label-selector相關聯
- • 通過Service實現Pod的負載均衡( TCP/UDP 4層)
說明:service 通過selector 關聯到pod的labels 標籤
定義service
檢視pod的app資訊
詳細資訊
Service 型別
- • ClusterIP:預設,分配一個叢集內部可以訪問的虛擬IP(VIP),不需要外部訪問
- • NodePort:在每個Node上分配一個埠作為外部訪問入口
- • LoadBalancer:工作在特定的Cloud Provider上,例如Google Cloud,AWS,OpenStack
NodePort
node上採用的是ipvs的工具(定義如下):
LoadBalancer
比如阿里雲(slb)、aws的負載均衡器
總結:
NodePort:
使用者 ===》域名===》負載均衡器(nginx、lvs)===>NodeIP:Port===> PodIP:Port
LoadBalancer(提供特定的雲提供商LB的底層介面(slb,aws,openstack)):
使用者 ===》域名===》負載均衡器(阿里雲、aws,這一步是自動完成的,不需要手動的新增)===>NodeIP:Port===> PodIP:Port
固定node的埠:
建立一個pod分配到了一個node上,只要ENDPOINTS的方式,所有node都可以訪問:
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
驗證是否可以解析
如果解析不同的名稱空間下的(在kube-system 解析default下的service):
Ingress
Pod與Ingress的關係如下:
通過label-selector相關聯
通過Ingress Controller實現Pod的負載均衡,支援TCP/UDP 4層和HTTP 7層
Ingress Controller
部署文件: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
修改(這個源下載不了):
執行:
kubectl apply -f mandatory.yaml
驗證:
若是失敗,則查詢:
以上Ingress Controller 建立完成,現在編輯Ingress 規則
檢視文件:https://kubernetes.io/docs/concepts/services-networking/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
多個域名訪問:
檢視控制器分配在了哪個node上,然後做域名繫結到這個node
編寫hosts:
訪問驗證:http://foo.bar.com/
基於https訪問
1、需要ca自簽證書:
2、執行:bash certs.sh
生成以下兩個檔案:
3、建立金鑰
[[email protected] ingress]# kubectl create secret tls sslexample-foo-com --cert=sslexample.foo.com.pem --key=sslexample
4、執行:
[[email protected] ingress]# kubectl apply -f httpsingress1.yaml
5、繫結域名訪問:
說明:如果secretName 寫錯了,k8s會自動頒發一個證書,頒發者就不是kubernetes
總結
Ingress
1、四層、七層負載均衡轉發
2、支援自定義service訪問策略
3、只支援基於域名的網站訪問
4、執行TLS
5、需要部署多個Ingress Controller,避免一個掛了