精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Kubernetes網絡策略,這一篇就夠了

云計算
目前許多組織都在采用Kubernetes來運行他們的應用程序。以至于有些人將Kubernetes稱為新的數據中心操作系統。因此,組織開始將Kubernetes(通常縮寫為k8s)視為關鍵任務平臺,它需要包括網絡安全在內的成熟業務流程。

 目前許多組織都在采用Kubernetes來運行他們的應用程序。以至于有些人將Kubernetes稱為新的數據中心操作系統。因此,組織開始將Kubernetes(通常縮寫為k8s)視為關鍵任務平臺,它需要包括網絡安全在內的成熟業務流程。

[[326130]]

負責保護這個新平臺的網絡安全團隊可能發現它出奇的不同。例如,默認的Kubernetes策略是允許任何連接。

本文提供了一些關于Kubernetes網絡策略工作原理的簡介,它們如何與傳統防火墻策略進行比較以及一些可以幫助你保護Kubernetes應用程序的陷阱和最佳實踐。

Kubernetes網絡策略

Kubernetes提供了一種稱為網絡策略的機制,可用于對部署在平臺上的應用程序實施第3層分隔。網絡策略缺乏現代防火墻的高級功能,如第7層控制和威脅檢測,但是它們確實提供了基本的網絡安全,這是一個很好的起點。

網絡策略控制Pod的通信

Kubernetes的工作負載在pod中運行,pod由一個或多個部署在一起的容器組成。Kubernetes為每個pod分配一個IP地址,這個地址可以從其他所有pod路由,甚至可以跨底層服務器。Kubernets網絡策略指定pod組的訪問權限,類似于云服務中的安全組用于控制對虛擬機實例的訪問。

編寫網絡策略

與其他Kubernetes資源一樣,網絡策略可以使用一種稱為YAML的語言定義。下面是一個簡單的例子,它允許從負載均衡到postgres的訪問。 

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.postgres 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: postgres 
  10.   ingress: 
  11.   - from
  12.     - podSelector: 
  13.         matchLabels: 
  14.           app: balance 
  15.   policyTypes: 
  16.   - Ingress 

  

為了編寫你自己的網絡策略,你需要對yaml有基本的了解。Yaml基于縮進(使用的是空格,而不是tab)。縮進項屬于其上方最接近的縮進項。連字符(破折號)開始一個新的列表項。所有其他項都是映射條目。你可以在網上找到大量關于yaml的信息。

編寫完策略的YAML文件后,使用kubectl創建策略: 

  1. kubectl create -f policy.yaml 

網絡策略定義

網絡策略定義由四個元素組成:

podSelector:將受此策略約束的pod(策略目標)。必填

policyType:指定哪些類型的策略包含在這個策略中,ingress或egress。該項是可選的,但建議總是明確的指定它。可選

ingress:允許傳入目標pod的流量。可選

egress:允許從目標pod傳出的流量。可選

下面這個例子是從Kubernetes官網上改編的(將“role”改為了“app”),它指定了四個元素: 

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: test-network-policy 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: db 
  10.   policyTypes: 
  11.   - Ingress 
  12.   - Egress 
  13.   ingress: 
  14.   - from
  15.     - ipBlock: 
  16.         cidr: 172.17.0.0/16 
  17.         except
  18.         - 172.17.1.0/24 
  19.     - namespaceSelector: 
  20.         matchLabels: 
  21.           project: myproject 
  22.     - podSelector: 
  23.         matchLabels: 
  24.           role: frontend 
  25.     ports: 
  26.     - protocol: TCP 
  27.       port: 6379 
  28.   egress: 
  29.   - to
  30.     - ipBlock: 
  31.         cidr: 10.0.0.0/24 
  32.     ports: 
  33.     - protocol: TCP 
  34.       port: 5978 

 

 注意,你不必包含所有四個元素。podSelector是必填的,其余三個是可選的。

如果你忽略了policyType,則推斷如下:

  • 策略總是被認為指定了一個ingress定義。如果你沒有明確的定義它,它將被視為“不允許流量“。
  • egress將由是否存在egress元素誘導。

為了避免錯誤,建議總是顯式的指定policyType。

如果沒有提供ingress或egress的定義,并且根據上面的邏輯假定它們存在,策略將認為它們是“不允許流量”。

默認策略是允許

當沒有定義任何策略時,Kubernetes允許所有通信。所有pod都可以相互自由通信。從安全角度來看,這聽起來可能有悖常理,但請記住,Kubernetes是由希望應用程序進行通信的開發人員設計的。網絡策略是作為后來的增強功能添加的。

命名空間

命名空間是Kubernetes的多租戶機制,旨在將命名空間環境相互隔離,但是,命名空間的通信在默認情況下仍然是被允許的。

與大多數Kubernetes實體一樣,網絡策略也位于特定的命名空間中。元數據頭部告訴Kubernetes策略屬于哪個命名空間: 

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: test-network-policy 
  5.   namespace: my-namespace 
  6. spec: 
  7. ... 

如果你沒有明確指定元數據的命名空間,它將應用于kubectl提供的命名空間(默認是namespace=default)。 

  1. kubectl apply -n my-namespace -f namespace.yaml 

