以自建 kubeadm 為例,會需要在 iptables 上設定允許或者拒絕的 ip 來源
如果是使用 AWS 的 EKS 則是可以使用 cluster endpoint public access cidrs 的功能透過 Public 直接訪問,不過如果是在 Production 環境時建議透過跳板機的方式訪問 cluster。
這邊主要是設定網路連線而已,成功訪問後能否查看資源(kubectl get pods
)則是透過 role, rolebinding 取得
透過 network policy 可以控制 pod 在 layer 3,4 的路由規則,主要可以分成(1) pod (2) namespace (3) ip block 等控制項,在沒有配置 ingress 以及 egress 時一率視爲允許,並且以 namespace 為控制單位。
以下將直接以範例說明如何配置:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy # networkpolicy 名稱
namespace: default # 應用在哪個 namespace 上
spec:
podSelector: # 選擇要設定在哪個 pod 上
matchLabels:
role: db
policyTypes: # policy types 只能設定 ingress 或者 egress
- Ingress
- Egress
ingress:
- from: # 如果是 ingress 下面要接 from,一個 from 只能對應一組port
- 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 如果沒有指定 port 會是 所有port
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
spec:
podSelector: {} # 代表選擇所有 pod
policyTypes:
- Ingress
---
# 該配置底下會允許所有的 ingress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-ingress
spec:
podSelector: {}
ingress:
- {}
policyTypes:
- Ingress
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-external-egress
namespace: default
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- namespaceSelector: {}
podSelector: {}
參考資料
cluster endpoint public access cidrs