Kubernetes学习目录
1、基础知识
1.1、k8s策略
1.1.1、想象中的策略
到现在为止,我们之前操作过的k8s资源对象中,跟策略相关的无非就是
权限认证 - 权限认证主要是与用户登录和资源使用有关系
命名空间 - 命名空间可以将我们相关的资源进行隔离,但是我们可以通过 "命名空间.资源对象" 的方式来进行资源通信。
而实际上,k8s中对于资源控制的策略要远远的超出我们之前的理解。
1.1.2、k8s的资源策略体系
在k8s的从策略体系中,策略的内容非常庞大,不过我们可以根据自己的理解,抽取出来最主要的四个方面:
1、资源的使用限制 - limit range
2、资源的应用配额 - resource quota
3、资源的安全控制 - podsecritypolicy
4、资源的网络策略 - network policy,主要来管控资源的 通信流量的
1.1.3、转换规则策略不同
这里的策略也会被k8s集群中的控制器转换成内核的iptables的规则,只不过与service转换的规则不同。
service会被转换成iptables的net 或 mangle 表的规则
资源策略中的规则会被转换成 iptables的filter表上的规则
1.1.4、网络策略
为了使用Network Policy,Kubernetes引入了一个新的资源对象Network Policy,供用户设置
Pod间网络访问的策略。但仅定义一个网络策略是无法完成实际的网络隔离的,还需要一个策略控制器
(Policy Controller)进行策略的实现。
网络策略功能由网络插件实现,支持网络策略的插件有 Calico、Canal、kube-router等,在k8s环
境中,专门基于这些策略管理软件的操作对象叫策略控制器,最常见的是networkpolicies。
策略控制器用于监控指定区域创建对象(pod)时所生成的新API端点,并按需为其附加网络策略。
对于Pod对象来说,网络流量分为 流入(Ingress)和流出(Egress)两个方向,每个方向包含允许和禁
止两种控制策略,默认情况下,所有的策略都是允许的,应用策略后,所有未经明确允许的流量都将拒绝。
1.1.5、网络策略图
相关术语:
Pod组,NetworkPolicy通过Pod选择器选定的一组Pod
Egress,出站流量,由流量的目标网络端口 to 和端口 ports 定义
Ingress,入站流量,由流量发出的源站点 from 和流量的目标端口定义
Selector: 选择pod对象的一种机制:
基于命名空间选择pod、基于网段来选择pod、基于pod标签来选择pod
1.2、配置解析
1.2.1、实践细节
为实现细粒度的容器间网络访问隔离策略,Kubernetes发布Network Policy,目前已升级为networking.k8s.io/v1稳定版本。
Network Policy的主要功能是对Pod间的网络通信进行限制和准入控制,设置方式为将Pod的Label
作为查询条件,设置允许访问或禁止访问的客户端Pod列表。目前查询条件可以作用于Pod和Namespace级别。
1.2.2、策略图
1.2.3、资源对象属性解析
apiVersion: networking.k8s.io/v1 # 资源隶属的API群组及版本号
kind: NetworkPolicy # 资源类型的名称,名称空间级别的资源;
metadata: # 资源元数据
name <string> # 资源名称标识
namespace <string> # NetworkPolicy是名称空间级别的资源
spec: # 期望的状态
podSelector <Object> # 当前规则生效的一组目标Pod对象,必选字段;空值表示当前名称空间中的所有Pod资源
policyTypes <[]string> # Ingress表示生效ingress字段;Egress表示生效egress字段,同时提供表示二者均有效
ingress <[]Object> # 入站流量源端点对象列表,白名单,空值表示“所有”
- from <[]Object> # 具体的端点对象列表,空值表示所有合法端点
- ipBlock <Object> # IP地址块范围内的端点,不能与另外两个字段同时使用
- namespaceSelector <Object> # 匹配的名称空间内的端点
podSelector <Object> # 由Pod标签选择器匹配到的端点,空值表示<none>
ports <[]Object> # 具体的端口对象列表,空值表示所有合法端口
egress <[]Object> # 出站流量目标端点对象列表,白名单,空值表示“所有”
- to <[]Object> # 具体的端点对象列表,空值表示所有合法端点,格式同
ingres.from;
ports <[]Object> # 具体的端口对象列表,空值表示所有合法端口
注意:
入栈和出栈哪个策略生效,由 policyTypes 来决定。
如果仅配置了podSelector,表明,当前限制仅限于当前的命名空间
2、创建NetworkPolicy-实践
2.1、创建网络策略
2.1.1、定义资源配置清单
kubectl apply -f - <<'EOF'
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 10.244.0.0/16
except:
- 10.244.1.0/24
- namespaceSelector:
matchLabels:
project: develop
- podSelector:
matchLabels:
arch: frontend
ports:
- protocol: TCP
port: 6379
egress:
- to:
- ipBlock:
cidr: 10.244.0.0/24
ports:
- protocol: TCP
port: 3306
EOF
2.1.2、查询网络策略控制器
master1 ~]# kubectl get networkpolicies
NAME POD-SELECTOR AGE
test-network-policy role=db 15s
2.2、创建deployment控制器
2.2.1、定义资源配置清单
kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
name: develop
labels:
kubernetes.io/metadata.name: develop
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: pod-deployment
name: pod-deployment
namespace: develop
spec:
replicas: 3
selector:
matchLabels:
app: pod-deployment
template:
metadata:
labels:
app: pod-deployment
spec:
containers:
- image: 192.168.10.33:80/k8s/pod_test:v0.1
name: pod-test
---
apiVersion: v1
kind: Service
metadata:
labels:
app: pod-deployment
name: pod-deployment
namespace: develop
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
app: pod-deployment
type: ClusterIP
EOF
2.2.2、查询是否创建成功
master1 ~]# kubectl -n develop get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-deployment-59c85b5d69-fmxfd 1/1 Running 0 12m 10.244.3.9 node1 <none> <none>
pod-deployment-59c85b5d69-qr26z 1/1 Running 0 12m 10.244.3.10 node1 <none> <none>
pod-deployment-59c85b5d69-zgbf4 1/1 Running 0 12m 10.244.4.7 node2 <none> <none>
master1 ~]# kubectl -n develop get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
pod-deployment 3/3 3 3 12m
master1 ~]# kubectl -n develop get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
pod-deployment ClusterIP 10.111.188.179 <none> 80/TCP 12m
2.3、访问 SVC IP地址 测试是否正常
master1 ~]# curl 10.111.188.179
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-qr26z, ServerIP: 10.244.3.10!
master1 ~]# curl 10.111.188.179
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-fmxfd, ServerIP: 10.244.3.9!
master1 ~]# curl 10.111.188.179
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-qr26z, ServerIP: 10.244.3.10!
master1 ~]# curl 10.111.188.179
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-zgbf4, ServerIP: 10.244.4.7!
3、流量管控
3.1、流量管控策略-设置默认拒绝所有pod
3.1.1、定义资源配置清单
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: develop
spec:
podSelector: {}
policyTypes: ["Ingress", "Egress"]
EOF
配置解析:
这里面的 podSelector 值为空,表示当前命名空间中所有的pod
policyType中指明了 Ingress 和 Egress。但是没有定义任何ingress字段,表示不允许所有pod有流量通过
3.1.2、查看创建的资源
master1 ~]# kubectl get networkpolicies -n develop
NAME POD-SELECTOR AGE
deny-all-ingress <none> 22s
3.1.3、访问所有的pod和svc IP地址,访问不了
master1 ~]# kubectl get pods -n develop -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-deployment-59c85b5d69-fmxfd 1/1 Running 0 20m 10.244.3.9 node1 <none> <none>
pod-deployment-59c85b5d69-qr26z 1/1 Running 0 20m 10.244.3.10 node1 <none> <none>
pod-deployment-59c85b5d69-zgbf4 1/1 Running 0 20m 10.244.4.7 node2 <none> <none>
[root@master1 ~]# kubectl get svc -n develop
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
pod-deployment ClusterIP 10.111.188.179 <none> 80/TCP 23m
# 访问SVC IP地址,都是访问不了
[root@master1 ~]# curl --connect-timeout 2 10.111.188.179
curl: (28) Connection timed out after 2001 milliseconds
# 访问POD IP地址,都是访问不了
master1 ~]# curl --connect-timeout 2 10.244.3.9
curl: (28) Connection timed out after 2001 milliseconds
master1 ~]# curl --connect-timeout 2 10.244.3.10
curl: (28) Connection timed out after 2002 milliseconds
master1 ~]# curl --connect-timeout 2 10.244.4.7
curl: (28) Connection timed out after 2001 milliseconds
3.1.4、删除创建的networkpolicies
# 删除掉,继续下一个示例
kubectl -n develop delete networkpolicies deny-all-ingress
3.1.5、总结
所有pod都不能相互访问
3.2、流量管控策略-设置默认允许所有pod
3.2.1、定义资源配置清单
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-ingress
namespace: develop
spec:
podSelector: {}
policyTypes: ["Ingress", "Egress"]
egress:
- {}
ingress:
- {}
EOF
配置解析:
在下面分别指定了egress和ingress,虽然没有配置,表示所有的pod都不采用默认拒绝策略 -- 全部接收请求
3.2.2、查看创建的资源
master1 ~]# kubectl -n develop get networkpolicies
NAME POD-SELECTOR AGE
allow-all-ingress <none> 9m19s
3.2.3、访问所有的pod和svc IP地址,可以访问了
master1 ~]# kubectl -n develop get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-deployment-59c85b5d69-fmxfd 1/1 Running 0 31m 10.244.3.9 node1 <none> <none>
pod-deployment-59c85b5d69-qr26z 1/1 Running 0 31m 10.244.3.10 node1 <none> <none>
pod-deployment-59c85b5d69-zgbf4 1/1 Running 0 31m 10.244.4.7 node2 <none> <none>
master1 ~]# kubectl -n develop get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
pod-deployment ClusterIP 10.111.188.179 <none> 80/TCP 31m
master1 ~]# curl 10.111.188.179
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-zgbf4, ServerIP: 10.244.4.7!
aster1 ~]# curl 10.244.3.9
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-fmxfd, ServerIP: 10.244.3.9!
master1 ~]# curl 10.244.3.10
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-qr26z, ServerIP: 10.244.3.10!
master1 ~]# curl 10.244.4.7
kubernetes pod-test v0.1!! ClientIP: 192.168.10.26, ServerName: pod-deployment-59c85b5d69-zgbf4, ServerIP: 10.244.4.7!
3.2.4、删除创建的networkpolicies
# 删除掉,继续下一个示例
kubectl -n develop delete networkpolicies allow-all-ingress
3.2.5、总结
所有的pod都可以相互访问
3.3、流量管控策略-设置只允许当前命名空间所有流量允许访问
3.3.1、定义资源配置清单
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: develop
spec:
podSelector: {}
policyTypes: ["Ingress", "Egress"]
egress:
- to:
- podSelector: {}
ingress:
- from:
- podSelector: {}
EOF
配置解析:
虽然设置了egress和ingress属性,但是下面的podSelector没有选择节点,表示只有当前命名空间所有节点不受限制
3.3.2、查看创建的资源
master1 ~]# kubectl -n develop get networkpolicies
NAME POD-SELECTOR AGE
allow-all-ingress <none> 13m
deny-all-ingress <none> 22m
3.3.3、进入kube-system命令空间POD,访问不了svc ip
master2 ~]# kubectl get svc -n develop
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
pod-deployment ClusterIP 10.111.188.179 <none> 80/TCP 48m
master1 ~]# kubectl get pods -o wide -n develop
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-deployment-59c85b5d69-fmxfd 1/1 Running 0 59m 10.244.3.9 node1 <none> <none>
pod-deployment-59c85b5d69-qr26z 1/1 Running 0 59m 10.244.3.10 node1 <none> <none>
pod-deployment-59c85b5d69-zgbf4 1/1 Running 0 59m 10.244.4.7 node2 <none> <none>
# 命名空间:kube-system,svc访问不了
master1 ~]# kubectl run pod-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n kube-system --rm -it --command -- /bin/bash
root@pod-test:/# curl --connect-timeout 2 10.111.188.179
curl: (28) Connection timed out after 2001 milliseconds
3.3.4、进入develop命令空间POD,可以访问svc ip
master2 ~]# kubectl get svc -n develop
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
pod-deployment ClusterIP 10.111.188.179 <none> 80/TCP 48m
master1 ~]# kubectl get pods -o wide -n develop
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-deployment-59c85b5d69-fmxfd 1/1 Running 0 59m 10.244.3.9 node1 <none> <none>
pod-deployment-59c85b5d69-qr26z 1/1 Running 0 59m 10.244.3.10 node1 <none> <none>
pod-deployment-59c85b5d69-zgbf4 1/1 Running 0 59m 10.244.4.7 node2 <none> <none>
# 命名空间:develop,svc是可以访问的
root@pod-test:/# curl --connect-timeout 2 10.111.188.179
kubernetes pod-test v0.1!! ClientIP: 10.244.4.17, ServerName: pod-deployment-59c85b5d69-qr26z, ServerIP: 10.244.3.10!
3.3.5、删除创建的networkpolicies
# 删除掉,继续下一个示例
kubectl -n develop delete networkpolicies deny-all-ingress
3.3.6、总结
只有同名空间的资源可以正常访问,而跨ns的资源是无法被访问
3.4、流量管控策略-使用标签选择器限制访问
当前仅容器隧道网络模型的集群支持网络策略(NetworkPolicy)。
更多参考华为云文档:https://support.huaweicloud.com/usermanual-cce/cce_01_0059.html
3.4.1、定义资源配置清单
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-ingress
namespace: develop
spec:
podSelector: {}
policyTypes: ["Ingress", "Egress"]
egress:
- to:
- podSelector: {}
ingress:
- from:
- ipBlock:
cidr: 10.244.0.0/16
except:
- 10.244.4.16/32
- podSelector:
matchLabels:
run: pod-test1
ports:
- protocol: TCP
port: 80
EOF
配置解析:
1、虽然设置了egress和ingress属性,但是spec.podSelector没有选择节点,表示只有当前命名空间所有节点不受限制,如果配置的话,就是限定哪些pod的入口。
2、通过标签选择可访问的入口“run: pod-test1”。
2.4.2、查询创建结果
master1 ~]# kubectl -n develop get networkpolicies
NAME POD-SELECTOR AGE
deny-all-ingress <none> 37s
3.4.3、运行pod
kubectl run my-web-test --image=192.168.10.33:80/k8s/pod_test:v0.1 -n develop
master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-test 1/1 Running 0 42s 10.244.4.43 node2 <none> <none>
3.4.4、创建两个不同标签的pod
master1 ~]# kubectl run pod-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n develop --rm -it --command -- /bin/bash
master1 ~]# kubectl run pod-test1 --image=192.168.10.33:80/k8s/my_nginx:v1 -n develop --rm -it --command -- /bin/bash
3.4.5、查询pod的创建结果
master3 ~]# kubectl get pod -n develop --show-labels
NAME READY STATUS RESTARTS AGE LABELS
pod-test 1/1 Running 0 111s run=pod-test
pod-test1 1/1 Running 0 100s run=pod-test1
3.4.6、在两个pod中分别访问svc ip
root@pod-test1 # curl 10.96.80.213
kubernetes pod-test v0.1!! ClientIP: 10.244.5.18, ServerName: pod-deployment76dd67889b-s4m69, ServerIP: 10.244.6.11!
root@pod-test1 # nslookup 10.96.80.213
;; connection timed out; no servers could be reached
root@pod-test # curl 10.96.80.213
curl: (28) Failed to connect to 10.96.80.213 port 80: Operation timed out
结果显示:
在 pod-test 中无法执行 curl 10.96.80.213
pod-test1 可以正常访问svc的ip地址,由于出栈的时候没有办法对dns域名进行解析,所以无法curl域名
3.4.7、修改资源配置清单-解决DNS无法解析的问题
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: egress-controller
namespace: develop
spec:
podSelector:
matchLabels:
run: pod-test1
policyTypes: ["Egress"]
egress:
- to:
ports:
- protocol: UDP
port: 53
- to:
- podSelector:
matchLabels:
run: pod-test1
ports:
- protocol: TCP
port: 80
3.4.8、删除创建的networkpolicies
# 删除掉,继续下一个示例
kubectl -n develop delete networkpolicies deny-all-ingress
3.5、流量管控策略-使用命名空间限制访问
3.5.1、需求
大量的规则,会导致我们无法正常工作,或者艰难工作。
- 多个规则可能导致冲突、重复
- 多个规则的先后执行顺序导致结果不一样
所以我们在定制规则的时候,最好放到一个配置文件中。或者所有的规则都是经过精心管理和模块化管理的时候。而名称空间的控制就属于一种模块化管理方式。
3.5.2、查看命名空间的标签
master1 ~]# kubectl get ns --show-labels
NAME STATUS AGE LABELS
default Active 23h kubernetes.io/metadata.name=default
develop Active 23m kubernetes.io/metadata.name=develop
kube-node-lease Active 23h kubernetes.io/metadata.name=kube-node-lease
kube-public Active 23h kubernetes.io/metadata.name=kube-public
kube-system Active 23h kubernetes.io/metadata.name=kube-system
3.5.3、定义资源配置清单
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: ingress-controller
namespace: develop
spec:
podSelector: {}
policyTypes: ["Ingress"]
ingress:
- from:
- namespaceSelector:
matchExpressions:
- key: kubernetes.io/metadata.name
operator: In
values: [develop, kube-system, logs]
- from:
- namespaceSelector:
matchExpressions:
- {key: kubernetes.io/metadata.name, operator: NotIn, values: ["default"]}
EOF
3.5.4、查看pod和svc ip地址
master1 ~]# kubectl get pod -o wide -n develop
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-deployment-59c85b5d69-4jd2h 1/1 Running 0 28m 10.244.4.31 node2 <none> <none>
pod-deployment-59c85b5d69-7fnhh 1/1 Running 0 28m 10.244.3.22 node1 <none> <none>
pod-deployment-59c85b5d69-hj5nq 1/1 Running 0 28m 10.244.3.23 node1 <none> <none>
pod-test 1/1 Running 0 20m 10.244.3.24 node1 <none> <none>
master1 ~]# kubectl get svc -o wide -n develop
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
pod-deployment ClusterIP 10.98.89.69 <none> 80/TCP 28m app=pod-deployment
3.5.5、使用default,测试访问不了
master1 ~]# kubectl run pod-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n develop --rm -it --command -- /bin/bash
root@pod-test:/# curl --connect-timeout 2 10.98.89.69
kubernetes pod-test v0.1!! ClientIP: 10.244.4.35, ServerName: pod-deployment-59c85b5d69-7fnhh, ServerIP: 10.244.3.22!
3.5.6、使用develop,测试可以访问
master1 ~]# kubectl run pod-test --image=192.168.10.33:80/k8s/my_nginx:v1 --rm -it --command -- /bin/bash
root@pod-test:/# curl --connect-timeout 2 10.98.89.69
curl: (28) Connection timed out after 2001 milliseconds
3.5.7、删除创建的networkpolicies
# 删除掉,继续下一个示例
kubectl -n develop delete networkpolicies ingress-controller
4、Calico之GlobalNetworkPolicy-实践
4.1、基础知识
4.1.1、问题
尽管k8s自己的NetworkPolicy功能上日渐丰富,但k8s自己的NetworkPolicy资源仍然具有相当的
局限性,例如它没有明确的拒绝规则、缺乏对选择器高级表达式的支持、不支持应用层规则,以及没有集群范围的网络策略等。
根据我们的实践可知,每个networkpolicy都是以当前命名空间为中心,进行的网络策略控制。如果命
名空间过多的话,会导致我们无法正常工作,或者艰难工作。 而这属于k8s网络管控的固有缺陷。
4.1.2、资源对象
我们安装完毕calico之后,会自动生成一些自定义的资源对象,这些资源对象包括NetworkPolicy和GlobalNetworkPolicy等.
master1 ~]# kubectl api-resources | grep -i globalnetworkpolicies
globalnetworkpolicies crd.projectcalico.org/v1 false GlobalNetworkPolicy
4.1.3、GlobalNetworkPolicy与NetworkPolicy对比
其中的NetworkPolicy CRD比Kubernetes NetworkPolicy API提供了更大的功能集,包括支持拒绝规则、规则解析级别以及应用层规则等,但相关的规则需要由calicoctl创建。
以GlobalNetworkPolicy为例,它支持使用selector、serviceAccountSelector或namespaceSelector来选定网络策略的生效范围,默认为all(),即集群上的所有端点。
高级场景:
转发流量、防御DOS
资源 解析
NetworkPolicy 简称 np ;是命名空间级别资源。规则应用于与标签选择器匹配的endpoint的集合
GlobalNetworkPolicy 简称 gnp / gnps 与 NetworkPolicy 功能一样,是整个集群级别的资源
4.2、根据命名空间限制网络
4.2.1、定义资源配置清单
# 限定命令空间标签为name=develop的网络策略,允许标签name=develop和name=kube-system访问
kubectl apply -f - <<EOF
apiVersion: crd.projectcalico.org/v1
kind: GlobalNetworkPolicy
metadata:
name: namespaces-default
spec:
order: 0.0
namespaceSelector: name in {"develop"}
types: ["Ingress", "Egress"]
ingress:
- action: Allow
source:
namespaceSelector: name in {"develop","kube-system"}
egress:
- action: Allow
EOF
重点解析:
namespaceSelector: name in {"develop","kube-system"},此处的name表示命令空间的LABELS里面的name=develop所以,需要生效的话,需要给命令空间先打标签,否则会无效。
4.2.2、查询创建的结果
master1 ~]# kubectl get globalnetworkpolicies.crd.projectcalico.org -A
NAME AGE
namespaces-default 4s
4.2.3、给命名空间kube-system、develpo打标签
kubectl label ns develop name=develop
kubectl label ns kube-system name=kube-system
master1 ~]# kubectl get ns -o wide --show-labels
NAME STATUS AGE LABELS
default Active 36h kubernetes.io/metadata.name=default
develop Active 12h kubernetes.io/metadata.name=develop,name=develop
kube-node-lease Active 36h kubernetes.io/metadata.name=kube-node-lease
kube-public Active 36h kubernetes.io/metadata.name=kube-public
kube-system Active 36h kubernetes.io/metadata.name=kube-system,name=kube-system
# 删除标签的方法
kubectl label ns develop name-
kubectl label ns kube-system name-
4.2.4、运行pod
master1 ~]# kubectl run pod-test --image=192.168.10.33:80/k8s/pod_test:v0.1 -n develop
pod/pod-test created
master1 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-test 1/1 Running 0 99s 10.244.4.37 node2 <none> <none>
4.2.5、运行default命令空间测试-访问不了
master1 ~]# kubectl run nginx-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n default --rm -it --command -- /bin/bash
root@nginx-test:/# curl --connect-timeout 2 10.244.3.43
curl: (28) Connection timed out after 2001 milliseconds
4.2.6、运行kube-system命令空间测试-可以访问
master1 ~]# kubectl run nginx-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n kube-system --rm -it --command -- /bin/bash
root@nginx-test:/# curl --connect-timeout 2 10.244.3.43
kubernetes pod-test v0.1!! ClientIP: 10.244.4.75, ServerName: pod-test, ServerIP: 10.244.3.43!
4.2.7、运行develop命令空间测试-可以访问
master1 ~]# kubectl run nginx-test --image=192.168.10.33:80/k8s/my_nginx:v1 -n develop --rm -it --command -- /bin/bash
root@nginx-test:/# curl --connect-timeout 2 10.244.3.43
kubernetes pod-test v0.1!! ClientIP: 10.244.4.74, ServerName: pod-test, ServerIP: 10.244.3.43!