建議顯式指定命名空間,除非你正在編寫的策略要統一應用在多個命名空間中。

策略中的podSelector元素將從策略所屬的命名空間中選擇pod(它不能從另一個命名空間選擇pod)。

ingress和egress元素中的podSelector也會選擇相同命名空間中的pod,除非你將它們和namespaceSelector一起使用。

策略命名約定

策略的名稱在命名空間中是唯一的。一個命名空間中不能有兩個同名的策略,但是不同的命名空間可以有同名的策略。當你想要在多個命名空間重復應用某個策略時,這非常方便。

我喜歡的策略命名方法之一是將命名空間與pod組合起來,例如: 

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.postgres 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: postgres 
  10.   ingress: 
  11.   - from
  12.     - podSelector: 
  13.         matchLabels: 
  14.           app: admin 
  15.   policyTypes: 
  16.   - Ingress 

 

 

標簽

Kubernetes對象,如pod和namespace,可以附加用戶自定義標簽。Kubernetes網絡策略依賴于標簽來選擇它們應用于的pod:

  1. podSelector: 
  2.   matchLabels: 
  3.     role: db 

或者它們應用于的命名空間。下面的例子中選擇匹配標簽的命名空間中的所有pod:

  1. namespaceSelector: 
  2.   matchLabels: 
  3.     project: myproject 

需要注意的一點是:如果你使用namespaceSelector,請確保所選擇的命名空間確實具有所使用的標簽。請記住,像default和kube-system這樣的內置命名空間沒有現成的標簽。你可以像這樣給命名空間添加一個標簽:

  1. kubectl label namespace default namespace=default 

元數據中的namespace是命名空間的實際名稱,而不是標簽:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: test-network-policy 
  5.   namespace: default 
  6. spec: 
  7. ... 

源和終點

防火墻策略由具有源和終點的規則組成。Kubernetes網絡策略是為目標(應用策略的一組pod)定義的,然后為目標指定傳入或傳出流量。再次使用相同的例子,你可以看到策略目標——默認命名空間中所有具有標簽為“db:app”的pod:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: test-network-policy 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: db 
  10.   policyTypes: 
  11.   - Ingress 
  12.   - Egress 
  13.   ingress: 
  14.   - from
  15.     - ipBlock: 
  16.         cidr: 172.17.0.0/16 
  17.         except
  18.         - 172.17.1.0/24 
  19.     - namespaceSelector: 
  20.         matchLabels: 
  21.           project: myproject 
  22.     - podSelector: 
  23.         matchLabels: 
  24.           role: frontend 
  25.     ports: 
  26.     - protocol: TCP 
  27.       port: 6379 
  28.   egress: 
  29.   - to
  30.     - ipBlock: 
  31.         cidr: 10.0.0.0/24 
  32.     ports: 
  33.     - protocol: TCP 
  34.       port: 5978 

 

 

 

 

該策略中的ingress項允許到目標pod的傳入流量。因此,ingress被解釋為“源”,目標被解釋為各自的“終點”。同樣,egress被解釋為“終點”,目標是各自的“源”。

 

 

Egress和DNS

當執行egress時,必須小心不要阻止DNS,Kubernetes使用DNS將service的名稱解釋為其IP地址。否則,這個策略將不起作用,因為你沒有允許balance執行DNS查找:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.balance 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: balance 
  10.   egress: 
  11.   - to
  12.     - podSelector: 
  13.         matchLabels: 
  14.           app: postgres 
  15.   policyTypes: 
  16.   - Egress 

 

 

要解決它,你必須允許訪問DNS服務:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.balance 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: balance 
  10.   egress: 
  11.   - to
  12.     - podSelector: 
  13.         matchLabels: 
  14.           app: postgres 
  15.   - to
  16.     ports: 
  17.     - protocol: UDP 
  18.       port: 53 
  19.   policyTypes: 
  20.   - Egress 

 

 

“to”元素為空,它隱式選擇了所有命名空間中的所有pod,從而允許balance通過Kubernetes的DNS服務執行DNS查找,DNS服務通常位于kube-system命名空間中。

雖然這是有效的,但它過于寬松和不安全——它允許在集群外部進行DNS查找。

你可以分階段鎖定它:

1.通過添加一個namespaceSelector只允許在集群內進行DNS查找:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.balance 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: balance 
  10.   egress: 
  11.   - to
  12.     - podSelector: 
  13.         matchLabels: 
  14.           app: postgres 
  15.   - to
  16.     - namespaceSelector: {} 
  17.     ports: 
  18.     - protocol: UDP 
  19.       port: 53 
  20.   policyTypes: 
  21.   - Egress 

 

 

2.只允許DNS在kube-system命名空間中

為此,你需要為kube-system命名空間添加一個標簽:

  1. kubectl label namespace kube-system namespace=kube-system 

然后用namespaceSelector在策略中指定它:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.balance 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: balance 
  10.   egress: 
  11.   - to
  12.     - podSelector: 
  13.         matchLabels: 
  14.           app: postgres 
  15.   - to
  16.     - namespaceSelector: 
  17.         matchLabels: 
  18.           namespace: kube-system 
  19.     ports: 
  20.     - protocol: UDP 
  21.       port: 53 
  22.   policyTypes: 
  23.   - Egress 

 

 

3.偏執狂可能想更進一步,將DNS限制為kube-system命名空間中特定的DNS服務。請參考下面的“通過命名空間和pod過濾”章節。

另一種選擇是在命名空間級別允許DNS,這樣就不需要為每個服務指定它了:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.dns 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: {} 
  8.   egress: 
  9.   - to
  10.     - namespaceSelector: {} 
  11.     ports: 
  12.     - protocol: UDP 
  13.       port: 53 
  14.   policyTypes: 
  15.   - Egress 

空的podSelector選擇該命名空間中的所有pod。

 

 

第一個匹配和規則順序

防火墻管理員知道對數據包采取的操作(允許或拒絕)由與其匹配的第一個規則決定。但是在Kubernetes中,策略的順序并不重要。默認的行為是,當沒有定義策略時,允許所有通信,因此所有pod之間可以彼此通信。一旦定義了策略,每個至少被一個策略選擇的pod,將根據選擇它的策略的并集(邏輯或)進行隔離:

 

 

沒有被任何策略選中的pod繼續保持開放。你可以通過定義cleanup規則來改變這個行為。

Cleanup規則(拒絕)

防火墻策略通常通過any-any-any-deny規則來丟棄所有非顯式允許的流量。Kubernetes沒有拒絕操作,但是你可以使用一個常規的規則來實現相同的效果,該策略指定policyTypes=Ingress,但是省略了實際ingress的定義,這被解釋為“不允許進入”。

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: deny-all 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: {} 
  8.   policyTypes: 
  9.   - Ingress 

 

 

該策略選擇命名空間中的所有pod作為源,未定義ingress——這意味著不允許流量進入。

類似的,你可以拒絕來自一個命名空間的所有出站流量:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: deny-all-egress 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: {} 
  8.   policyTypes: 
  9.   - Egress 

 

 

請記住,任何其他允許訪問命名空間中pod的策略都將優先于此拒絕策略——相當于防火墻中將允許策略添加到拒絕策略之上。

Any-Any-Any-Allow

通過使用一個空的ingress元素修改上面的deny-all策略,可以創建一個allow-all策略:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: allow-all 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: {} 
  8.   ingress:  
  9.   - {} 
  10.   policyTypes: 
  11.   - Ingress 

 

 

這允許所有命名空間中的所有pod(和IP)到默認命名空間中的任何pod的通信。這是默認行為,因此通常不需要這么做。但是,為了查找問題,暫時覆蓋所有其他規則可能很有用。

你可以縮小此范圍,僅允許訪問默認命名空間中的一組特定的pod:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: allow-all-to-balance 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: balance 
  10.   ingress:  
  11.   - {} 
  12.   policyTypes: 
  13.   - Ingress 

 

 

下面的策略允許任何入站和出站流量(包括訪問集群外的任何IP):

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: allow-all 
  5. spec: 
  6.   podSelector: {} 
  7.   ingress: 
  8.   - {} 
  9.   egress: 
  10.   - {} 
  11.   policyTypes: 
  12.   - Ingress 
  13.   - Egress 

 

 

 

 

組合多個策略

策略在三個級別上使用邏輯或進行組合。每個pod根據應用于它的所有策略的并集決定是否允許通信。

1.在“from”和“to”項中,你可以定義三種類型的項,他們通過“或”進行組合:

  • namespaceSelector——選擇一整個命名空間
  • podSelector——選擇pod
  • ipBlock——選擇一個子網

你可以在from/to下定義任意數量的項(即使是相同類型也可以定義多條),它們將通過邏輯或組合在一起:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.postgres 
  5.   namespace: default 
  6. spec: 
  7.   ingress: 
  8.   - from
  9.     - podSelector: 
  10.         matchLabels: 
  11.           app: indexer 
  12.     - podSelector: 
  13.         matchLabels: 
  14.           app: admin 
  15.   podSelector: 
  16.     matchLabels: 
  17.       app: postgres 
  18.   policyTypes: 
  19.   - Ingress 

 

 

2.在一個策略中,ingress策略可以有多個“from”項,它們通過邏輯或組合在一起。同樣,egress策略可以有多個“to”項,它們也通過邏輯或組合在一起:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.postgres 
  5.   namespace: default 
  6. spec: 
  7.   ingress: 
  8.   - from
  9.     - podSelector: 
  10.         matchLabels: 
  11.           app: indexer 
  12.   - from
  13.     - podSelector: 
  14.         matchLabels: 
  15.           app: admin 
  16.   podSelector: 
  17.     matchLabels: 
  18.       app: postgres 
  19.   policyTypes: 
  20.   - Ingress 

 

 

3.多個策略也通過邏輯或組合在一起。

但是當組合策略時,這里有一些限制:Kubernetes只能組合policyType(ingress或egress)不同的策略,多個策略都指定ingress(或egress)將會互相覆蓋。

命名空間之間的通信

默認情況下,命名空間間的通信是允許的。你可以使用deny-all策略來改變它,以阻止從或者到該命名空間的通信。

