
在命名空间 dev 中创建⽹络策略 dev-policy,只允许 命名空间 prod 中的 pod 连上 dev 中 pod 的 80 端⼝,注意:这⾥有 2 个 ns ,⼀个为 dev(⽬标pod的ns),另外⼀个为prod(访 问源pod的ns)
首先创建两个命名空间dev和prod:
root@k8s-master:~# kubectl create namespace dev
namespace/dev created
root@k8s-master:~# kubectl create namespace prod
namespace/prod created
#查看已存在的命名空间
root@k8s-master:~# kubectl get namespaces --show-labels
NAME STATUS AGE LABELS
app-team1 Active 673d kubernetes.io/metadata.name=app-team1
default Active 688d kubernetes.io/metadata.name=default
dev Active 34m kubernetes.io/metadata.name=dev
fubar Active 673d kubernetes.io/metadata.name=fubar
ing-internal Active 673d kubernetes.io/metadata.name=ing-internal
ingress-nginx Active 672d app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx,kubernetes.io/metadata.name=ingress-nginx
kube-node-lease Active 688d kubernetes.io/metadata.name=kube-node-lease
kube-public Active 688d kubernetes.io/metadata.name=kube-public
kube-system Active 688d kubernetes.io/metadata.name=kube-system
kubesphere-system Active 26h kubernetes.io/metadata.name=kubesphere-system
my-app Active 673d kubernetes.io/metadata.name=my-app,name=my-app
prod Active 34m kubernetes.io/metadata.name=prod

这里使用Deployment生成Pod
首先在dev空间生成Pod:
dev-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dev-deploy
namespace: dev
spec:
replicas: 1
selector:
matchLabels:
app: dev-pod
template:
metadata:
labels:
app: dev-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
root@k8s-master:~# vim dev-depoly.yml
root@k8s-master:~# kubectl apply -f dev-depoly.yml
deployment.apps/dev-deploy created
查看Pod信息:
root@k8s-master:~# kubectl get pod -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dev-deploy-6dccc6d68c-rqzrr 1/1 Running 0 39s 10.244.169.162 k8s-node2
然后在prod生成Pod:
prod-pod.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: prod-deploy
namespace: prod
spec:
replicas: 1
selector:
matchLabels:
app: prod-pod
template:
metadata:
labels:
app: prod-pod
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
root@k8s-master:~# vim prod-deploy.yml
root@k8s-master:~# kubectl apply -f prod-deploy.yml
deployment.apps/prod-deploy created
查看Pod信息:
root@k8s-master:~# kubectl get pod -n prod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
prod-deploy-7559496b85-8frb9 1/1 Running 0 65s 10.244.169.163 k8s-node2

在命名空间dev中设置网络策略
目标:dev
访问:prod

设置入口隔离规则:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: dev-policy
namespace: dev
spec:
podSelector:
matchLabels:
app: dev-pod
policyTypes:
- Ingress #因为是外部访问,所以设置dev的入口隔离
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: prod
- podSelector:
matchLabels: {} #选择prod所有Pod
ports:
- protocol: TCP
port: 80

设置网络策略:
root@k8s-master:~# vim dev-policy.yml
root@k8s-master:~# kubectl apply -f dev-policy.yml
networkpolicy.networking.k8s.io/dev-policy created
查看网络策略:
root@k8s-master:~# kubectl describe networkpolicy -n dev
Name: dev-policy
Namespace: dev
Created on: 2023-10-27 17:59:26 +0800 CST
Labels:
Annotations:
Spec:
PodSelector: app=dev-pod
Allowing ingress traffic:
To Port: 80/TCP
From:
NamespaceSelector: kubernetes.io/metadata.name=prod
From:
PodSelector:
Not affecting egress traffic
Policy Types: Ingress
进入prod的Pod里的容器里:
root@k8s-master:~# kubectl get pod -n prod --show-labels
NAME READY STATUS RESTARTS AGE LABELS
prod-deploy-7559496b85-8frb9 1/1 Running 0 25m app=prod-pod,pod-template-hash=7559496b85
root@k8s-master:~# kubectl exec -it prod-deploy-7559496b85-8frb9 -n prod -- /bin/bash
#访问dev-pod的ip 默认80端口
root@prod-deploy-7559496b85-8frb9:/# curl 10.244.169.162
<!DOCTYPE html>
Welcome to nginx!</title>