介紹Servicenode
Pod與Service的關係nginx
說明:service 經過selector 關聯到pod的labels 標籤git
定義servicegithub
查看pod的app信息docker
詳細信息api
NodePortbash
node上採用的是ipvs的工具(定義以下):服務器
LoadBalancer
好比阿里雲(slb)、aws的負載均衡器網絡
總結:
NodePort:
用戶 ===》域名===》負載均衡器(nginx、lvs)===>NodeIP:Port===> PodIP:Portapp
LoadBalancer(提供特定的雲提供商LB的底層接口(slb,aws,openstack)):
用戶 ===》域名===》負載均衡器(阿里雲、aws,這一步是自動完成的,不須要手動的添加)===>NodeIP:Port===> PodIP:Port
固定node的端口:
建立一個pod分配到了一個node上,只要ENDPOINTS的方式,全部node均可以訪問:
底層流量轉發與負載均衡實現:
• Iptables 經過iptables 的規則匹配,有問題時就比較麻煩的處理,得清空 iptables -F
一、建立不少iptables規則(更新,非增量更新,由於iptables都是從上往下執行的,一條一條匹配)
二、以上帶來的問題就是 如果規則越多,很難管理
• IPVS
一、只執行4層(阿里雲SLB就是根據這個來作的)
二、ipvsadm -ln
三、設置策略(rr,wrr,lc,wlc,ip hash)
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
驗證是否能夠解析
若是解析不一樣的命名空間下的(在kube-system 解析default下的service):
Ingress
Pod與Ingress的關係以下:
經過label-selector相關聯
經過Ingress Controller實現Pod的負載均衡,支持TCP/UDP 4層和HTTP 7層
Ingress Controller
說明:必須經過ingress控制器與service綁定
部署文檔: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/
[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
多個域名訪問:
查看控制器分配在了哪一個node上,而後作域名綁定到這個node
編寫hosts:
訪問驗證:http://foo.bar.com/
基於https訪問
一、須要ca自簽證書:
二、執行:bash certs.sh
生成如下兩個文件:
三、建立密鑰
[root@docker ingress]# kubectl create secret tls sslexample-foo-com --cert=sslexample.foo.com.pem --key=sslexample
須要指定secrets
四、執行:
[root@docker ingress]# kubectl apply -f httpsingress1.yaml
五、綁定域名訪問(hosts):
說明:若是secretName 寫錯了,k8s會自動頒發一個證書,頒發者就不是kubernetes
總結
Ingress
一、四層、七層負載均衡轉發
二、支持自定義service訪問策略
三、只支持基於域名的網站訪問
四、執行TLS
五、須要部署多個Ingress Controller,避免一個掛了
現狀
由於pod能夠分配在不少node上,若域名與一個node節點綁定,這一個node服務器出現問題,則這個域名就掛了,不能實現高可用
解決將每一個node上裝上keepalived服務,設置vip,主master,備用的backup,而後域名 綁定到 vip上就實現高可用