日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

ASP.NET Core on K8S深入学习(11)K8S网络知多少

發(fā)布時間:2023/12/4 asp.net 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET Core on K8S深入学习(11)K8S网络知多少 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


Photo :Kubernetes

文?| Edison Zhou

本文已加入《.NET Core on K8S 學習與實踐系列文章索引目錄》,點擊查看容器化相關文章,希望對你有所幫助!

Kubernetes網(wǎng)絡模型

? ? ? ?我們都知道Kubernetes作為容器編排引擎,它有一個強大又復雜的網(wǎng)絡模型,也牽引出了Pod網(wǎng)絡、Service網(wǎng)絡、ClusterIP、NodePort、Ingress等多個概念。這里我們采用楊波老師(架構(gòu)師楊波)模仿TCP/IP協(xié)議棧總結(jié)的一個K8S網(wǎng)絡模型圖來看看K8S的四個抽象層次,從而了解一下K8S的網(wǎng)絡。本小節(jié)的文字主要引用自楊波老師關于K8S網(wǎng)絡模型的文章及CloudMan的《每天5分鐘玩轉(zhuǎn)Kubernetes》一書。

  

K8S網(wǎng)絡層次模型圖 (From 波波老師)

  根據(jù)上圖模型中展示的四個層次,從0到3,除了第0層,每一層都是構(gòu)建于前一層之上。

  (1)第0層:節(jié)點主機互通互聯(lián)

  主要保證K8S節(jié)點(物理或虛擬機)之間能夠正常IP尋址和互通的網(wǎng)絡,這個一般由底層(公有云或數(shù)據(jù)中心)網(wǎng)絡基礎設施支持,這里我們無需過多關心。

  (2)第1層:Pod虛擬機互聯(lián)

?  在一個Pod中可以運行一個或多個容器,且Pod中所有容器使用同一個網(wǎng)絡namespace,即相同的IP和端口空間,可以直接用localhost通信,而且還可以共享存儲(本質(zhì)是通過將Volume掛載到Pod中的每個容器)。

?Pod網(wǎng)絡模型圖 (From 波波老師)

  (3)第2層:服務發(fā)現(xiàn)和負載均衡

?  在K8S集群中,Pod的IP并不是固定的,可能會頻繁地銷毀和創(chuàng)建實例,為了解決此問題,Service提供了訪問Pod的抽象層。即無論后端Pod如何變化,Service都作為穩(wěn)定的前端對外提供服務。此外,Service還提供了高可用和負載均衡的功能,它負責將請求轉(zhuǎn)發(fā)給正確的Pod。

  

??Service網(wǎng)絡模型圖 (From 波波老師)

  (4)第3層:外部流量接入

?  K8s的Service網(wǎng)絡只是一個集群內(nèi)部網(wǎng)絡,集群外部是無法直接訪問的。為此,想要將應用暴露出去讓公網(wǎng)能夠訪問,K8S提供了兩種方式:

  ① NodePort:使Service通過Cluster節(jié)點的靜態(tài)端口對外提供服務,外部可以通過 NodeIP:NodePort 來訪問Service。

??Node Port方式示意圖 (From 波波老師)

  ② LoadBalancer:使Service利用Cloud Provider提供的Load Balancer對外提供服務,Cloud Provider負責將Load Balancer的流量導向Service。目前支持的Cloud Provider包括AWS、Azure、阿里云、騰訊云等。

?Load Balancer方式示意圖 (From 波波老師)

More:關于K8S網(wǎng)絡的更多基本原理與講解,強力推薦閱讀波波老師的以下文章:

  • Kubernetes網(wǎng)絡三部曲-Pod網(wǎng)絡(From 楊波老師)

  • Kubernetes網(wǎng)絡三部曲-Service網(wǎng)絡(From 楊波老師)

  • Kubernetes網(wǎng)絡三部曲-外部接入網(wǎng)絡(From 楊波老師)

傳說中的CNI規(guī)范

