我在2个命名空间tenant1命名空间和tenant2命名空间中创建了2个租户(tenant1,tenant2)
每个租户都有db pod及其服务
如何隔离db pods/service,即如何限制pod/service从他的命名空间访问其他租户db pod?
我为每个租户使用了服务号,并应用了网络策略,以便隔离命名空间。
kubectl get svc --all-namespaces
tenant1-namespace grafana-app LoadBalancer 10.64.7.233 104.x.x.x 3000:31271/TCP 92m
tenant1-namespace postgres-app NodePort 10.64.2.80 <none> 5432:31679/TCP 92m
tenant2-namespace grafana-app LoadBalancer 10.64.14.38 35.x.x.x 3000:32226/TCP 92m
tenant2-namespace postgres-app NodePort 10.64.2.143 <none> 5432:31912/TCP 92m
所以
我想限制grafana-app仅在他的命名空间中使用他的postgres db,而不是在其他命名空间中。
但问题是使用DNS限定的服务名称(app-name.namespace-name.svc.cluster.local
)允许访问其他db pod(命名空间tenant1-namesspace中的grafana-app可以通过postgres-app.tenant2-namespace.svc.cluster.local
访问其他tenant2-namesspace中的postgres db)
更新:网络策略
1)
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-from-other-namespaces
spec:
podSelector:
matchLabels:
ingress:
- from:
- podSelector: {}
2)
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-external
spec:
podSelector:
matchLabels:
app: grafana-app
ingress:
- from: []
>
您的Net工作策略
对象是正确的,我用它们创建了一个示例,并将在下面演示。
如果您仍然可以使用FQDN访问其他命名空间上的服务,则您的NetworkPolicy
可能无法在您的群集上完全启用。
运行gcloud容器集群描述“CLUSTER_NAME”--zone“zone”
并查找以下两个片段:
addonsConfig:
networkPolicyConfig: {}
name: cluster-1
network: default
networkConfig:
network: projects/myproject/global/networks/default
subnetwork: projects/myproject/regions/us-central1/subnetworks/default
networkPolicy:
enabled: true
provider: CALICO
繁殖:
gcr.io/google-samples/hello-app:1.0
租户 1 的图像和 租户 2 的 gcr.io/google-samples/hello-app:2.0
图像,因此查看它的连接位置更简单,但我将使用您的环境名称:$ kubectl create namespace tenant1
namespace/tenant1 created
$ kubectl create namespace tenant2
namespace/tenant2 created
$ kubectl run -n tenant1 grafana-app --generator=run-pod/v1 --image=gcr.io/google-samples/hello-app:1.0
pod/grafana-app created
$ kubectl run -n tenant1 postgres-app --generator=run-pod/v1 --image=gcr.io/google-samples/hello-app:1.0
pod/postgres-app created
$ kubectl run -n tenant2 grafana-app --generator=run-pod/v1 --image=gcr.io/google-samples/hello-app:2.0
pod/grafana-app created
$ kubectl run -n tenant2 postgres-app --generator=run-pod/v1 --image=gcr.io/google-samples/hello-app:2.0
pod/postgres-app created
$ kubectl expose pod -n tenant1 grafana-app --port=8080 --type=LoadBalancer
service/grafana-app exposed
$ kubectl expose pod -n tenant1 postgres-app --port=8080 --type=NodePort
service/postgres-app exposed
$ kubectl expose pod -n tenant2 grafana-app --port=8080 --type=LoadBalancer
service/grafana-app exposed
$ kubectl expose pod -n tenant2 postgres-app --port=8080 --type=NodePort
service/postgres-app exposed
$ kubectl get all -o wide -n tenant1
NAME READY STATUS RESTARTS AGE IP NODE
pod/grafana-app 1/1 Running 0 100m 10.48.2.4 gke-cluster-114-default-pool-e5df7e35-ez7s
pod/postgres-app 1/1 Running 0 100m 10.48.0.6 gke-cluster-114-default-pool-e5df7e35-c68o
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/grafana-app LoadBalancer 10.1.23.39 34.72.118.149 8080:31604/TCP 77m run=grafana-app
service/postgres-app NodePort 10.1.20.92 <none> 8080:31033/TCP 77m run=postgres-app
$ kubectl get all -o wide -n tenant2
NAME READY STATUS RESTARTS AGE IP NODE
pod/grafana-app 1/1 Running 0 76m 10.48.4.8 gke-cluster-114-default-pool-e5df7e35-ol8n
pod/postgres-app 1/1 Running 0 100m 10.48.4.5 gke-cluster-114-default-pool-e5df7e35-ol8n
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/grafana-app LoadBalancer 10.1.17.50 104.154.135.69 8080:30534/TCP 76m run=grafana-app
service/postgres-app NodePort 10.1.29.215 <none> 8080:31667/TCP 77m run=postgres-app
grafana-app
:$ cat default-deny-other-ns.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: deny-from-other-namespaces
spec:
podSelector:
matchLabels:
ingress:
- from:
- podSelector: {}
$ cat allow-grafana-ingress.yaml
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: web-allow-external
spec:
podSelector:
matchLabels:
run: grafana-app
ingress:
- from: []
默认情况下,pods是非隔离的;他们接受来自任何来源的流量。
pod通过选择它们的网络策略而变得孤立。一旦命名空间中的任何网络策略选择了特定的pod,该pod将拒绝任何网络策略不允许的任何连接。(命名空间中未被任何网络策略选择的其他pod将继续接受所有流量。)
网络策略不冲突;它们是相加的。如果任何一个或多个策略选择了一个pod,该pod将被限制为这些策略的进入/退出规则的联合所允许的范围。因此,评估顺序不会影响策略结果。
$ kubectl apply -n tenant1 -f default-deny-other-ns.yaml
networkpolicy.networking.k8s.io/deny-from-other-namespaces created
$ kubectl apply -n tenant2 -f default-deny-other-ns.yaml
networkpolicy.networking.k8s.io/deny-from-other-namespaces created
$ kubectl apply -n tenant1 -f allow-grafana-ingress.yaml
networkpolicy.networking.k8s.io/web-allow-external created
$ kubectl apply -n tenant2 -f allow-grafana-ingress.yaml
networkpolicy.networking.k8s.io/web-allow-external created
tenant1
中的grafana-app
并尝试在两个命名空间中访问postgg-app
并检查输出:$ kubectl exec -n tenant1 -it grafana-app -- /bin/sh
/ ### POSTGRES SAME NAMESPACE ###
/ # wget -O- postgres-app:8080
Connecting to postgres-app:8080 (10.1.20.92:8080)
Hello, world!
Version: 1.0.0
Hostname: postgres-app
/ ### GRAFANA OTHER NAMESPACE ###
/ # wget -O- --timeout=1 http://grafana-app.tenant2.svc.cluster.local:8080
Connecting to grafana-app.tenant2.svc.cluster.local:8080 (10.1.17.50:8080)
Hello, world!
Version: 2.0.0
Hostname: grafana-app
/ ### POSTGRES OTHER NAMESPACE ###
/ # wget -O- --timeout=1 http://postgres-app.tenant2.svc.cluster.local:8080
Connecting to postgres-app.tenant2.svc.cluster.local:8080 (10.1.29.215:8080)
wget: download timed out
如果在仔细检查主节点和节点上启用了网络策略后,您仍然面临相同的问题,请在评论中告诉我,我们可以进一步挖掘。
我有一个装在Docker容器中的NodeJS应用程序,我可以通过它向<code>smtp.gmail发送电子邮件。com(使用<code>nodeEmailer从Ubuntu容器中使用docker exec…,ping工作正常。我想知道是什么问题。详情如下:- 我的 Macbook: < li >操作系统:MacOS High Sierra(版本10.13.6) < li>Docker:版本18.
问题内容: Ajax使用回调,因为它是同步的。 我希望对远程URL块的调用直到出现一些答案为止 ,就像在Ajax中一样,但是没有异步部分,或者我要说要进行JAX调用。 是否有任何技术可以使以下事情发生(使用JQuery)(…使用JQuery或其他解决方案): 我只是想知道-想学习。 实际上,有时会阻塞直到回复合适为止。我并不是说要浏览器阻止,而只是脚本运行时。 问题答案: 您可以在使用jQuery
问题内容: 是否有可能做出无法逃脱和?我目前得到: 但我正在寻找这样的事情: 问题答案: 从Go 1.7开始,您仍然 无法使用json.Marshal()做到这一点 。json.Marshal的源代码显示: json.Marshal总是这样做的原因是: 字符串值编码为强制转换为有效UTF-8的JSON字符串,用Unicode替换符文替换无效字节。尖括号“ <”和“>”转义为“ \ u003c”
问题内容: 是否可以使用angularjs拦截器阻止请求? 问题答案: 在1.1.5及更高版本中,您可以使用配置对象的’timeout’属性。 从文档中: 超时– {number | Promise} –超时(以毫秒为单位),或承诺应在解决后中止请求。 简单的例子:
我正在用量角器在竹子上进行E2E测试。我收到了这个错误未知错误:Chrome启动失败:异常退出(未知错误:DevToolsActivePort文件不存在) 然后我发现我不得不降级到2.37版本的Chrome驱动程序。我发现这里“https://github.com/angular/protractor/issues/4850”。 我在这里找到了下载chromedriver特定版本的方法https:
我们正在使用nexus-staging-plugin将我们的开源库部署到Sonatype Nexus的OSS实例(https://OSS.Sonatype.org/)。这一切都很好。但是,由于我们使用的是构建服务器,我希望阻止对现有工件id的意外重新部署--这通常不是Maven所假设的。然而,OSSRH欣然接受并更新了现有的版本。有什么方法可以阻止这一点并使构建失败吗?