创建一个Deployment并配置Service
-
创建一个
nginx
Deployment 用于演示 Kubernetes 的 NetworkPolicy:kubectl create deployment nginx --image=nginx
输出结果
deployment.apps/nginx created
-
通过Service暴露该Deployment
kubectl expose deployment nginx --port=80
输出结果
service/nginx exposed
-
查询结果
kubectl get svc,pod
输出结果
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kuard ClusterIP 10.110.143.73 <none> 80/TCP 155d service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 155d service/nginx ClusterIP 10.102.109.126 <none> 80/TCP 17sNAME READY STATUS RESTARTS AGE pod/nginx-8f458dc5b-mj7hv 1/1 Running 0 3m36s
从另外一个pod访问Service
默认是可以从另外一个Pod访问 nginx
Service 的。下面的方法可以执行此测试:
在 default
名称空间中创建 busybox 容器,并执行 wget
命令:
kubectl run busybox --rm -ti --image=busybox -- /bin/sh
在命令行中执行 wget --spider --timeout=1 nginx
If you don't see a command prompt, try pressing enter.
/ #
/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.102.109.126:80)
remote file exists
限制对nginx的访问
下面的 NetworkPolicy
可以声明:只有带 access=true
标签的 Pod 可以访问 nginx
服务:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: access-nginx
spec:podSelector:matchLabels:app: nginxingress:- from:- podSelector:matchLabels:access: "true"
apiVersion: networking.k8s.io/v1
: 这指定了使用的 Kubernetes API 版本,表示该配置文件遵循的网络策略 API 的版本。kind: NetworkPolicy
: 这表明我们正在定义一个网络策略对象。metadata
: 这是网络策略对象的元数据部分,包含关于该策略的信息,比如名称(name
)。name: access-nginx
: 这是网络策略对象的名称。在这个例子中,它命名为 “access-nginx”。spec
: 这是网络策略对象的规范部分,定义了实际的策略规则。podSelector
: 这是策略的一个重要字段,用于选择要应用该策略的 Pod。matchLabels
: 这是一个标签选择器,用于指定选择的 Pod 必须具有哪些标签。在这里,app: nginx
表示只有带有标签app=nginx
的 Pod 才会受到这个策略的影响。换句话说,这个策略只会应用于带有app=nginx
标签的 Pod。
ingress: - from: - podSelector: matchLabels: access: "true"
: 这是策略的一个重要字段,用于指定入站流量的规则。from
: 这是一个规则条件,指定了允许访问受该策略限制的 Pod 的来源。podSelector
: 这是一个标签选择器,用于指定允许访问的来源 Pod 必须具有哪些标签。在这里,matchLabels: access: "true"
表示只有带有标签access=true
的 Pod 才被允许访问具有app=nginx
标签的 Pod。换句话说,只有带有标签access=true
的 Pod 可以访问具有app=nginx
标签的 Pod。
-
执行命令以创建该 NetworkPolicy:
kubectl apply -f network-policy.yaml
输出结果如下:
networkpolicy.networking.k8s.io/access-nginx created
从不带标签的Pod访问nginx服务
如果从不带标签的 Pod 访问该 nginx 服务,请求将超时:
kubectl run busybox --rm -ti --image=busybox -- /bin/sh
在命令行中执行 wget --spider --timeout=1 nginx
If you don't see a command prompt, try pressing enter.
/ #
/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.102.109.126:80)
wget: download timed out
从带有标签的Pod访问nginx服务
从带有 access=true
标签的 Pod 中访问 nginx 服务,将能够执行成功:
kubectl run busybox --rm -ti --labels="access=true" --image=busybox -- /bin/sh
在命令行中执行 wget --spider --timeout=1 nginx
If you don't see a command prompt, try pressing enter.
/ #
/ # wget --spider --timeout=1 nginx
Connecting to nginx (10.102.109.126:80)
remote file exists