一、需求

某客户需要在huaweicloud cce 容器里实现网络隔离,结合其业务情况进行分析,发现其有如下网络隔离需求:

  • 不同 namespace 运行不同公司的业务,所以需要在 ns 级实现网络隔离;
  • 在 cce 对应网段的 VPC 里运行还有非 CCE node 的 ECS主机,ECS也是给不同的公司使用的,对这些ECS也需要访问控制,控制其仅能访问某些 pod应用;
  • pod 里的应用通过 ELB Ingress 进行服务暴漏,但这些服务也需要做访问控制,比如公司 A 仅能访问 namespaceA 暴漏出来的服务。

通过分析发现有以下方式可以实现隔离:

  1. 标准CCE:通过 NetworkPolicy 实现网络隔离;
  2. CCE Turbo:支持 CNI 网络支通,由于容器pod和node在同一网段,可以通过 security groups 安全组实现网络隔离;
  3. NodePort访问隔离:通过 VPC 安全组或 ACL实现网络隔离;
  4. ELB Ingress访问隔离:支持 Access control,可以设置只允许哪些来源IP访问;
  5. Isito:通过 Isito 或其他 APIG 工具进行控制

通过分析,首先排除掉Isito。第一:其增加了网络的复杂性,本来容器网络对客户来讲已经比较复杂了,对于其后期管理不方便;第二:会增加额外的资源开销;第三:性能问题,huaweicloud 有商业化的Isito产品ASM 产品,不过官方也仅推荐管理的Pod数量不超过200个。所以以不把复杂带给客户的原则,这个先排除掉。

这里比较推荐的方案是 CCE Turbo ,直接安全组和ACL控制,云界面上直接可以操作,配置简单,理解上也比较容易,在商务价格上管理面的价格和 CCE标准版一样,但支持的 node flavor主要为高性能的 C系列和裸金属服务器,不支持便宜的 S 、T 系列。

所以最终敲定方案是: CCE标准版(k8s 原生 Network policy) + NodePort控制(SG ACL) + ELB Ingress控制(ELB 白名单)

华为云官方对于 CCE 和 CCE Turbo网络部分说明

Category CCE Standard CCE Turbo
Network model Cloud-native network 1.0: applies to common, smaller-scale scenarios.
1. Tunnel network
2. Virtual Private Cloud (VPC) network
Cloud Native Network 2.0: applies to large-scale and high-performance scenarios.
Max networking scale: 2,000 nodes
Network performance Overlays the VPC network with the container network, causing certain performance loss. Flattens the VPC network and container network into one, achieving zero performance loss.
Network isolation 1. Tunnel network model: supports network policies for intra-cluster communications.
2. VPC network model: supports no isolation.
Associates pods with security groups. Unifies security isolation in and out the cluster via security groups’ network policies.
Security isolation Runs common containers, isolated by cgroups. 1. Physical machine: runs Kata containers, allowing VM-level isolation.
2. VM: runs common containers, isolated by cgroups.
Edge infrastructure management None Supports management of Intelligent EdgeSite (IES).

注意上面的 Network isolation 部分。

二、CCE 容器隔离

1. 集群创建

创建集群里需要选择为 Tunnel 网络(VPC网络不支持),见下图:

cce-network-settings.png

2. 网络策略配置

进入集群后,既可以对单个pod设置访问策略,也可以对Namespace设置访问策略。通过点击:Resources —> Networking ,新建network policy,界面如下:

create-network-policy

如果这里不填写目的pod信息、协议、端口、源pod label信息,就是默认Namespace级的隔离,也即当前这个应用只允许 default ns 下的应用内部互相访问,其他ns下的应用不能访问 default ns 下的应用。对应的 yaml 内容如下:

1apiVersion: networking.k8s.io/v1
2kind: NetworkPolicy
3metadata:
4  name: default
5  namespace: default
6spec:
7  podSelector: {}
8  policyTypes:
9    - Ingress

3. 测试验证

这里有两个命名空间和两个应用,default下的是nginx,newns下的是tomcat,进入tomcat容器内容访问nginx应用,发现无法访问,见下图:

kubectl-networkpolicy

删除策略后,可以正常访问:

kubectl-delete-networkpolicy

针对单个 pod 也可以设置策略,如下:

 1apiVersion: networking.k8s.io/v1
 2kind: NetworkPolicy
 3metadata:
 4  name: test-network-policy
 5  namespace: default
 6spec:
 7  podSelector:
 8    matchLabels:
 9      role: db
10  policyTypes:
11    - Ingress
12    - Egress
13  ingress:
14    - from:
15        - ipBlock:
16            cidr: 172.17.0.0/16
17            except:
18              - 172.17.1.0/24
19        - namespaceSelector:
20            matchLabels:
21              project: myproject
22        - podSelector:
23            matchLabels:
24              role: frontend
25      ports:
26        - protocol: TCP
27          port: 6379
28  egress:
29    - to:
30        - ipBlock:
31            cidr: 10.0.0.0/24
32      ports:
33        - protocol: TCP
34          port: 5978

4. Elb Ingress访问控制

ELB Ingress配置界面如下,可以

elbingress-accesscontrol.png

三、CCE Turbo网络隔离

虽然客户未选择CCE Turbo网络隔离方案,不过这里还是简单的做下说明,在创建完应用后,可以发现其对应的 pod IP和node IP在同一个网段,在pod的界面多了安全组策略的选项,在安全策略界面可以方便的使用端口、源IP、目的IP配置网络策略。

cceturbo-networkpolicy.png