如果你阻止了對某個命名空間的訪問,可以使用namespaceSelector允許來自一個特定的命名空間的訪問。

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedatabase.postgres 
  5.   namespace: database 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: postgres 
  10.   ingress: 
  11.   - from
  12.     - namespaceSelector: 
  13.         matchLabels: 
  14.           namespace: default 
  15.   policyTypes: 
  16.   - Ingress 

 

 

這允許default命名空間中的所有pod訪問database命名空間中的postgres pod。但是,如果只想允許default命名空間中特定的pod訪問postgres該怎么辦呢?

通過namespace和pod聯合過濾

Kubernetes 1.11及以上允許你將namespaceSelector和podSelector通過邏輯與組合在一起:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedatabase.postgres 
  5.   namespace: database 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: postgres 
  10.   ingress: 
  11.   - from
  12.     - namespaceSelector: 
  13.         matchLabels: 
  14.           namespace: default 
  15.       podSelector: 
  16.         matchLabels: 
  17.           app: admin 
  18.   policyTypes: 
  19.   - Ingress 

 

 

為什么這被解釋為“與”,而不是“或”呢?

請注意,podSelector不是以破折號開頭的,在yaml中這意味著,podSelector與前面的namespaceSelector屬于同一個列表項,因此它們通過邏輯與進行組合。如果你在podSelector前面添加一個破折號,將創建一個新的列表項,這將與前面的namespaceSelector通過邏輯或組合。要在所有命名空間中選擇具有特定標簽的pod,可以指定一個空的namespaceSelector:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedatabase.postgres 
  5.   namespace: database 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: postgres 
  10.   ingress: 
  11.   - from
  12.     - namespaceSelector: {} 
  13.       podSelector: 
  14.         matchLabels: 
  15.           app: admin 
  16.   policyTypes: 
  17.   - Ingress 

 

 

多個標簽通過邏輯與組合

具有多個對象(主機、網絡、組...)的防火墻規則被解釋為邏輯或。例如,如果數據包的源匹配HOST_1或HOST_2,則應用此規則:

 

 

與之相反的是,在Kubernetes中,podSelector和namespaceSelector中的多個標簽通過邏輯與進行組合。例如,這將選擇同時具有標簽role=db和version=v2的pod:

  1. podSelector: 
  2.   matchLabels: 
  3.     role: db 
  4.     version: v2 

相同的邏輯適用所有類型的選擇器:策略目標的選擇器、pod的選擇器、命名空間的選擇器。

子網和IP地址(ipBlock)

防火墻使用vlan、ip和子網來分割網絡。在Kubernetes中,pod的IP是自動分配的,并且可能經常變動,因此網絡策略使用標簽來選擇pod和命名空間。子網(ipBlock)用于ingress或egress連接(南北向)。例如,下面這個策略允許default命名空間中的所有pod訪問谷歌的DNS服務:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: egress-dns 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: {} 
  8.   policyTypes: 
  9.   - Egress 
  10.   egress: 
  11.   - to
  12.     - ipBlock: 
  13.         cidr: 8.8.8.8/32 
  14.     ports: 
  15.     - protocol: UDP 
  16.       port: 53 

 

 

本例中空的podSelector表示“選擇該命名空間中的所有pod”。該策略只允許訪問8.8.8.8,這意味著它拒絕訪問其他任何IP。因此,實際上,你已經阻止了對Kubernetes內部DNS服務的訪問。如果你仍然想允許它,需要顯式的指定它。

通常ipBlock和podSelector是互斥的,因為通常你在ipBlock中不使用內部pod IP。如果你使用內部pod IP指定ipBlock,它實際上將允許與具有這些ip的pod進行通信。但是在實踐中并不知道該用哪些IP,這就是為什么不應該用IP來選擇pod。

下面這個策略中包含所有IP,并允許訪問所有其它pod:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: egress-any 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: {} 
  8.   policyTypes: 
  9.   - Egress 
  10.   egress: 
  11.   - to
  12.     - ipBlock: 
  13.         cidr: 0.0.0.0/0 

 

 

你可以通過排除內部IP來只允許訪問外部IP。例如,如果pod的子網是10.16.0.0/14:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   name: egress-any 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: {} 
  8.   policyTypes: 
  9.   - Egress 
  10.   egress: 
  11.   - to
  12.     - ipBlock: 
  13.         cidr: 0.0.0.0/0 
  14.         except
  15.         - 10.16.0.0/14 

 

 

 

端口和協議

pod通常只監聽一個端口,這意味著你可以簡單的在策略中省略端口,默認允許任何端口。但是最好將策略設置為受限的,顯式的指定端口:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.postgres 
  5.   namespace: default 
  6. spec: 
  7.   ingress: 
  8.   - from
  9.     - podSelector: 
  10.         matchLabels: 
  11.           app: indexer 
  12.     - podSelector: 
  13.         matchLabels: 
  14.           app: admin 
  15.     ports: 
  16.       - port: 443 
  17.         protocol: TCP 
  18.       - port: 80 
  19.         protocol: TCP 
  20.   podSelector: 
  21.     matchLabels: 
  22.       app: postgres 
  23.   policyTypes: 
  24.   - Ingress 

 

 

