k8s网络策略
# 网络策略
K8S版本:v1.19.8,kubectl版本:v1.22.9
在默认情况下,K8s集群的网络没做任何限制,集群中的所有pod都是互通的,在某些情况下,是不允许所有项目的环境网络都是互通的
K8s的网络插件 (opens new window)有很多,如flannel,Calico,Canal,但不是所有的都支持Network Policy,如flannel就不支持( 只有选择支持网络策略的网络解决方案,否则创建也没有任何效果)
Kubernetes网络策略官网说明 (opens new window)
# 创建网络策略NetworkPolicy
# pod的流量出与入(namespace:default)
默认所有pod是互通的,创建NetworkPolicy 只会影响当前命名空间
- A)不能进,出
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: default-deny
namespace: default #不写默认default
spec:
podSelector: {}
policyTypes:
- Ingress #拒绝入
- Egress #拒绝出
2
3
4
5
6
7
8
9
10
- B)能进,不能出
内部无法访问外部网络,其他命名空间能访问default 空间的pod网络,
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: default-deny
namespace: default
spec:
podSelector:
matchLabels: {}
ingress: #允许进
- {}
policyTypes:
- Ingress
- Egress
2
3
4
5
6
7
8
9
10
11
12
13
# 允许某些labels的pod网络
- C)同一命名空间里,允许"app: nginx-test" 标签的可以访问,(默认A规则存在)
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-pod-nginx-test
namespace: default
spec:
podSelector:
matchLabels:
app: nginx-test
egress:
- to:
- podSelector:
matchLabels:
app: nginx-test
ingress:
- from:
- podSelector:
matchLabels:
app: nginx-test
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
podSelector | egress/podSelector | ingress/podSelector | 说明 |
---|---|---|---|
app: pod1 | app: pod2 | app: pod2 | pod1 的网络可以去pod2,同时允许pod2网络进来 |
app: pod2 | app: pod1 | app: pod1 | pod2 的网络可以去pod1,同时允许pod1网络进来 |
可能你会想这个表格是什么意思,当只存在一条规则的时候,网络只是单向的(默认创建A规则所有都拒绝,比如只存在第一条,pod1能连接pod2,但pod2默认规则无法出),而不是pod之间互通,或者创建一条类似C一样的规则,pod标签一样
# 允许某个namespace访问
default默认拒绝所有(A规则),devtest无任何规则,目的:让devtest里面的pod标签为"nginx-test2"可以访问
- 创建一个带labels 的命名空间devtest
apiVersion: v1
kind: Namespace
metadata:
labels:
ns: devtest
name: devtest
2
3
4
5
6
- D)注意这里的from 是一个元素,default命名空间里面携带"nginx-test2"标签的pod ,能够访问命名空间 devtest 里,携带标签 nginx-test2 的pod,同时允许访问进来
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-ns-devtest-nginx-test2
namespace: default
spec:
podSelector:
matchLabels:
app: nginx-test2
egress:
- to:
- namespaceSelector:
matchLabels:
ns: devtest
podSelector:
matchLabels:
app: nginx-test2
ingress:
- from:
- namespaceSelector:
matchLabels:
ns: devtest
podSelector:
matchLabels:
app: nginx-test2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
- E)注意这里的from 是两个元素,允许来自本地命名空间(这里是default)中标有 "nginx-test2" 的 Pod 的连接,或 来自任何命名空间中标有 "ns: devtest"的任何 Pod 的连接
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-ns-devtest-nginx-test2
namespace: default
spec:
podSelector:
matchLabels:
app: nginx-test2
egress:
- to:
- namespaceSelector:
matchLabels:
ns: devtest
- podSelector:
matchLabels:
app: nginx-test2
ingress:
- from:
- namespaceSelector:
matchLabels:
ns: devtest
- podSelector:
matchLabels:
app: nginx-test2
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# NetworkPolicy限制端口与协议
- F)端口与IP限制
egress: 允许pod标签为 "nginx-test2" 访问192.168.5.0/24 网段的IP,且只有3306的端口协议为TCP放开
ingress: 允许命名空间携带标签为"ns: devtest",且pod标签为 "nginx-test" 访问命名空间为default POD标签为 "nginx-test2"的pod 的端口80 且协议为TCP
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-ns-devtest-nginx-test2
namespace: default
spec:
podSelector:
matchLabels:
app: nginx-test2
egress:
- to:
- ipBlock:
cidr: 192.168.5.0/24
ports:
- protocol: TCP
port: 3306
ingress:
- from:
- namespaceSelector:
matchLabels:
ns: devtest
podSelector:
matchLabels:
app: nginx-test
ports:
- protocol: TCP
port: 80
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
特性状态: Kubernetes v1.25 版本 还支持 NetworkPolicy.spec.ingress.ports.endPort (1:endPort 字段必须等于或者大于 port 字段的值。2:只有在定义了 port 时才能定义 endPort。3:都是数字)
相信你看完所有的上面所有例子,对NetworkPolicy网络策略基本都熟悉了
# 默认dns 策略 ClusterFirst
kind: Pod
spec:
dnsPolicy: ClusterFirst
2
3
新创建pod 查看 /etc/resolv.conf
root@nginx-dp-75754b4785-867sx:/# cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.96.0.10
- 容器service内部dns
apiVersion: v1
kind: Service
metadata:
name: nginx-web
labels:
app: web
spec:
selector:
app: web
ports:
- name: web
port: 88
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-dp
name: nginx-dp
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: h5
dnsPolicy: ClusterFirst
nodeSelector:
env: test
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Service_Name(svc名).Namespces_Name(空间名).svc.cluster.local:Service_Port(svc端口)
curl nginx-web.default.svc.cluster.local:88