服务发布限制
服务发布限制
一般情况下,一个项目的服务发布,会把域名的根路径指向前端应用,接口路径指向对应的网关或者微服务。
假设现在创建一个 Nginx 服务充当前端页面,配置网络策略只让 Ingress Controller 访问该应用:
创建应用
暴露服务
查看创建的服务
在没有任何网络策略的情况下,该服务可以被任何 Pod 访问:
# 统一命名空间
kubectl run -ti --rm debug-tools --image=docker.io/curlimages/curl:7.86.0 -- sh
> curl -kIs nginx.nw-demo
# 在 default 命名空间测试
kubectl run -ti --rm debug-tools -n default --image=docker.io/curlimages/curl:7.86.0 -- sh
> curl -kIs nginx.nw-demo
配置网络策略只让 Ingress Controller 访问该服务:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: nginx-np
namespace: nw-demo
spec:
podSelector:
matchLabels:
app: nginx
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
name: ingress-nginx
podSelector:
matchLabels:
"app.kubernetes.io/name": ingress-nginx
- podSelector: {}
ports:
- protocol: TCP
port: 80
注意: 该条策略对具有 app=nginx
标签的Pod生效,只让具有 name=ingress-nginx
标签的 Namespace 下的具有 app.kubernetes.io/name=ingress-nginx
标签的 Pod 访问(需要根据实际的 Ingress 标签进行更改),同时还有一个允许当前 Namespace 下的 Pod 访问的策略 - podSelector: {}
。
测试在没有被允许的命名空间无法访问
# 在 default 命名空间测试
kubectl run -i -t --rm debug-tools -n default --image=docker.io/curlimages/curl:7.86.0 -- sh
/ $ curl --max-time 10 -kIs nginx.nw-demo
/ $ echo $?
28
测试在允许范围内的 Pod 可以访问
# 在当前命名空间测试
kubectl run -ti --rm debug-tools --image=docker.io/curlimages/curl:7.86.0 -- sh
/ $ curl --max-time 10 -kIs nginx.nw-demo
/ $ echo $?
HTTP/1.1 200 OK
Server: nginx/1.23.2
Date: Fri, 09 Dec 2022 08:00:33 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 19 Oct 2022 10:28:53 GMT
Connection: keep-alive
ETag: "634fd165-267"
Accept-Ranges: bytes
在 ingress 的 pod 中测试
kubectl ingress-nginx -n ingress-nginx exec -i --deployment ingress-nginx-controller-controller -- curl --max-time 10 -kIs nginx.nw-demo
可以看到 Ingress Controller 和该 Namespace 下的 Pod 可以访问,其他 Namespace 不可以访问。
此时可以创建一个 Ingress,然后用域名测试:
kubectl create ingress nginx --rule="testnp.com/*=nginx:80"
# 查看 ingress 列表
kubectl ingress-nginx ingresses
测试访问