請注意,端口應用于它們所在的“to”或“from”子句中的所有項。如果你想為不同的項指定不同的端口,你可以將ingress或egress拆分為多個“to”或“from”,每個都有自己的端口:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.postgres 
  5.   namespace: default 
  6. spec: 
  7.   ingress: 
  8.   - from
  9.     - podSelector: 
  10.         matchLabels: 
  11.           app: indexer 
  12.     ports: 
  13.      - port: 443 
  14.        protocol: TCP 
  15.   - from
  16.     - podSelector: 
  17.         matchLabels: 
  18.           app: admin 
  19.     ports: 
  20.      - port: 80 
  21.        protocol: TCP 
  22.   podSelector: 
  23.     matchLabels: 
  24.       app: postgres 
  25.   policyTypes: 
  26.   - Ingress 

 

 

端口的默認行為:

  • 如果完全省略端口,則表示所有端口和所有協議
  • 如果省略協議,則默認為TCP
  • 如果省略端口,則默認為所有端口

最佳實踐:不要依賴默認行為,顯式的指明。

注意你必須使用pod的端口,而不是service的端口。

策略是為pod定義的還是為service定義的?

當一個pod訪問Kubernetes中另一個pod時,它通常要通過service,service是一個虛擬的負載均衡器,它將流量轉發到實現該服務的pod上。你可能會以為網絡策略是控制對service的訪問的,但事實并非如此。Kubernetes網絡策略是應用于pod的端口,而非service的端口。

例如,如果一個service監聽80端口,但是它將流量轉發到監聽8080端口的pod上,你需要在網絡策略中指定8080端口。

這種設計不是最優的,因為當有人更改服務的內部工作方式時(如pod正在監聽的端口),你需要更新網絡策略。

顯然,有一種解決方案可以解決這個問題,即使用命名端口,而不是硬編碼的數字端口:

  1. apiVersion: networking.k8s.io/v1 
  2. kind: NetworkPolicy 
  3. metadata: 
  4.   namedefault.allow-hello 
  5.   namespace: default 
  6. spec: 
  7.   podSelector: 
  8.     matchLabels: 
  9.       app: hello 
  10.   policyTypes: 
  11.   - Ingress 
  12.   ingress: 
  13.   - from
  14.     - podSelector: 
  15.         matchLabels: 
  16.           run: curl 
  17.     ports: 
  18.     - port: my-http 

你需要在pod的定義中指定這個端口的名字:

  1. apiVersion: extensions/v1beta1 
  2. kind: Deployment 
  3. metadata: 
  4.   labels: 
  5.     app: hello 
  6.   name: hello 
  7. spec: 
  8.   selector: 
  9.     matchLabels: 
  10.       app: hello 
  11.   template: 
  12.     metadata: 
  13.       labels: 
  14.         app: hello 
  15.     spec: 
  16.       containers: 
  17.       - image: gcr.io/hello-minikube-zero-install/hello-node 
  18.         imagePullPolicy: Always 
  19.         name: hello-node 
  20.         ports: 
  21.         - containerPort: 8080 
  22.           name: my-http 

這樣就將網絡策略和pod解耦了。

Ingress

術語“ingress”在Kubernetes中有兩種含義:

  1. ingress網絡策略允許你控制其他pod或外部IP對pod的訪問
  2. Kubergess的ingress是一種配置外部負載均衡器路由流量到集群內部的方式

你可以編寫一個k8s網絡策略限制來自Kubernetes ingress的訪問,但在大多數情況下這不是很有用,因為它只控制負載均衡器的內部IP。為了控制可以訪問集群的外部子網,你需要在外部實施點(如負載均衡本身或負載均衡前面的防火墻)配置訪問控制。

需要同時定義ingress和egress么?

簡單的回答是肯定的——為了允許pod A訪問pod B,你需要允許pod A通過egress策略創建出站連接,并允許pod B通過ingress策略接受入站連接。

然而,實際上,你可能對兩個方向中的一個使用默認的允許策略。

如果源pod被一個或多個egress策略選中,則將根據策略聯合對其進行限制,在這種情況下你需要明確允許它連接到目標pod。如果pod不被任何策略選中,則它默認允許所有的出站流量。

同樣,被一個或多個ingress策略選中的目標pod,也會受到策略的聯合限制,在這種情況下你必須明確允許它接受來自源pod的流量。如果pod沒有被任何策略選中,則它默認允許所有入站流量。

hostNetwork陷阱

Kubernetes通常在自己的隔離網絡中運行pod,然而,你可以指定Kubernetes在主機上運行pod:

  1. hostNetwork: true 

這樣會完全繞開網路策略,pod像主機上運行的其他任何進程一樣進行通信。

流量日志

Kubernetes網絡策略不能生成流量日志。這很難知道策略是不是像預期一樣工作。這也是安全分析方面的主要限制。

控制到外部服務的流量

Kubernetes網絡策略不允許你為egress指定完全限定的域名(DNS)。當試圖控制到無固定IP的外部站點(如aws.com)的流量時,這是一個限制。

策略驗證

防火墻將警告甚至拒絕接受無效的策略。Kubernetes也做了一些驗證。當使用kubectl定義網絡策略時,Kubernetes可能會告訴你策略無效并且拒絕接受。在其它情況下,Kubernetes將接受策略并修改它缺失的細節,你可以通過以下命令查看它:

