【问题标题】:how to limit source IP in a outside service that requests come from a pod inside kubernetes如何在请求来自 kubernetes 内的 pod 的外部服务中限制源 IP
【发布时间】:2019-08-20 23:55:00
【问题描述】:
假设我有一个mysql服务,在这个vm上,我想通过iptables限制源ip,但是源来自kubernetes pod,有没有办法实现这个目标?让一些 pod 可以访问 mysql,其他 pod 不能。
顺便说一句,我在 kubernetes 集群中的所有服务类型都是 clusterIP
我知道我可以在 Kubernetes 集群中做一些网络策略,但是在 DBA 看来,
这是你的事,我不敢相信你,我会通过 iptables 执行我的规则。
- kubernetes 版本:1.13.4
- kube 代理模式:ipvs
- 覆盖网络:印花布
- 入口控制器:nginx
【问题讨论】:
标签:
kubernetes
kubernetes-networkpolicy
【解决方案1】:
在 mysql pod 上定义网络策略规则。使用网络策略,您可以控制从特定 pod 或命名空间到 mysql pod 的流量
【解决方案2】:
尝试定义两种 Kubernetes 服务,将 ExternalIP 添加到它们,然后根据您的偏好阻止 ExternalIP(分配给公开部署或 Pod 的服务,您不想接受使用 iptables 访问数据库的连接或正确接受此连接。
例如:
对于您想要接受连接的 pod:
-
标记此 pod:
$ kubectl label pod test app=MyApp --namespace development
-
为它们定义服务,以适当的选择器对应的标签,您添加到pod
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
externalIPs:
- 80.11.12.10
-
创建它:
$ kubectl create -f service.yaml --namespace development
您也可以使用 externaiIP 修补服务,而不是将其添加到配置文件中。
-
从 MySQL 执行命令以允许 Pod 之间的连接
$ iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED --source x.x.x.x -p tcp --dport 80 -j ACCEPT
x.x.x.x是外部IP
请记住在部署 pod 时在适当的命名空间中创建服务。
对于您不想拒绝连接的 pod:
-
标记此 pod:
$ kubectl label pod egg app=test --namespace development
-
为它们定义服务,以适当的选择器对应的标签,您添加到pod
apiVersion: v1
kind: Service
metadata:
name: example1-service
spec:
selector:
app: test
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
externalIPs:
- y.y.y.y
-
创建它:
$ kubectl create -f service.yaml --namespace development
您也可以使用 externaiIP 修补服务,而不是将其添加到配置文件中。
-
从 MySQL 执行命令以允许 Pod 之间的连接
$ iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED --source y.y.y.y -p tcp -- dport 80 -j DROP
y.y.y.y是外部IP
我希望这会有所帮助。