动一下小手点一下赞。谢谢! 你的赞就是我更新的动力。
在Kubernetes(K8S)中,不同的Namespace之间的通信是一个常见的需求。在实际应用中,我们可能需要让不同的Namespace之间相互访问服务或资源。下面我将详细介绍如何实现K8S两个Namespace之间的通信。
K8S两个Namespace通信流程
步骤 |
操作 |
1 |
创建两个Namespace |
2 |
创建Service暴露服务 |
3 |
创建NetworkPolicy限制网络访问 |
操作步骤及代码示例
步骤一:创建两个Namespace
首先,我们需要创建两个Namespace,分别命名为namespace1和namespace2。
# namespace1.yaml
apiVersion: v1
kind: Namespace
metadata:
name: namespace1
# namespace2.yaml
apiVersion: v1
kind: Namespace
metadata:
name: namespace2
通过kubectl apply命令将上述yaml文件应用到集群中:
kubectl apply -f namespace1.yaml
kubectl apply -f namespace2.yaml
步骤二:创建Service暴露服务
在每个Namespace中创建一个Service,用于暴露服务:
# service1.yaml
apiVersion: v1
kind: Service
metadata:
name: service1
namespace: namespace1
spec:
selector:
app: app1
ports:
- protocol: TCP
port: 80
targetPort: 80
# service2.yaml
apiVersion: v1
kind: Service
metadata:
name: service2
namespace: namespace2
spec:
selector:
app: app2
ports:
- protocol: TCP
port: 80
targetPort: 80
同样,通过kubectl apply命令将上述yaml文件应用到集群中:
kubectl apply -f service1.yaml
kubectl apply -f service2.yaml
步骤三:创建NetworkPolicy限制网络访问
为了限制不同Namespace之间的网络访问,我们需要创建NetworkPolicy:
# allow-namespace1.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-namespace1
namespace: namespace1
spec:
podSelector:
matchLabels:
app: app1
ingress:
- from:
- namespaceSelector:
matchLabels:
name: namespace2
# allow-namespace2.yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-namespace2
namespace: namespace2
spec:
podSelector:
matchLabels:
app: app2
ingress:
- from:
- namespaceSelector:
matchLabels:
name: namespace1
同样,通过kubectl apply命令将上述yaml文件应用到集群中:
kubectl apply -f allow-namespace1.yaml
kubectl apply -f allow-namespace2.yaml
总结
通过以上步骤,我们成功实现了K8S两个Namespace之间的通信。首先我们创建了两个Namespace,然后在每个Namespace中创建了一个Service用于暴露服务,最后创建了NetworkPolicy来限制不同Namespace之间的网络访问。