k8s中IngressIp和egressIp的區別


https://zhuanlan.zhihu.com/p/343868046

 

 下面是 NetworkPolicy 的一個示例,如需完整說明,可參看結構定義文檔:

1apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy-sample
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978
1apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy-sample
  namespace: default
spec:
  podSelector:
    matchLabels:
      role: db
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - ipBlock:
        cidr: 172.17.0.0/16
        except:
        - 172.17.1.0/24
    - namespaceSelector:
        matchLabels:
          project: myproject
    - podSelector:
        matchLabels:
          role: frontend
    ports:
    - protocol: TCP
      port: 6379
  egress:
  - to:
    - ipBlock:
        cidr: 10.0.0.0/24
    ports:
    - protocol: TCP
      port: 5978

spec: NetworkPolicy 規約 中包含了在一個命名空間中定義特定網絡策略所需的所有信息。
podSelector: 每個 NetworkPolicy 都包括一個 podSelector ,它對該策略所應用的一組 Pod進行選擇。示例中的策略選擇帶有 "role=db" 標簽的 Pod。空的 podSelector 選擇命名空間下的所有 Pod。
policyTypes: 每個 NetworkPolicy 都包含一個 policyTypes 列表,其中包含 Ingress 或 Egress 或兩者兼具。policyTypes 字段表示給定的策略是否應用於進入所選 Pod 的入口流量或者來自所選 Pod的出口流量,或兩者兼有。如果 NetworkPolicy 未指定 policyTypes 則默認情況下始終設置 Ingress,如果NetworkPolicy 有任何出口規則的話則設置 Egress。
ingress: 每個 NetworkPolicy 可包含一個 ingress 規則的白名單列表。每個規則都允許同時匹配 from 和ports 部分的流量。示例策略中包含一條簡單的規則: 它匹配一個單一的端口,來自三個來源中的一個, 第一個通過 ipBlock指定,第二個通過namespaceSelector 指定,第三個通過 podSelector 指定。
egress: 每個 NetworkPolicy 可包含一個 egress 規則的白名單列表。每個規則都允許匹配 to 和 port部分的流量。該示例策略包含一條規則,該規則將單個端口上的流量匹配到 10.0.0.0/24 中的任何目的地。
所以,該網絡策略示例:

隔離 “default” 命名空間下 “role=db” 的 Pod (如果它們不是已經被隔離的話)。
(Ingress 規則)允許以下 Pod 連接到 “default” 命名空間下的帶有 “role=db” 標簽的所有 Pod 的6379 TCP 端口:
“default” 命名空間下任意帶有 “role=frontend” 標簽的 Pod
帶有 “project=myproject” 標簽的任意命名空間中的 Pod
IP 地址范圍為 172.17.0.0–172.17.0.255 和 172.17.2.0–172.17.255.255(即,除了
172.17.1.0/24 之外的所有 172.17.0.0/16)
(Egress 規則)允許從帶有 “role=db” 標簽的命名空間下的任何 Pod 到 CIDR 10.0.0.0/24 下 5978TCP 端口的連接。
具體詳細看博客:https://ghostwritten.blog.csdn.net/article/details/108422856

出口:定義default命名空間下label為db的pod的出口訪問規則,db pod能夠訪問網絡

10.0.0.0/24對外的提供的5987端口


2.2 簡單示例
以 calico 為例看一下 Network Policy 的具體用法。

1) 配置 kubelet 使用 CNI 網絡插件(默認已經配置,無需更改)

kubelet --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin ...

2) 安裝 calio 網絡插件

# 注意修改 CIDR,需要跟 k8s pod-network-cidr 一致,默認為 192.168.0.0/16
# 當前選擇的是小於50節點的安裝方式,具體安裝可查看
# https://docs.projectcalico.org/getting-started/kubernetes/self-managed-onprem/onpremises
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
3) 部署應用

部署 nginx 服務

$ kubectl create deployment nginx --image=nginx
deployment "nginx" created
$ kubectl expose deployment nginx --port=80
service "nginx" exposed
測試網絡

$ kubectl get svc,pod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 186d
service/nginx ClusterIP 10.233.27.142 <none> 80/TCP 2s

NAME READY STATUS RESTARTS AGE
pod/nginx-f89759699-kfmbj 1/1 Running 0 62s

$ kubectl run busybox --rm -ti --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.

/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.233.27.142:80)
remote file exists
/ # exit
4)測試網絡策略

如果只讓那些擁有標簽 access: true 的 Pod 訪問 nginx 服務, 那么可以創建一個如下所示的 NetworkPolicy 對象:

$ cat nginx-policy.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"
# 不帶 access=true 標簽的 Pod 還是無法訪問 nginx 服務
$ kubectl run busybox --rm -ti --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.

/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.233.27.142:80)
wget: download timed out
/ #


# 而帶有 access=true 標簽的 Pod 可以訪問 nginx 服務
$ kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/sh
If you don't see a command prompt, try pressing enter.

/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.233.27.142:80)
/ # exit

★【Network Policy】
分為Ingress和Egress策略控制,都為白名單。
•Ingress為入口請求控制
•Egress為出口請求控制


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM