跳到主要内容
版本:main

快速开始:允许与拒绝 HTTP 请求

本教程在 varmor-networkproxy-demo 中创建自有 HTTP 后端和注入代理的客户端,仅允许向该后端发送 GET /allow/…。后端本身对所有 GET 路径返回 200,因此访问日志可区分代理拒绝和后端错误。

前提

  • 安装 vArmor v0.10.5 和配套自定义 Envoy/proxyinit 镜像,见安装
  • 使用独立网络命名空间的 Linux Pod,集群准入策略允许注入 root 容器及 NET_ADMIN,见安全与兼容性
  • 示例假定 DNS 后缀为 cluster.local,如不同,需要同时修改策略和请求 URL。
  • 确认 namespace 名称尚未使用,清理会删除整个专属 namespace,不要复用业务 namespace。

业务 UID1000 与默认代理 UID1337 不同。无需真实 API 凭据或 MITM 证书。

1. 创建后端

保存为 backend.yaml 并执行:

backend.yaml
apiVersion: v1
kind: Namespace
metadata:
name: varmor-networkproxy-demo
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend
namespace: varmor-networkproxy-demo
spec:
replicas: 1
selector:
matchLabels: {app: np-guide-backend}
template:
metadata:
labels: {app: np-guide-backend}
spec:
automountServiceAccountToken: false
securityContext:
runAsUser: 1000
runAsNonRoot: true
containers:
- name: backend
image: python:3.12-alpine
command: [python3, -u, -c]
args:
- |
from http.server import BaseHTTPRequestHandler, HTTPServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b"backend reached\n")
HTTPServer(("0.0.0.0", 8000), Handler).serve_forever()
ports:
- containerPort: 8000
readinessProbe:
tcpSocket: {port: 8000}
---
apiVersion: v1
kind: Service
metadata:
name: backend
namespace: varmor-networkproxy-demo
spec:
selector: {app: np-guide-backend}
ports:
- port: 8000
targetPort: 8000
kubectl apply -f backend.yaml
kubectl rollout status deployment/backend -n varmor-networkproxy-demo --timeout=120s

后端未设置 vArmor 注入标签,其就绪探针使用 TCP 检查,不会向访问日志添加 HTTP 请求。

2. 先创建策略

保存为 policy.yaml:

policy.yaml
apiVersion: crd.varmor.org/v1beta1
kind: VarmorPolicy
metadata:
name: http-guide
namespace: varmor-networkproxy-demo
spec:
target:
kind: Pod
name: client
policy:
enforcer: NetworkProxy
mode: EnhanceProtect
enhanceProtect:
networkProxyRawRules:
egress:
defaultAction: deny
httpRules:
- qualifiers: [allow, audit]
match:
hosts: [backend.varmor-networkproxy-demo.svc.cluster.local]
ports: [{port: 8000}]
paths: [{prefix: /allow/}]
methods: [GET]
kubectl apply -f policy.yaml
kubectl wait -n varmor-networkproxy-demo --for=jsonpath='{.status.ready}'=true varmorpolicy/http-guide --timeout=120s

超时应先检查 policy status/conditions。接下来创建客户端并验证请求结果。

3. 创建并检查客户端

保存为 client.yaml:

client.yaml
apiVersion: v1
kind: Pod
metadata:
name: client
namespace: varmor-networkproxy-demo
labels:
sandbox.varmor.org/enable: "true"
spec:
automountServiceAccountToken: false
securityContext:
runAsUser: 1000
runAsNonRoot: true
containers:
- name: client
image: curlimages/curl:8.12.1
command: [sh, -c, "sleep 3600"]
kubectl apply -f client.yaml
kubectl wait -n varmor-networkproxy-demo --for=condition=Ready pod/client --timeout=120s
kubectl get pod client -n varmor-networkproxy-demo -o jsonpath='{.spec.initContainers[*].name}{"\n"}{.spec.containers[*].name}{"\n"}'

应看到 init varmor-network-proxy-init、业务容器 client 和 sidecar varmor-network-proxy。如果缺少注入容器,请先检查策略目标和 Pod 事件。

4. 验证允许与拒绝

每条请求执行一次,保留状态码和响应:

kubectl exec -n varmor-networkproxy-demo client -c client -- \
curl --noproxy '*' --max-time 10 -sS -w '\nHTTP %{http_code}\n' \
'http://backend.varmor-networkproxy-demo.svc.cluster.local:8000/allow/?case=allow-1'

kubectl exec -n varmor-networkproxy-demo client -c client -- \
curl --noproxy '*' --max-time 10 -sS -w '\nHTTP %{http_code}\n' \
'http://backend.varmor-networkproxy-demo.svc.cluster.local:8000/deny/?case=deny-1'

kubectl logs -n varmor-networkproxy-demo deployment/backend -c backend
请求客户端后端访问日志审计
/allow/?case=allow-1200,backend reached一条对应 GETAUDIT
/deny/?case=deny-1代理返回 403无对应 GETDENIED

curl 对 403 也可能退出成功,应检查 HTTP 状态码。超时/拒绝连接不是本例预期的拒绝结果。初始配置不可用时参照排障

可观测性在节点或 sidecar 中查找审计,限定 namespace/Pod。

5. 修改规则并再次验证

把 policy.yaml 的路径前缀从 /allow/ 改为 /deny/ 后 apply。检查策略状态和代理 reload 日志,等待配置文件更新并被代理加载,再使用新的 case 值重复两条请求:此时 /allow/ 应拒绝,/deny/ 应允许。

该规则变化不需要重建客户端 Pod。其他类型的变更请参阅生命周期与升级

6. 清理

kubectl delete namespace varmor-networkproxy-demo

只删除专属教程资源。之后阅读策略语义,再通过TLS 与凭据配置 HTTPS。