跳转至

服务发布限制

服务发布限制

一般情况下,一个项目的服务发布,会把域名的根路径指向前端应用,接口路径指向对应的网关或者微服务。

假设现在创建一个 Nginx 服务充当前端页面,配置网络策略只让 Ingress Controller 访问该应用:

创建应用

kubectl create deploy nginx --image=docker.io/library/nginx:1.23.2-alpine

暴露服务

kubectl expose deploy nginx --port=80

查看创建的服务

kubectl get svc,po -l app=nginx

在没有任何网络策略的情况下,该服务可以被任何 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

测试访问

# 以实际的 ingress 访问 ip 为准
curl -H "Host:testnp.com" http://10.24.2.14:80