在阿里云服务网格ASM中,您可以通过配置零信任安全授权策略,实现对进入ASM的TCP流量的授权管理。本文介绍如何为TCP流量设置授权策略。
前提条件
- 已创建命名空间。具体操作,请参见管理命名空间。本文以创建foo命名空间为例。
- 已部署应用到ASM实例的集群中。具体操作,请参见部署应用到ASM实例。本文以在foo命名空间部署tcp-echo和sleep应用为例。
- 已定义Istio资源。具体操作,请参见定义Istio资源。
步骤一:为foo命名空间注入Sidecar代理
为foo命名空间注入Sidecar代理,便于对该命名空间下的服务进行授权管理。具体操作步骤如下:
- 新建foo命名空间。
- 登录ASM控制台。
- 在左侧导航栏,选择。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面左侧导航栏选择,然后在右侧页面单击新建。
- 在新建命名空间面板设置名称为foo,然后单击确定。
- 为foo命名空间注入Sidecar代理。
- 在全局命名空间页面,单击foo命名空间右侧的自动注入列下的启用Sidecar自动注入。
- 在弹出的确认对话框中,单击确定。
步骤二:部署示例应用
部署tcp-echo作为被请求的TCP服务,sleep作为发起请求的TCP服务。
- 部署被请求的TCP服务。
- 使用以下内容,创建tcp-echo.yaml文件。
当tcp-echo收到请求后,将在请求内容新增
hello
前缀,作为返回结果。例如,向tcp-echo发送
world
,将返回
hello world
。
apiVersion: v1
kind: Service
metadata:
name: tcp-echo
labels:
app: tcp-echo
service: tcp-echo
spec:
ports:
- name: tcp
port: 9000
- name: tcp-other
port: 9001
selector:
app: tcp-echo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: tcp-echo
spec:
replicas: 1
selector:
matchLabels:
app: tcp-echo
version: v1
template:
metadata:
labels:
app: tcp-echo
version: v1
spec:
containers:
- name: tcp-echo
image: docker.io/istio/tcp-echo-server:1.2
imagePullPolicy: IfNotPresent
args: [ "9000,9001,9002", "hello" ]
ports:
- containerPort: 9000
- containerPort: 9001
- 执行以下命令,部署tcp-echo服务。
将
tcp-echo服务部署到foo命名空间,作为被请求的TCP服务。
kubectl apply -f tcp-echo.yaml -n foo
- 部署发起请求的TCP服务。
- 使用以下内容,创建sleep.yaml文件。
#Sleep service
apiVersion: v1
kind: ServiceAccount
metadata:
name: sleep
---
apiVersion: v1
kind: Service
metadata:
name: sleep
labels:
app: sleep
service: sleep
spec:
ports:
- port: 80
name: http
selector:
app: sleep
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: sleep
spec:
replicas: 1
selector:
matchLabels:
app: sleep
template:
metadata:
labels:
app: sleep
spec:
terminationGracePeriodSeconds: 0
serviceAccountName: sleep
containers:
- name: sleep
image: curlimages/curl
command: ["/bin/sleep", "3650d"]
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /etc/sleep/tls
name: secret-volume
volumes:
- name: secret-volume
secret:
secretName: sleep-secret
optional: true
---
- 执行以下命令,部署sleep服务。
将sleep服务部署到foo命名空间,用于发起TCP请求。
kubectl apply -f sleep.yaml -n foo
步骤三:验证授权前,请求是否成功
- 执行以下命令,验证sleep请求服务能否访问TCP服务的9000端口。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
预期输出:

由预期输出得到,返回hellow port 9000
和connection succeeded
,说明sleep请求服务访问TCP服务的9000端口成功。
- 执行以下命令,验证sleep请求服务能否访问TCP服务的9001端口。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
预期输出:

由预期输出得到,返回hellow port 9001
和connection succeeded
,说明sleep请求服务访问TCP服务的9001端口成功。
步骤四:配置授权策略
配置可以访问TCP服务的9000端口的授权策略,具体操作步骤如下。
- 登录ASM控制台。
- 在左侧导航栏,选择。
- 在网格管理页面,找到待配置的实例,单击实例的名称或在操作列中单击管理。
- 在网格详情页面左侧导航栏选择。
- 任选以下方式创建授权策略。
注意 配置TCP授权策略时,不能将请求操作域配置为methods,值配置为GET。这种配置仅限于HTTP请求使用,不符合TCP的ALLOW规则,为无效配置。服务网格将忽略无效的ALLOW规则,导致请求被拒绝,返回connection rejected
。
- 方式一:使用YAML创建授权策略。
- 在授权策略页面,单击使用YAML创建。
- 在创建页面,选择命名空间为foo,选择任意场景模板,将以下YAML模版粘贴到YAML区域。
kind: AuthorizationPolicy
apiVersion: security.istio.io/v1beta1
metadata:
name: demo
namespace: foo
spec:
action: ALLOW
rules:
- to:
- operation:
ports:
- '9000'
- 单击创建。
- 方式二:不使用YAML创建授权策略。
- 在授权策略页面,单击创建。
- 在创建页面,配置如下参数。
参数 |
说明 |
命名空间 |
选择foo命名空间。
|
名称 |
设置名称为demo。
|
策略 |
选择RULES。
|
动作 |
选择ALLOW。
|
请求操作 |
打开请求操作开关,单击增加请求操作到列表中,单击增加请求操作,设置请求操作域为ports,值为9000。
|

- 单击创建。
步骤五:验证授权后,请求是否成功
- 执行以下命令,验证sleep请求服务能否访问TCP服务的9001端口。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9001" | nc tcp-echo 9001' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
预期输出:

由预期输出得到,返回connection rejected
,说明sleep请求服务访问TCP服务的9001端口失败。
- 执行以下命令,验证sleep请求服务能否访问TCP服务的9000端口。
kubectl exec "$(kubectl get pod -l app=sleep -n foo -o jsonpath={.items..metadata.name})" -c sleep -n foo -- sh -c 'echo "port 9000" | nc tcp-echo 9000' | grep "hello" && echo 'connection succeeded' || echo 'connection rejected'
预期输出:

由预期输出得到,返回hellow port 9000
和connection succeeded
,说明sleep请求服务访问TCP服务的9000端口成功。