kubernetes get networkpolicy  -o yaml

請注意,Kubernetes的驗證不是無懈可擊的,它可能允許策略中出現某些類型的錯誤。

執行

Kubernetes本身并不執行網絡策略,它只是一個API網關,它將執行的艱巨工作傳遞給一個稱為容器網絡接口(CNI)的底層系統。在沒有合適CNI的Kubernetes集群中定義策略就像在沒有安裝防火墻的服務器上定義防火墻規則一樣。你必須確保擁有具有安全功能的CNI,或者,對于托管的Kubernetes平臺,你需要顯式的啟用將為你安裝CNI的網絡策略。

請注意,如果CNI不支持,你定義了一個網絡策略,Kubernetes不會向你告警。

有狀態還是無狀態?

目前所有的Kubernetes CNI都是有狀態的,這使得pod能在它發起的TCP連接上接收應答,而不必為應答打開高端口。我不知道有沒有Kubernetes標準保證狀態性。

高級安全策略管理

以下是一些針對Kubernetes實施更高級的網絡策略的方法:

  1. 服務網格設計模式使用sidecar在服務級別提供更高級的遙測和流量控制。有關示例,請參考Istio。
  2. 一些CNI提供商已經將他們的工具擴展到了Kubernetes網絡策略之外。
  3. Tufin Orca——用于實現Kubernetes網絡策略的可視化和自動化。

總結

Kubernetes網絡策略為集群劃分提供了一種很好的方法,但是它們不直觀并且有許多注意的地方。我相信,由于這種復雜性,一定有許多集群在他們的策略中存在“bug”。可能的解決方案是自動化策略定義或其他分割方法。同時,希望本文對澄清和解決你可能遇到的問題有所幫助。

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2019-04-10 10:43:15

Redis內存淘汰策略

2020-08-03 10:00:11

前端登錄服務器

2023-04-24 08:00:00

ES集群容器

2023-02-10 09:04:27

2022-06-20 09:01:23

Git插件項目

2020-02-18 16:20:03

Redis ANSI C語言日志型

2023-09-11 08:13:03

分布式跟蹤工具

2021-04-08 07:37:39

隊列數據結構算法

2022-08-01 11:33:09

用戶分析標簽策略

2019-08-13 15:36:57

限流算法令牌桶

2021-04-14 15:54:20

Kubernetes程序工具

2018-01-17 09:32:45

人工智能卷積神經網絡CNN

2019-05-14 09:31:16

架構整潔軟件編程范式

2021-05-14 23:31:50

大數據計算機開發

2023-10-17 08:15:28

API前后端分離

2020-11-06 10:01:06

Nginx

2020-07-03 08:21:57

Java集合框架

2025-08-07 04:10:00

光模塊AI網絡

2024-09-23 08:00:00

消息隊列MQ分布式系統

2024-04-08 10:01:33

點贊
收藏

51CTO技術棧公眾號

