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

Service – 與外界連通

介紹Servicenode

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

Pod與Service的關係nginx

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

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

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

定義servicegithub

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

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

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

Service 類型

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

NodePortbash

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

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

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

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

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

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

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

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

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

Service 代理模式

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

• IPVS
一、只執行4層(阿里雲SLB就是根據這個來作的)
二、ipvsadm -ln
三、設置策略(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訪問
一、須要ca自簽證書:

二、執行:bash certs.sh
生成如下兩個文件:

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

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

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

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

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

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

https://sslexample.foo.com/

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

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

將keepalived與ingress關聯

現狀
由於pod能夠分配在不少node上,若域名與一個node節點綁定,這一個node服務器出現問題,則這個域名就掛了,不能實現高可用

解決將每一個node上裝上keepalived服務,設置vip,主master,備用的backup,而後域名 綁定到 vip上就實現高可用

相關文章
相關標籤/搜索