MST
星途 面试题库

面试题:微服务架构中Kubernetes的网络策略与安全

Kubernetes提供了网络策略(NetworkPolicy)来控制微服务之间的网络访问。请阐述如何通过NetworkPolicy实现两个不同Namespace下微服务之间的安全通信,并且解释如何配置以防止外部非授权访问?
40.0万 热度难度
后端开发微服务架构

知识考点

AI 面试

面试题答案

一键面试
  1. 实现不同Namespace下微服务之间的安全通信
    • 创建NetworkPolicy资源
      • 首先确保目标Namespace中的Pod有合适的标签来标识。例如,假设在namespace1中有一个名为service1的微服务,其Pod标签为app: service1,在namespace2中有一个名为service2的微服务,其Pod标签为app: service2
      • namespace1中创建一个NetworkPolicy,允许来自namespace2service2的访问。示例如下:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow - service2 - to - service1
  namespace: namespace1
spec:
  podSelector:
    matchLabels:
      app: service1
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: namespace2
      podSelector:
        matchLabels:
          app: service2
    ports:
    - protocol: TCP
      port: 80 # service1 监听的端口,根据实际情况调整
 - 同理,在`namespace2`中也需要创建一个`NetworkPolicy`来允许`service1`对`service2`的反向访问(如果需要双向通信的话):
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow - service1 - to - service2
  namespace: namespace2
spec:
  podSelector:
    matchLabels:
      app: service2
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: namespace1
      podSelector:
        matchLabels:
          app: service1
    ports:
    - protocol: TCP
      port: 8080 # service2 监听的端口,根据实际情况调整
  1. 防止外部非授权访问
    • 默认拒绝所有外部访问:可以通过在每个Namespace中创建一个拒绝所有外部访问的NetworkPolicy。示例如下:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default - deny - external
  namespace: namespace1 # 替换为实际Namespace名称
spec:
  podSelector: {}
  ingress: []
  • 仅允许特定来源访问:如果有合法的外部来源(如特定的IP范围或其他可信Namespace),可以在上述默认拒绝策略之上,创建允许访问的NetworkPolicy。例如,允许来自特定IP范围192.168.1.0/24的访问:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow - specific - ip - range
  namespace: namespace1 # 替换为实际Namespace名称
spec:
  podSelector:
    matchLabels:
      app: service1 # 替换为实际应用标签
  ingress:
  - from:
    - ipBlock:
        cidr: 192.168.1.0/24
    ports:
    - protocol: TCP
      port: 80 # 替换为实际端口
  • 如果涉及到集群外部的服务发现和访问,如使用Ingress:需要对Ingress资源进行严格配置,比如使用认证机制(如TLS、OAuth等),并且仅向可信的外部客户端暴露服务。同时,在Ingress的后端服务对应的Namespace中,结合NetworkPolicy限制仅允许Ingress Controller所在的Pod访问后端服务。例如:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow - ingress - to - service
  namespace: namespace1 # 替换为实际Namespace名称
spec:
  podSelector:
    matchLabels:
      app: service1 # 替换为实际应用标签
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app.kubernetes.io/name: nginx - ingress - controller # 假设Ingress Controller为Nginx,根据实际情况调整
    ports:
    - protocol: TCP
      port: 80 # 替换为实际端口