Kubernetes 尝试使用tls设置入口,并仅在GKE上对某些IP开放
我在设置一个只对某些特定IP开放的入口时遇到了问题,检查了文档,尝试了很多东西,一个源代码之外的IP继续访问。这是一个使用nginx的alpine上的Zabbix web界面,在节点端口80上设置了一个服务,然后使用入口在GCP上设置了一个负载平衡器,一切正常,web界面工作正常,但我如何才能使它仅对所需的IP进行访问? 我的防火墙规则正常,只能通过负载均衡器IP访问 此外,我还有一个用于此部署的特定命名空间 群集版本Kubernetes 尝试使用tls设置入口,并仅在GKE上对某些IP开放,kubernetes,google-cloud-platform,containers,google-kubernetes-engine,kubernetes-ingress,Kubernetes,Google Cloud Platform,Containers,Google Kubernetes Engine,Kubernetes Ingress,我在设置一个只对某些特定IP开放的入口时遇到了问题,检查了文档,尝试了很多东西,一个源代码之外的IP继续访问。这是一个使用nginx的alpine上的Zabbix web界面,在节点端口80上设置了一个服务,然后使用入口在GCP上设置了一个负载平衡器,一切正常,web界面工作正常,但我如何才能使它仅对所需的IP进行访问? 我的防火墙规则正常,只能通过负载均衡器IP访问 此外,我还有一个用于此部署的特定命名空间 群集版本1.11.5-gke.5 编辑我使用的是GKE标准入口GLBC 我的模板配置如
1.11.5-gke.5
编辑我使用的是GKE标准入口GLBC
我的模板配置如下:是否有人可以帮助我了解缺少的内容:
apiVersion: v1
kind: ReplicationController
metadata:
name: zabbix-web
namespace: zabbix-prod
labels:
app: zabbix
tier: frontend
spec:
replicas: 1
template:
metadata:
labels:
name: zabbix-web
app: zabbix
spec:
volumes:
- name: cloudsql-instance-credentials
secret:
defaultMode: 420
secretName: cloudsql-instance-credentials
containers:
- command:
- /cloud_sql_proxy
- -instances=<conection>
- -credential_file=/secrets/cloudsql/credentials.json
image: gcr.io/cloudsql-docker/gce-proxy:1.11
imagePullPolicy: IfNotPresent
name: cloudsql-proxy
resources: {}
securityContext:
allowPrivilegeEscalation: false
runAsUser: 2
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /secrets/cloudsql
name: credentials
readOnly: true
- name: zabbix-web
image: zabbix/zabbix-web-nginx-mysql:alpine-3.2-latest
ports:
- containerPort: 80
env:
- name: MYSQL_USER
valueFrom:
secretKeyRef:
key: <user>
name: <user>
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
key: <pass>
name: <pass>
- name: DB_SERVER_HOST
value: 127.0.0.1
- name: MYSQL_DATABASE
value: <db>
- name: ZBX_SERVER_HOST
value: <db>
readinessProbe:
failureThreshold: 3
httpGet:
path: /index.php
port: 80
scheme: HTTP
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 30
---
apiVersion: v1
kind: Service
metadata:
name: "zabbix-web-service"
namespace: "zabbix-prod"
labels:
app: zabbix
spec:
ports:
- port: 80
targetPort: 80
selector:
name: "zabbix-web"
type: "NodePort"
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: zabbix-web-ingress
namespace: zabbix-prod
annotations:
ingress.kubernetes.io/service.spec.externalTrafficPolicy: local
ingress.kubernetes.io/whitelist-source-range: <xxx.xxx.xxx.xxx/32>
spec:
tls:
- secretName: <tls-cert>
backend:
serviceName: zabbix-web-service
servicePort: 80
apiVersion:v1
种类:复制控制器
元数据:
名称:zabbix网站
名称空间:zabbix prod
标签:
应用程序:zabbix
层:前端
规格:
副本:1份
模板:
元数据:
标签:
名称:zabbix网站
应用程序:zabbix
规格:
卷数:
-名称:cloudsql实例凭据
秘密:
默认模式:420
secretName:cloudsql实例凭据
容器:
-命令:
-/cloud\u sql\u代理
--实例=
--credential_file=/secrets/cloudsql/credentials.json
图片:gcr.io/cloudsqldocker/gce代理:1.11
imagePullPolicy:如果不存在
名称:cloudsql代理
资源:{}
securityContext:
allowPrivilegeEscalation:false
runAsUser:2
terminationMessagePath:/dev/终止日志
terminationMessagePolicy:文件
体积数量:
-mountPath:/secrets/cloudsql
姓名:凭据
只读:正确
-名称:zabbix网站
图片:zabbix/zabbix web nginx mysql:alpine-3.2-latest
端口:
-集装箱港口:80
环境:
-名称:MYSQL\u用户
价值来源:
secretKeyRef:
关键:
姓名:
-名称:MYSQL\u密码
价值来源:
secretKeyRef:
关键:
姓名:
-名称:数据库服务器主机
数值:127.0.0.1
-名称:MYSQL\u数据库
价值:
-名称:ZBX_服务器_主机
价值:
readinessProbe:
故障保持:3
httpGet:
路径:/index.php
港口:80
方案:HTTP
秒:10
成功阈值:1
超时秒:30
---
版本:v1
种类:服务
元数据:
名称:“zabbix web服务”
命名空间:“zabbix prod”
标签:
应用程序:zabbix
规格:
端口:
-港口:80
目标港:80
选择器:
名称:“zabbix网站”
类型:“节点端口”
---
apiVersion:extensions/v1beta1
种类:入口
元数据:
名称:zabbix web入口
名称空间:zabbix prod
注释:
ingress.kubernetes.io/service.spec.externalTrafficPolicy:本地
ingress.kubernetes.io/whitelist-source-range:
规格:
tls:
-秘书长姓名:
后端:
serviceName:zabbix web服务
服务端口:80
好的,您不能通过或在上限制IP地址。请注意,在撰写本文时,GLBC也是一项正在进行的工作
ingres.kubernetes.io/whitelist源代码范围工作得很好,但是当您使用像nginx本身这样的东西时
限制/白名单IP地址的一般方法是使用(看起来您已经这样做了)。基本上,您可以将IP地址限制/列入运行K8s节点的网络的白名单。实现目标的最佳选择之一是使用防火墙规则,因为您无法通过全局LB或GCP L7 LB本身限制IP地址。但是,如果您在Kubernetes群集上使用入口,则可以根据专用IP地址限制对应用程序的访问
一个可能的用例是,您有一个开发设置,不想让所有人,尤其是竞争对手,都能使用所有新奇的新特性。在这种情况下,可以使用IP白名单来限制访问
这可以通过ingres.kubernetes.io/whitelist source range
注释指定允许的客户端IP源范围来完成
该值是以逗号分隔的CIDR块列表
例如:
10.0.0.0/24、1.1.1.1/32.
请获取更多信息。对于像我一样通过谷歌偶然发现这个问题的人,现在有了一个解决方案。您可以通过cloud.google.com
Kubernetes API中的BackendConfig
以及GCE CloudArmor策略来实现这一点
您可以通过以下方式将IP列入白名单:
切换到项目:
gcloud配置集项目$project
创建策略:
gcloud计算安全策略创建$POLICY\u NAME——说明“白名单”
将默认策略更改为拒绝:
gcloud计算安全策略规则更新2147483647--action=deny-403\
--安全策略$policy\u名称
以低于默认白名单的优先级列出要白名单的所有IP:
gcloud计算安全策略规则创建2\
--行动允许\
--安全策略$policy\u名称\
--说明“允许好友”\
--src ip范围“93.184.17.0/24151.101.1.69/32”
每个范围最多10个
注意,您需要有效的CIDR范围,以便使用
按如下方式查看策略: