注册集群网络策略(Network Policy)提供基于策略的网络控制。如果您希望在IP地址或者端口层面控制网络流量,可以为集群中特定应用使用网络策略。本文介绍如何使用ACK One注册集群的网络策略及常见的使用场景。
前提条件
自建Kubernetes集群版本需在1.20.0及以上。
已创建注册集群,并将自建Kubernetes集群接入注册集群。具体操作,请参见创建注册集群。
注意事项
Network Policy功能仅支持在ACK One注册集群的弹性容器实例ECI中使用。
暂不支持IPv6地址的网络策略。
暂不支持NetworkPolicy中EndPort配置。
NetworkPolicy规则允许通过LabelSelector选择Namespace或者Pod。但当Pod中的NetworkPolicy数量增大时,不仅会使规则生效时间延长,而且大量的NetworkPolicy规则也会对您的集群管理、问题排查带来困扰,因此建议您集群内的NetworkPolicy数量小于100个。
步骤一:开启网络策略
安装组件Poseidon。
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,单击网络页签,在Poseidon组件所在卡片的右下方,单击安装。
在安装组件Poseidon页面,选中为ECI实例启用NetworkPolicy,然后单击确认。
安装组件ack-virtual-node。
在组件管理页面,单击核心组件页签,在ack-virtual-node组件所在卡片的右下方,单击安装。
在安装组件ack-virtual-node页面,根据实际网络接入情况选择是否启用VPC内网访问,然后单击确认。
组件安装成功后,会在卡片右上角出现已安装字样。
说明若您之前已安装ack-virtual-node组件,需要将该组件升级至2.10.0及以上版本。具体操作,请参见管理组件。
步骤二:使用网络策略
执行如下命令,创建网络策略。该策略描述在
default
命名空间中,允许带有app: busybox
标签的Pod通过TCP的80端口向具有app: nginx
标签的Pod发送流量。除非具有其他网络策略,否则将阻止来自其他Pod的流量。kubectl apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: test-network-policy namespace: default spec: podSelector: matchLabels: app: nginx policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: busybox ports: - protocol: TCP port: 80 EOF
执行如下命令,创建标签为
app: nginx
的应用。kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: alibabacloud.com/eci: 'true' app: nginx spec: containers: - image: 'registry.cn-hangzhou.aliyuncs.com/eci_open/nginx:1.14.2' imagePullPolicy: IfNotPresent name: nginx ports: - containerPort: 80 protocol: TCP resources: limits: cpu: 500m EOF
执行如下命令,查看Nginx应用状态并记录Pod IP地址。
kubectl get pod -owide | grep nginx-deployment
预期输出:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deployment-698d746d4c-nXXXXXXx 1/1 Running 0 35s 192.168.XXX.XXX cn-heyuan.10.108.XX.XX <none> <none>
执行如下命令,创建标签为
app: busybox
的应用。kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: labels: app: busybox name: busybox-deployment namespace: default spec: replicas: 1 selector: matchLabels: app: busybox template: metadata: labels: alibabacloud.com/eci: 'true' app: busybox spec: containers: - args: - '-c' - ' sleep 360000000' command: - /bin/sh image: 'registry-cn-hangzhou.ack.aliyuncs.com/dev/busybox:1' imagePullPolicy: IfNotPresent name: busybox ports: - containerPort: 80 protocol: TCP resources: limits: cpu: 500m EOF
登录到busybox容器内执行如下命令,访问Nginx应用的Pod IP地址。
wget http://192.168.XXX.XXX
预期输出:
Connecting to 192.168.XXX.XXX:80... connected. HTTP request sent, awaiting response... 200 OK Length: 612 [text/html] Saving to: 'index.html' index.html 100%[================================================================================================================================>] 612 --.-KB/s in 0s 2024-11-19 20:12:09 (1.66 MB/s) - 'index.html' saved [612/612]
连接Nginx的进度为100%时,说明请求成功,可以正常访问Nginx服务。
执行如下命令,创建标签为
app: busybox-demo
的应用。kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: labels: app: busybox-demo name: busybox-deployment-demo namespace: default spec: replicas: 1 selector: matchLabels: app: busybox-demo template: metadata: labels: alibabacloud.com/eci: 'true' app: busybox-demo spec: containers: - args: - '-c' - ' sleep 360000000' command: - /bin/sh image: 'registry-cn-hangzhou.ack.aliyuncs.com/dev/busybox:1' imagePullPolicy: IfNotPresent name: busybox-demo ports: - containerPort: 80 protocol: TCP resources: limits: cpu: 500m kubectl apply -f - <<EOF
登录到busybox-demo容器执行如下命令,访问Nginx应用的Pod IP地址。
wget http://192.168.XXX.XXX
预期输出:
Connecting to 192.168.XXX.XXX:80... failed: Connection timed out.
连接Nginx超时,说明网络策略生效。