????????為了保證網(wǎng)絡方案的標準化、擴展性和靈活性,K8S采用了CNIContainer Networking Interface)規(guī)范。CNI是一個Pod網(wǎng)絡集成標準,簡化了K8S和不同Pod網(wǎng)絡實現(xiàn)技術(shù)的集成。CNI最大的優(yōu)點就是支持多種容器runtime,而不僅僅是Docker。目前已經(jīng)有多種支持K8S的網(wǎng)絡方案,包括 Flannel、Calico、Canal等,它們都實現(xiàn)了CNI規(guī)范,因此無論我們選擇哪種具體方案,它們的網(wǎng)絡模型都是一致的。

?CNI模型圖

More:關于CNI的更多基本原理與講解,推薦閱讀陳Sir的文章《K8S網(wǎng)絡詳解:CNI與CNI網(wǎng)絡模型》

Network Policy

關于Network Policy

  Network Policy是K8S的一種資源,它使K8S可以通過Label選擇Pod,并指定其他Pod或外界如何與這些Pod通信。換句話說,當Pod被定義了Network Policy時,只有Policy允許的流量才能訪問Pod(默認情況下,任何來源的流量都可以訪問Pod,是沒有限制的)即幫助K8S實現(xiàn)更為精細的流量控制,實現(xiàn)租戶隔離機制。

  But,并不是所有K8S網(wǎng)絡方案都支持Network Policy,比如Flannel就不支持,而Calico是支持的。

????????下面我們就來實踐一下Network Policy,只要三步!

部署Canal

  想要部署Canal,需要切換網(wǎng)絡方案,這里我們使用最簡單粗暴的方式:重建當前K8S集群

kubeadm reset # 在每個節(jié)點上執(zhí)行一次

  然后,重新對Master節(jié)點進行初始化:

kubeadm init \ --apiserver-advertise-address=192.168.2.100 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.13.3 \ --service-cidr=10.1.0.0/16 \ --pod-network-cidr=10.244.0.0/16

  在兩個Node節(jié)點上執(zhí)行以下命令重新加入集群:(注意這里的token請?zhí)顚懩愕腗aster節(jié)點初始化后的輸出結(jié)果)

kubeadm?join?192.168.2.100:6443?--token?ekqxk2.iiu5wx5bbnbdtxsw?\ --discovery-token-ca-cert-hash?\ sha256:c50bb83d04f64f4a714b745f04682b27768c1298f331e697419451f3550f2d05

  最后,通過以下命令部署Canal:(參考自K8S官方文檔)

kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/canal.yaml

  此時,再次令驗證的集群結(jié)果如下:

  (1)集群節(jié)點狀態(tài)

  

?  (2)Pod狀態(tài)

?  

部署測試應用

????????這里通過一個httpd應用來演示Network Policy,該應用的yaml定義如下:

apiVersion: apps/v1 kind: Deployment metadata:name: httpd spec:replicas: 3selector:matchLabels:name: networkpolicy-demotemplate:metadata:labels:name: networkpolicy-demospec:containers:- name: httpdimage: httpd:latestports:- containerPort: 80imagePullPolicy: IfNotPresent---kind: Service apiVersion: v1 metadata:name: httpd-svc spec:type: NodePortports:- protocol: TCPnodePort: 31000port: 8080targetPort: 80selector:name: networkpolicy-demo

  通過kubectl將其部署到K8S集群:

kubectl apply -f httpd-demo.yaml

  這時候三個httpd Pod已經(jīng)成功Running:

  

  由于定義的是NodePort方式暴露服務,這里我們在集群外部訪問Service看看:

  

  由于當前并沒有創(chuàng)建任何Network Policy,這里我們可以通過創(chuàng)建一個Pod應用(我們熟悉的busybox)來驗證一下是否可以在K8S集群內(nèi)部隨意訪問該httpd應用:

kubectl run busybox --rm -it --image=busybox /bin/sh

  

  

?  從上圖可以知道,它可以正常訪問到Service,也可以正常ping到Pod節(jié)點。

部署Network Policy有效性

  現(xiàn)在我們創(chuàng)建一個Network Policy,其配置文件yaml如下:

apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata:name: access-httpd spec:podSelector:matchLabels:name: networkpolicy-demoingress:- from:- podSelector:matchLabels:access: "true"ports:- protocol: TCPport: 80

  該Network Policy定義了如下規(guī)則:

  (1)應用于所有 label 為 name : networkpolicy-demo 的Pod,這里即剛剛創(chuàng)建的三個httpd pod。

  (2)ingress中定義了只有 label 為 access : "true" 的Pod才能訪問應用。

  (3)即使通過Policy也只能訪問80端口

  通過kubectl將其應用到K8S集群中:

kubectl apply -f networkpolicy.yaml

  下面再次在busybox pod中驗證Network Policy的有效性:

  

  

  從上圖中可以看到,已經(jīng)無法再成功訪問Service,也無法再ping通三個Pod節(jié)點。

  這個時候,集群外也無法再通過NodePort訪問到Service:

  

  如果想要讓測試Pod(busybox)能訪問到應用了Network Policy的httpd應用,我們可以對busybox pod加一個label("access=true")就可以:

kubectl run busybox --rm -it --image=busybox \ --labels="access=true" /bin/sh

  運行后的驗證結(jié)果如下,可以訪問到Service,但Ping卻被禁止:

  

?  但是,此時集群節(jié)點(k8s-master與兩個node)與集群仍然無法訪問到應用了Network Policy的httpd應用,如果想要讓它們也訪問到,則需要修改Network Policy做一個類似于開防火墻白名單的操作(注意下面的ipBlock配置):

apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata:name: access-httpd spec:podSelector:matchLabels:name: networkpolicy-demoingress:- from:- podSelector:matchLabels:access: "true"- ipBlock:cidr: 192.168.2.0/24ports:- protocol: TCPport: 80

  再次應用到K8S集群后,再來通過集群外部的訪問者瀏覽器試試:

  

?  可以看到,已經(jīng)可以正常訪問啦!

小結(jié)

???????本文簡單介紹了Kubernetes的4層網(wǎng)絡模型、CNI 容器網(wǎng)絡接口規(guī)范 和 Network Policy,并通過改造K8S集群的網(wǎng)絡配置從Flannel到Canal來驗證Network Policy的有效性。對于Kubernetes的網(wǎng)絡模型的原理與介紹,強烈推薦閱讀楊波老師的《Kubernetes網(wǎng)絡三部曲》,它的傳送門位于下方的參考資料列表中。

????????最后,碼字不易,也希望各位看官看完覺得還行就在本文右下方順手點個“在看”,就是對我最大的鼓勵!

參考資料:

(1)CloudMan,《每天5分鐘玩轉(zhuǎn)Kubernetes》?

(2)李振良,《一天入門Kubernets教程》?

(3)馬哥(馬永亮),《Kubernetes快速入門》?

(4)Liang,《K8S CNI網(wǎng)絡最強對比》?

(5)楊波,《K8S網(wǎng)絡三部曲》?

(6)陳Sir,《K8S網(wǎng)絡詳解:CNI與CNI網(wǎng)絡模型》

往期精彩回顧

.NET Core on K8S學習與實踐系列文章索引目錄

熊逸《唐詩必修50講》學習筆記系列文章索引目錄

【重磅】2019 .NET China Conf 資料下載

2019?.NET?Conf China - 路一直都在,社區(qū)會更好

阿里云MVP第十期全球發(fā)布—讓天下沒有難做的技術(shù)

基于Jenkins的開發(fā)測試全流程持續(xù)集成實踐

基于Jenkins Pipeline的ASP.NET Core持續(xù)集成實踐

恰童鞋騷年,風華也許不再正茂,但卻仍想揮斥方遒

本公眾號會長期關注和分享.NET Core,Microservice,Cloud Native,DevOps等技術(shù)內(nèi)容文章,還會與你分享個人生活成長的點滴及各類好書的讀書筆記,希望能對你有所幫助,一起成長!

長按訂閱更多精彩▼


點個【在看】和更多人一起分享

總結(jié)

以上是生活随笔為你收集整理的ASP.NET Core on K8S深入学习(11)K8S网络知多少的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。