创建一个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 17s NAME 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: nginx
ingress:
- 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 服务,请求将超时:
代码语言:javascript复制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