欧美一区二区三区黄片| 久久久国产精品久久久| 亚州男人的天堂| 在线视频免费在线观看一区二区| 欧美三级视频在线| 亚洲一卡二卡三卡四卡无卡网站在线看| 99久久精品国产亚洲| 香蕉久久99| 欧美系列在线观看| 99热一区二区三区| 韩国中文字幕hd久久精品| 国产欧美日韩一级| 色老头一区二区三区在线观看| 韩国视频一区二区三区| 米奇777四色精品人人爽| 国产精品香蕉一区二区三区| 97人人模人人爽人人喊中文字| 日本一区二区三区网站| 欧美日韩va| 亚洲一区二区三区免费视频| 欧美系列一区| 国产乱淫av免费| 最新亚洲一区| 自拍视频国产精品| 国产精品一区二区人妻喷水| 国产私拍福利精品视频二区| 亚洲在线观看免费| 日韩精品久久一区| 六月丁香综合网| 免费精品视频最新在线| 欧美猛少妇色xxxxx| 在线观看国产精品一区| 99香蕉久久| 欧美色图第一页| 天天夜碰日日摸日日澡性色av| 国产理论电影在线观看| 国产不卡在线视频| 国产情人节一区| 日韩精品一区二区三| 97在线精品| 亚洲欧美变态国产另类| 女教师高潮黄又色视频| 123成人网| 粉嫩av一区二区三区免费野| 91成人在线视频观看| 国产三区四区在线观看| 99久久精品久久久久久清纯| 亚洲www在线观看| 国产日韩在线免费观看| 一区二区三区国产盗摄| 欧美激情亚洲视频| 成人高潮免费视频| 成人亚洲一区| 亚洲一级黄色片| 六十路息与子猛烈交尾| 99久久免费精品国产72精品九九| 欧美日本韩国一区| 欧美自拍小视频| 中文字幕在线高清| 福利二区91精品bt7086| 久久在线中文字幕| 国产丝袜在线播放| 亚洲国产美女搞黄色| 日本黄网站色大片免费观看| 黄av在线播放| ㊣最新国产の精品bt伙计久久| 欧美一区二区三区成人久久片| 99久久亚洲精品日本无码| 男女性色大片免费观看一区二区| 欧美在线欧美在线| 五月激情六月丁香| 亚洲麻豆一区| 97视频网站入口| 日本少妇毛茸茸高潮| 韩国在线视频一区| 高清视频欧美一级| 国产精品100| 午夜在线视频观看日韩17c| 91成人精品网站| 伊人手机在线视频| 视频一区中文字幕国产| 国产精品色悠悠| 一卡二卡在线观看| 国产成人在线网站| 精品国产一区二区三区四区精华| 日本黄色不卡视频| 91蜜桃在线观看| 日韩av不卡播放| 丝袜美腿美女被狂躁在线观看| 欧美激情中文字幕| 欧美性视频在线播放| h视频在线免费观看| 亚洲国产裸拍裸体视频在线观看乱了| 日韩视频在线免费播放| 在线观看中文| 精品人伦一区二区三区蜜桃免费| 成年人免费在线播放| a成人v在线| 日韩三级av在线播放| 中文字幕 亚洲一区| 不卡在线一区二区| 欧美另类在线观看| 黄网在线观看视频| 久久成人免费日本黄色| 成人情视频高清免费观看电影| www.黄色一片| 久久久三级国产网站| 一区二区免费在线观看| 国产高清在线a视频大全| 色又黄又爽网站www久久| 婷婷激情5月天| 好吊妞视频这里有精品| 在线精品高清中文字幕| 国产一级二级三级| 日韩精品三区四区| 成人动漫在线视频| 成年人在线视频| 亚洲一区成人在线| 天堂视频免费看| 日韩深夜福利| 欧美大片在线影院| 中文字幕福利视频| 99麻豆久久久国产精品免费| 亚洲视频sss| 国产高清中文字幕在线| 欧美夫妻性生活| 国产网站无遮挡| 一区二区电影| 国产精品7m视频| 国产高清第一页| 国产日韩精品视频一区| www.国产在线播放| 国产精品亚洲四区在线观看| 亚洲男人天堂九九视频| 精品99久久久久成人网站免费| 久久婷婷亚洲| 精品欧美一区二区在线观看视频 | www 日韩| 亚洲va欧美va天堂v国产综合| 天天色综合天天色| 四虎5151久久欧美毛片| 欧美日韩福利视频| 国产伦一区二区| 欧美高清在线精品一区| 成年人免费在线播放| 日韩成人一级| 午夜精品久久久99热福利| 精品人妻伦一二三区久久| 国产精品久久久久久久裸模| 日韩在线xxx| 五月国产精品| 69av在线播放| 五月婷婷久久久| 亚洲电影一区二区| 国产精品熟妇一区二区三区四区| 国产精品久久久久久| 国产精品视频一区二区三区四| 香蕉av一区二区三区| 亚洲亚洲人成综合网络| 欧美图片自拍偷拍| 欧美午夜电影在线观看| 444亚洲人体| 91一区二区三区在线| 91麻豆精品国产91久久久更新时间 | 日韩精品中文字幕久久臀| 久久成人在线观看| 福利一区福利二区| 91午夜在线观看| 国产精品chinese在线观看| 欧美黄色片在线观看| 亚洲爱情岛论坛永久| 亚洲午夜电影在线| 五月天激情小说| 国产精品美女久久久| 国产精品一区二区欧美黑人喷潮水| 在线观看a级片| 精品国产乱码久久久久久久 | 国产精品国产三级国产aⅴ原创 | 黄页网站在线观看免费| 欧美v日韩v国产v| 国产精品999久久久| 91在线视频播放地址| 鲁一鲁一鲁一鲁一澡| 九九精品久久| 国产日韩中文字幕在线| 成人影院在线观看| 精品久久久久久久久久久久久久久久久 | 亚洲中文一区二区| 日本一区二区三级电影在线观看| 黄色片一级视频| 日韩欧美一区免费| 99久久国产免费免费| 97蜜桃久久| 一区二区av在线| 国产男男gay网站| 亚洲成av人片在线观看| www.av欧美| 男人的天堂亚洲一区| 国内精品国产三级国产99| 极品束缚调教一区二区网站| 国产ts人妖一区二区三区| 日日夜夜精品一区| 亚洲成人在线视频播放| 亚洲中文字幕无码爆乳av| 亚洲人成网站影音先锋播放| 伊人网综合视频| 日本网站在线观看一区二区三区| 亚洲一区二区三区加勒比| 欧美一区一区| 日本精品久久电影| av免费在线免费| 精品亚洲男同gayvideo网站| 91丨porny丨在线中文| 偷窥国产亚洲免费视频| 99热这里只有精品4| av福利精品导航| 特黄视频免费观看| 免费日韩av| 日韩精品一区二区在线视频| 精品久久久久中文字幕小说 | 亚洲电影免费观看高清完整版在线观看 | 手机看片福利日韩| 欧美特黄一级| 亚洲春色在线| 欧亚精品一区| 国产欧美日韩高清| 一区一区三区| 欧美极品少妇xxxxⅹ免费视频| 噜噜噜噜噜在线视频| 精品日韩欧美在线| 依依成人在线视频| 欧美性猛交xxxx乱大交极品| 青娱乐免费在线视频| 亚洲国产精品t66y| 一卡二卡三卡四卡| 成人深夜视频在线观看| 国产精品久久久久久9999| 久久最新视频| 五十路熟女丰满大屁股| 综合精品久久| 一区二区冒白浆视频| 欧美少妇xxxx| 美媛馆国产精品一区二区| 一区二区在线视频观看| 成人国产在线视频| 草民电影神马电影一区二区| 青青久久av北条麻妃海外网| 超碰在线公开| 欧美国产第一页| a黄色片在线观看| 视频在线观看一区二区| 91啦中文在线| 在线观看国产成人av片| 成年人在线观看| 亚洲小视频在线| 欧美一区二区视频| 亚洲男人av电影| 人成在线免费视频| 亚洲乱码一区二区| 日韩电影免费| 亚洲色图第三页| 九九在线视频| 亚洲午夜精品视频| 福利片在线观看| 在线播放国产一区中文字幕剧情欧美| 亚洲精品久久久久久无码色欲四季 | 成人av电影免费观看| 国偷自产av一区二区三区麻豆| 九九视频精品免费| 亚洲综合123| 国产福利电影一区二区三区| 丰满饥渴老女人hd| 成人激情小说网站| 少妇户外露出[11p]| 久久精品亚洲精品国产欧美kt∨| 国产男女猛烈无遮挡a片漫画| aaa国产一区| 老鸭窝一区二区| 久久久国产午夜精品| 久久亚洲AV无码专区成人国产| 国产日韩欧美综合一区| 久久久久久久久福利| 国产精品久久99| 欧美三根一起进三p| 亚洲国产一区二区a毛片| www..com国产| 色妞www精品视频| 91在线观看喷潮| 日韩久久久久久| 天天影院图片亚洲| 国产一区二区三区视频在线观看| av女优在线| 成人97在线观看视频| 搞黄网站在线看| 国产成人鲁鲁免费视频a| 久久精品超碰| av资源一区二区| 一道本一区二区三区| 中文字幕日韩一区二区三区| 亚洲五月婷婷| 无码少妇一区二区三区芒果| 国产主播一区二区三区| 亚洲男女在线观看| 国产精品女同一区二区三区| 久久久久国产精品夜夜夜夜夜| 欧美日韩国产精品一区二区不卡中文| 男女啊啊啊视频| 欧美美女一区二区在线观看| 免费观看毛片网站| 正在播放欧美一区| 韩国成人免费视频| 国产精品久久视频| 国产精品香蕉| 一区不卡字幕| 国产一区成人| 亚洲国产午夜精品| 久久精品视频在线看| 日本在线一级片| 色婷婷综合久色| 亚洲高清精品视频| 中文字幕久久亚洲| 成av人片在线观看www| 91美女高潮出水| 国内精品久久久久久久久电影网 | 日韩欧美中文| 99视频在线免费播放| 韩国v欧美v亚洲v日本v| 国产人妻一区二区| 午夜久久久久久| 国产成人精品av在线观| 伊人激情综合网| 在线中文字幕播放| 国产精品成人一区二区三区| 欧美韩日高清| 日韩视频在线免费看| 成人a区在线观看| 永久久久久久久| 欧美三级电影在线看| 欧美在线一卡| 91成人精品网站| 国产亚洲成av人片在线观黄桃| 国产美女视频免费| 蜜桃91丨九色丨蝌蚪91桃色| 天天躁日日躁aaaa视频| 欧美日韩国产在线播放| 丁香花免费高清完整在线播放| 色偷偷偷亚洲综合网另类| 国产一区一一区高清不卡| 欧美日韩国产三区| 美日韩精品视频| 北岛玲一区二区| 午夜精品久久一牛影视| 二区三区在线视频| 欧美大片大片在线播放| 久久精品免视看国产成人| 椎名由奈jux491在线播放 | 在线免费一区| 麻豆国产欧美一区二区三区| 99久久久无码国产精品衣服| 一本大道久久a久久综合| 日韩一区av| 国产精品对白刺激| 精品国精品国产自在久国产应用 | 国产又粗又长又爽| 五月天一区二区| 五月天婷婷激情网| 欧美一区在线直播| 蜜桃国内精品久久久久软件9| 人人妻人人添人人爽欧美一区| 成人做爰69片免费看网站| 久久久精品99| 亚洲福利精品在线| 午夜影院在线播放| 日韩免费电影一区二区| 免费久久99精品国产| 久热这里有精品| 精品国产一区二区三区忘忧草| 欧美人体视频xxxxx| 国产乱码精品一区二区三区中文 | 天天插天天射天天干| 色婷婷av一区二区三区软件 | 91视频综合网| 欧美本精品男人aⅴ天堂| 888av在线视频| 精品一卡二卡三卡四卡日本乱码 | 亚欧美中日韩视频| 偷拍夫妻性生活| 欧美日韩国产天堂| 欧美人与性动交α欧美精品图片| 99热99热| 亚洲影视综合| 日本免费www| 日韩一区国产二区欧美三区| 成年女人在线看片| 视频一区二区在线| 高清在线不卡av| 国产情侣小视频| 精品中文字幕在线2019| 伊人春色精品| 亚洲综合伊人久久|