service和ingress的作用
service的作用
NodePort:會在每個節點開放一個端口,端口號30000-32767。
也是只能用于內網訪問,四層轉發。實現負載均衡。不能基于域名進行訪問。
clusterip:service的默認類型,只能在集群內部訪問。
loadBalancer:基于云平臺的實現的,需要有loadBalancer的地址,僅限于云平臺。
externallPS:service允許分配外部IP,把外部IP路由集中到集群的一個或者多個node節點。
ingress:只需要一個或者少量的公網IP地址或者loadBalancer的地址,就可以實現將多個http的服務暴露到外網,七層代理,service的service,基于域名和URL路徑,把用戶的請求轉發到一個或者多個service的規則。
數據流向圖
根據ingress-controller匹配到指定service,service再把訪問ingress的基于域名的連接流量轉發到service匹配的pod。
ingress的組成
ingress只能配置yaml文件配置,其實ingress是一種規則,根據ingress的配置匹配到指定service,service再把訪問ingress的基于域名的連接流量轉發到service匹配的pod。
ingress-controller:不是k8s自帶的組件,第三方的軟件,不管是哪一種ingress-controller機制都是一樣的,沒有任何區別,都是以pod的形式運行在集群當中。
- ingress-nginx:主流的ingress-controller。
- traefik:有圖形化的ui,直觀。
ingress-controller暴露方式
1、deployment+loabBalancer:你把ingress部署在公有云,可以采用這種方式,loadBalancer會為service自帶創建一個負載均衡器,只要域名解析指向到loadbalancer的地址,就可以實現集群的對外訪問。
2、daemonSet+hostnetwork+nodeSelector:ingress-controller會直接使用宿主機的網絡和端口,一個node節點只能部署一個ingress-controller的pod。適用于大并發的生產環境。
3、deployment+nodeport:deployment部署也會執行一個ingress-controller的pod,pod也會執行一個service,service的模式是nodeport,分別對應80(http)和443(https),對應節點的端口號范圍是30000-32767。
還需要額外部署一個service轉發到pod,這種方式又會多了一層轉發的請求,請求量級大,性能會有一定影響。
轉發方式:NAT
ingress部署實現的過程
daemonSet+hostnetwork+nodeSelector模式
1、先給node2定義標簽
2、提前準備好nginx-ingress-controller腳本文件并運行,保證daemonSet
由下可見hostnetwork直接使用了宿主機node2的端口轉發流量
- 8181:nginx-controller默認配置的后臺轉發的端口,ingress沒有匹配到規則時,使用的默認端口。
3、接著編寫yaml腳本,定義pvc、pod、service和ingress,使ingress請求轉向service,service再轉向pod,pvc給pod自動分配pv。
4、最后給node2節點做域名映射,運行腳本后顯示成功。
deployment+nodeport模式
1、提前準備好nginx-ingress-controller腳本文件并運行,保證deployment
2、創建service的yaml文件如下
3、直接運行上面實驗(包含pvc、pod、service和ingress)的yaml腳本
4、最后node1或者node2節點做域名映射,運行腳本后顯示成功。
https
https概念
http的加密版就是https,默認端口是443。加密方式:SSL或者TSL協議實現加密和認證。SSL已經淘汰,TLS證書是主流。
TLS的組成:
- 記錄協議(record protocol):負責數據傳輸的可靠性
- 握手協議(handshake Security):建立安全連接的過程
TSL的作用:
- 數據加密:使用對稱密鑰加密通信的內容。
- 認知:通過數字證書驗證服務器(服務端和客戶端都要)的身份。證書可以自定義,也可以在專門的數字證書網站獲取。
- 完整性檢查:防止第三方對數據進行篡改。
htttps數據流向:
1、客戶端發起請求,如向百度發起請求(請求方式:https,請求方法:get),請求建立連接:三次握手。
2、TLS/SSL的握手過程:
- 客戶端——>發送支持tls版本的加密套件列表(證書和私鑰文件)
- 服務端——>服務器選擇一個雙方都支持的TLS的證書和私鑰等等,生產一個數字證書。
- 客戶端——>客戶端收到服務端的證書之后,驗證證書的有效性(簽發證書人是否合法,過期時間等等)。
- 客戶端生成預定的密鑰(TLS),和服務器交換密鑰;服務端驗證密鑰的有效性,以及密鑰是否正確。
- TLS的握手過程完成
3、建立安全連接:使用協商好的加密算法和密鑰對后續的數據進行加密傳輸。
4、關閉TLS連接,釋放資源然后四次揮手斷開連接。
https部署實現的過程
daemonSet+hostnetwork+nodeSelector
1、先在集群內生成證書和密鑰
證書:用于加密和認證網絡通信的數字證書,證明服務器的身份。確保客戶端連接到服務器是合法的。協商加密的密鑰,保證通信過程中數據的安全。
公鑰:有組織信息,數字簽名等等,證書頒發機構簽發的。
私鑰:對服務器的證書進行數字簽名,同時用于解密客戶端發送的加密數據,私鑰只有服務端才能夠訪問。
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
- openssl:簽發ssl證書
- req:執行證書的請求以及生產相關的文件
- -x509:生成自簽名x.509格式的證書
- -sha256:使用sha-256的散列算法
- -nodes:表示生成的私鑰不加密
- -days 365:證書有效期的時間365天
- -newkey rsa:2048:表示生成密鑰對是rsa加密的,長度是2048位。
- -keyout tls.key:生成的密鑰對保存到tls.key文件中
- -out tls.crt:證書保存到tls.crt文件中
- -subj "/CN=nginxsvc/O=nginxsvc:為證書添加一個主題,CN是證書的名稱,O是組織關系。
2、將證書和密鑰保存到secret中
3、根據上面http的配置文件修改ingress控制字段添加個加密即可。
4、最后在主節點上給node2節點做域名映射,運行腳本后顯示成功。
deployment+nodeport模式實現https在上面http實操基礎上添加加密字段即可。
容器內抓包
1、獲取docker的container id
2、根據container id獲取docker的進程號
docker inspect --format '{{.State.Pid}}'??container id
?
3、進入這個容器的網絡命令空間
nsenter -n -t pid號
4、抓包
tcpdump -i 容器的網卡名
ingress補充
基于用戶名和密碼實現登錄的認證
這里我們使用上面deployment+nodeport模式實驗的pod,當然也可以重新建一個pod。
apt -y install apache2
設置http的賬號密碼
- auth是加密的文件的名稱,必須是auth的名稱。
2、創建secret,使用auth加密的文件。
3、配置yaml文件
頁面跳轉,重定向
配置yaml文件
做個地址映射即可實現url頁面跳轉
當我們訪問re.xy104.com會跳轉到www2.xy104.com:32271
traefik
ingress-controller的另一種插件,和nginx-ingress大同小異。
也是部署微服務更快捷的視線的http反向代理和負載均衡,以及7層代理。
nginx-ingress 需要不斷的請求 k8s的api,獲取終端的變化,traefik自動的實時更新,可以完全同步獲取k8s的api的更新結果,和k8s的適配度更高。
nginx-ingree處理大并發環境更優秀
traefik:一般用于小的集群,并發量不是那么大的請求環境,。
traefik的部署方式
deployment+nodeport:適合面向內部服務
daemonset+hostnetwork+nodeselector:適合面向外部服務
loadbalancer+deployme
總結
ingress是外部進入k8s集群的入口,可以理解為service的service,ingress使用的時候,域名,匹配到可用的service。
ingress是做7層轉發,可以對http/https的請求進行處理。