mirror of https://github.com/istio/istio.io.git
114 lines
38 KiB
HTML
114 lines
38 KiB
HTML
<!doctype html><html lang=zh itemscope itemtype=https://schema.org/WebPage><head><meta charset=utf-8><meta http-equiv=x-ua-compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1,shrink-to-fit=no"><meta name=theme-color content="#466BB0"><meta name=title content="Istio 的软性多租户支持"><meta name=description content="使用 Kubernetes 命名空间和 RBAC 为 Istio 构建软性多租户环境。"><meta name=author content="John Joyce 和 Rich Curran"><meta name=keywords content="microservices,services,mesh,租户"><meta property="og:title" content="Istio 的软性多租户支持"><meta property="og:type" content="website"><meta property="og:description" content="使用 Kubernetes 命名空间和 RBAC 为 Istio 构建软性多租户环境。"><meta property="og:url" content="/v1.0/zh/blog/2018/soft-multitenancy/"><meta property="og:image" content="/v1.0/img/istio-logo-blue-background.svg"><meta property="og:image:alt" content="Istio Logo"><meta property="og:image:width" content="112"><meta property="og:image:height" content="150"><meta property="og:site_name" content="Istio"><meta name=twitter:card content="summary"><meta name=twitter:site content="@IstioMesh"><title>Istioldie 1.0 / Istio 的软性多租户支持</title><script async src="https://www.googletagmanager.com/gtag/js?id=UA-98480406-2"></script><script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments);}
|
||
gtag('js',new Date());gtag('config','UA-98480406-2');</script><script>var branchName="release-1.0";var docTitle="Istio 的软性多租户支持";</script><link rel=alternate type=application/rss+xml title="Istio Blog" href=/v1.0/feed.xml><link rel="shortcut icon" href=/v1.0/favicons/favicon.ico><link rel=apple-touch-icon href=/v1.0/favicons/apple-touch-icon-180x180.png sizes=180x180><link rel=icon type=image/png href=/v1.0/favicons/favicon-16x16.png sizes=16x16><link rel=icon type=image/png href=/v1.0/favicons/favicon-32x32.png sizes=32x32><link rel=icon type=image/png href=/v1.0/favicons/android-36x36.png sizes=36x36><link rel=icon type=image/png href=/v1.0/favicons/android-48x48.png sizes=48x48><link rel=icon type=image/png href=/v1.0/favicons/android-72x72.png sizes=72x72><link rel=icon type=image/png href=/v1.0/favicons/android-96x196.png sizes=96x196><link rel=icon type=image/png href=/v1.0/favicons/android-144x144.png sizes=144x144><link rel=icon type=image/png href=/v1.0/favicons/android-192x192.png sizes=192x192><link rel=manifest href=/v1.0/manifest.json><meta name=apple-mobile-web-app-title content="Istio"><meta name=application-name content="Istio"><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Chivo:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic"><link rel=stylesheet href="https://fonts.googleapis.com/css?family=Work Sans:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic"><link rel=stylesheet href=https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css integrity=sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm crossorigin=anonymous><link rel=stylesheet href=https://use.fontawesome.com/releases/v5.0.6/css/all.css><link rel=stylesheet href=/v1.0/css/light_theme_archive.css title=light><link rel="alternate stylesheet" href=/v1.0/css/dark_theme_archive.css title=dark><script src=/v1.0/js/styleSwitcher.min.js></script></head><body class=language-unknown><header><nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark justify-content-between"><a class=navbar-brand href=/v1.0/zh/><span class=logo><svg viewBox="0 0 300 300"><circle cx="150" cy="150" r="150" stroke-width="2" /><polygon points="65,240 225,240 125,270"/><polygon points="65,230 125,220 125,110"/><polygon points="135,220 225,230 135,30"/></svg></span><span class=brand-name>Istioldie 1.0</span></a>
|
||
<button class=navbar-toggler type=button data-toggle=collapse data-target=#navbarCollapse aria-controls=navbarCollapse aria-expanded=false aria-label="Toggle navigation">
|
||
<span class=navbar-toggler-icon></span></button><div class="collapse navbar-collapse justify-content-end" id=navbarCollapse><ul id=navbar-links class="navbar-nav active"><li class=nav-item><a class=nav-link title="了解如何部署、使用和运维 Istio。" href=/v1.0/zh/docs/>文档</a></li><li class=nav-item><a class="nav-link active" title="关于使用 Istio 的博客文章。" href=/v1.0/zh/blog/2018/announcing-1.0/>博客</a></li><li class=nav-item><a class=nav-link title="一堆帮助您部署、配置和使用 Istio 的资源。" href=/v1.0/zh/help/>帮助</a></li><li class=nav-item><a class=nav-link title=关于Istio的说明。 href=/v1.0/zh/about/>关于</a></li><li class="nav-item dropdown" id=gearDropdown style=white-space:nowrap><a title=选项和设置 href class=nav-link data-toggle=dropdown aria-label=Tools aria-haspopup=true aria-expanded=false><i style=width:1em class="fa fa-lg fa-cog"></i></a><div class="dropdown-menu dropdown-menu-right" aria-labelledby=gearDropdown><a class=dropdown-item id=light-theme-item href onclick="setActiveStyleSheet('light');return false;">亮主题</a>
|
||
<a class=dropdown-item id=dark-theme-item href onclick="setActiveStyleSheet('dark');return false;">暗主题</a><div class=dropdown-divider></div><h6 class=dropdown-header>本站的其它版本</h6><a href=https://istio.io class=dropdown-item>当前版本</a>
|
||
<a href=https://preliminary.istio.io class=dropdown-item>下个版本</a>
|
||
<a href=https://archive.istio.io class=dropdown-item>旧版本</a></div></li><li class=nav-item><a id=search_show class=nav-link href title=搜索istio.io aria-label=Search><i style=width:1em class="fa fa-lg fa-search"></i></a></li></ul><form name=cse id=search_form class="form-inline mr-sm-2" role=search><input type=hidden name=cx value=013699703217164175118:iwwf17ikgf4>
|
||
<input type=hidden name=ie value=utf-8>
|
||
<input type=hidden name=hl value=en>
|
||
<input type=hidden id=search_page_url value=/v1.0/search.html>
|
||
<input id=search_textbox class=form-control name=q type=text aria-label="Search this site">
|
||
<button id=search_close type=reset aria-label="Cancel Search"><i class="far fa-lg fa-times-circle"></i></button></form></div></nav></header><div class=blog><div class=container-fluid><div class="row row-offcanvas"><div class="col-0 col-md-3 col-xl-2 sidebar-offcanvas"><nav class="sidebar d-print-none"><div class=spacer></div><div class=directory role=tablist><div class=card><div class=card-header role=tab id=header0><a data-toggle=collapse href=#collapse0 title="2017 年的博客文章。" role=button aria-controls=collapse0><div><img src=/v1.0/img/blog.svg alt=Icon class=page_icon>
|
||
2017 年的博客文章</div></a></div><div id=collapse0 class=collapse data-parent=#sidebar role=tabpanel aria-labelledby=header0><div class=card-body><ul class=tree><li><a title=提高可用,降低延迟。 href=/v1.0/zh/blog/2017/mixer-spof-myth/>Mixer 和 SPOF 神话</a></li><li><a title="概要说明 Mixer 的插件架构。" href=/v1.0/zh/blog/2017/adapter-model/>Mixer 适配器模型</a></li><li><a title="Istio 0.2 公告。" href=/v1.0/zh/blog/2017/0.2-announcement/>宣布 Istio 0.2</a></li><li><a title="使用 Istio 创建自动缩放的金丝雀部署。" href=/v1.0/zh/blog/2017/0.1-canary/>使用 Istio 进行金丝雀部署</a></li><li><a title="Istio Auth 0.1 公告。" href=/v1.0/zh/blog/2017/0.1-auth/>使用 Istio 增强端到端安全</a></li></ul></div></div></div><div class=card><div class=card-header role=tab id=header1><a data-toggle=collapse href=#collapse1 title="2018 年的博客文章。" role=button aria-controls=collapse1><div><img src=/v1.0/img/blog.svg alt=Icon class=page_icon>
|
||
2018 年的博客文章</div></a></div><div id=collapse1 class="collapse show" data-parent=#sidebar role=tabpanel aria-labelledby=header1><div class=card-body><ul class=tree><li><a title="Istio 1.0 已生产就绪。" href=/v1.0/zh/blog/2018/announcing-1.0/>宣布 Istio 1.0</a></li><li><a title="Istio v1alpha3 路由 API 介绍,动机及其设计原则。" href=/v1.0/zh/blog/2018/v1alpha3-routing/>Istio v1aplha3 路由 API 介绍</a></li><li><a title="描述如何在AWS上使用网络负载均衡器配置 Istio Ingress。" href=/v1.0/zh/blog/2018/aws-nlb/>使用AWS NLB 配置 Istio Ingress</a></li><li><span class=current title="使用 Kubernetes 命名空间和 RBAC 为 Istio 构建软性多租户环境。">Istio 的软性多租户支持</span></li><li><a title=介绍更安全,低风险的部署和发布到生产。 href=/v1.0/zh/blog/2018/traffic-mirroring/>用于在生产环境进行测试的 Istio 流量镜像功能</a></li><li><a title="描述基于 Istio 的 Bookinfo 示例的简单场景。" href=/v1.0/zh/blog/2018/egress-tcp/>使用外部 TCP 服务</a></li><li><a title="描述基于 Istio Bookinfo 示例的简单场景。" href=/v1.0/zh/blog/2018/egress-https/>使用外部 Web 服务</a></li></ul></div></div></div></div></nav></div><div class="col-12 col-md-9 col-xl-8"><p class=d-md-none><label class=sidebar-toggler data-toggle=offcanvas><i class="fa fa-sign-out-alt"></i></label></p><main aria-labelledby=title><div class=pagenav><p><a href=/v1.0/zh/blog/2018/ title="2018 年的博客文章。"><i style=transform:scaleX(-1) class="fa fa-level-up-alt"></i> 2018 年的博客文章</a></p></div><h1 id=title>Istio 的软性多租户支持</h1><p class=subtitle>使用多个 Istio 控制平面和 RBAC 提供多租户支持</p><p class=byline>By <span class=attribution>John Joyce 和 Rich Curran</span>
|
||
/
|
||
<span class=publish_date>April 19, 2018</span></p><nav class="toc-inlined d-xl-none d-print-none"><hr><div class=directory role=directory><nav id=InlinedTableOfContents><ul><li><a href=#heading>软性多租户</a></li><li><a href=#heading-1>部署</a></li><ul><li><a href=#-istio->多个 Istio 控制面</a></li><li><a href=#heading-2>区分通用资源和命名空间资源</a></li><li><a href=#istio--kubernetes-rbac->Istio 控制面的 Kubernetes RBAC 设置</a></li><li><a href=#heading-3>关注特定命名空间进行服务发现</a></li><li><a href=#heading-4>在特定命名空间中部署租户应用</a></li><li><a href=#-istioctl>在多租户环境中使用 <code>istioctl</code></a></li><li><a href=#heading-5>测试结果</a></li></ul><li><a href=#heading-6>结语</a></li><li><a href=#heading-7>问题</a></li><li><a href=#heading-8>其他多租户模型的挑战</a></li><li><a href=#heading-9>未来</a></li><li><a href=#heading-10>参考</a></li></ul></nav></div><hr></nav><p>多租户是一个在各种环境和各种应用中都得到了广泛应用的概念,但是不同环境中,为每租户提供的具体实现和功能性都是有差异的。<a href=https://github.com/kubernetes/community/blob/master/wg-multitenancy/README.md>Kubernetes 多租户工作组</a>致力于在 Kubernetes 中定义多租户用例和功能。然而根据他们的工作进展来看,恶意容器和负载对于其他租户的 Pod 和内核资源的访问无法做到完全控制,因此只有"软性多租户”支持是可行的。</p><h2 id=heading>软性多租户</h2><p>文中提到的"软性多租户”的定义指的是单一 Kubernetes 控制平面和多个 Istio 控制平面以及多个服务网格相结合;每个租户都有自己的一个控制平面和一个服务网格。集群管理员对所有 Istio 控制面都有控制和监控的能力,而租户管理员仅能得到指定 Istio 的控制权。使用 Kubernetes 的命名空间和 RBAC 来完成不同租户的隔离。</p><p>这种模式的一个用例就是企业内部共享的基础设施中,虽然预计不会发生恶意行为,但租户之间的清晰隔离仍然是很有必要的。</p><p>本文最后会对 Istio 未来的多租户模型进行一些描述。</p><blockquote><p>注意:这里仅就在有限多租户环境中部署 Istio 做一些概要描述。当官方多租户支持实现之后,会在<a href=/v1.0/zh/docs/>文档</a>中具体阐述。</p></blockquote><h2 id=heading-1>部署</h2><h3 id=-istio->多个 Istio 控制面</h3><p>要部署多个 Istio 控制面,首先要在 Istio 清单文件中对所有的 <code>namespace</code> 引用进行替换。以 <code>istio.yaml</code> (0.8 中应该是 <code>istio.yaml</code>) 为例:如果需要两个租户级的 Istio 控制面,那么第一个租户可以使用 <code>istio.yaml</code> 中的缺省命名空间也就是 <code>istio-system</code>;而第二个租户就要生成一个新的 Yaml 文件,并在其中使用不同的命名空间。例如使用下面的命令创建一个使用 <code>istio-system1</code> 命名空间的 Yaml 文件:</p><pre><code class=language-command>$ cat istio.yaml | sed s/istio-system/istio-system1/g > istio-system1.yaml</code></pre><p>Istio Yaml 文件包含了 Istio 控制面的部署细节,包含组成控制面的 Pod(Mixer、Pilot、Ingress 以及 CA)。部署这两个控制面 Yaml 文件:</p><pre><code class=language-command>$ kubectl apply -f install/kubernetes/istio.yaml
|
||
$ kubectl apply -f install/kubernetes/istio-system1.yaml</code></pre><p>会在两个命名空间生成两个 Istio 控制面</p><pre><code class=language-command>$ kubectl get pods --all-namespaces
|
||
NAMESPACE NAME READY STATUS RESTARTS AGE
|
||
istio-system istio-ca-ffbb75c6f-98w6x 1/1 Running 0 15d
|
||
istio-system istio-ingress-68d65fc5c6-dnvfl 1/1 Running 0 15d
|
||
istio-system istio-mixer-5b9f8dffb5-8875r 3/3 Running 0 15d
|
||
istio-system istio-pilot-678fc976c8-b8tv6 2/2 Running 0 15d
|
||
istio-system1 istio-ca-5f496fdbcd-lqhlk 1/1 Running 0 15d
|
||
istio-system1 istio-ingress-68d65fc5c6-2vldg 1/1 Running 0 15d
|
||
istio-system1 istio-mixer-7d4f7b9968-66z44 3/3 Running 0 15d
|
||
istio-system1 istio-pilot-5bb6b7669c-779vb 2/2 Running 0 15d</code></pre><p>如果需要 Istio <a href=/v1.0/zh/docs/setup/kubernetes/sidecar-injection/>Sidecar 注入组件</a>以及<a href=/v1.0/zh/docs/tasks/telemetry/>遥测组件</a>,也需要根据租户的命名空间定义,修改所需的 Yaml 文件。</p><p>需要由集群管理员、而不是租户自己的管理员来加载这两组 Yaml 文件。另外,要把租户管理员的操作权限限制在各自的命名空间内,还需要额外的 RBAC 配置。</p><h3 id=heading-2>区分通用资源和命名空间资源</h3><p>Istio 仓库中的清单文件中会创建两种资源,一种是能够被所有 Istio 控制面访问的通用资源,另一种是每个控制平面一份的专属资源。上面所说的在 Yaml 文件中替换 <code>istio-system</code> 命名空间的方法自然是很简单的,更好的一种方法就是把 Yaml 文件拆分为两块,一块是所有租户共享的通用部分;另一块就是租户自有的部分。根据 <a href=https://kubernetes.io/docs/concepts/api-extension/custom-resources/#customresourcedefinitions>CRD 资源定义(Custom Resource Definitions)</a>中的说法,角色和角色绑定资源需要从 Istio 文件中进行剥离。另外,清单文件中提供的角色和角色绑定的定义可能不适合多租户环境,还需要进一步的细化和定制。</p><h3 id=istio--kubernetes-rbac->Istio 控制面的 Kubernetes RBAC 设置</h3><p>租户管理员应该被限制在单独的 Istio 命名空间中,要完成这个限制,集群管理员需要创建一个清单,其中至少要包含一个 <code>Role</code> 和 <code>RoleBinding</code> 的定义,类似下面的文件所示。例子中定义了一个租户管理员,命名为 <code>sales-admin</code>,他被限制在命名空间 <code>istio-system</code> 之中。完整的清单中可能要在 <code>Role</code> 中包含更多的 <code>apiGroups</code> 条目,来定义租户管理员的资源访问能力。</p><pre><code class=language-yaml>kind: Role
|
||
apiVersion: rbac.authorization.k8s.io/v1
|
||
metadata:
|
||
namespace: istio-system1
|
||
name: ns-access-for-sales-admin-istio-system1
|
||
rules:
|
||
- apiGroups: [""] # "" 代表核心 API 资源组
|
||
resources: ["*"]
|
||
verbs: ["*"]
|
||
---
|
||
kind: RoleBinding
|
||
apiVersion: rbac.authorization.k8s.io/v1
|
||
metadata:
|
||
name: access-all-istio-system1
|
||
namespace: istio-system1
|
||
subjects:
|
||
- kind: User
|
||
name: sales-admin
|
||
apiGroup: rbac.authorization.k8s.io
|
||
roleRef:
|
||
kind: Role
|
||
name: ns-access-for-sales-admin-istio-system1
|
||
apiGroup: rbac.authorization.k8s.io</code></pre><h3 id=heading-3>关注特定命名空间进行服务发现</h3><p>除了创建 RBAC 规则来限制租户管理员只能访问指定 Istio 控制平面之外,Istio 清单还需要为 Istio Pilot 指定一个用于应用程序的命名空间,以便生成 xDS 缓存。Pilot 组件提供了命令行参数 <code>--appNamespace, ns-1</code> 可以完成这一任务。<code>ns-1</code> 就是租户用来部署自己应用的命名空间。<code>istio-system1.yaml</code> 中包含的相关代码大致如下:</p><pre><code class=language-yaml>apiVersion: extensions/v1beta1
|
||
kind: Deployment
|
||
metadata:
|
||
name: istio-pilot
|
||
namespace: istio-system1
|
||
annotations:
|
||
sidecar.istio.io/inject: "false"
|
||
spec:
|
||
replicas: 1
|
||
template:
|
||
metadata:
|
||
labels:
|
||
istio: pilot
|
||
spec:
|
||
serviceAccountName: istio-pilot-service-account
|
||
containers:
|
||
- name: discovery
|
||
image: docker.io/<user ID>/pilot:<tag>
|
||
imagePullPolicy: IfNotPresent
|
||
args: ["discovery", "-v", "2", "--admission-service", "istio-pilot", "--appNamespace", "ns-1"]
|
||
ports:
|
||
- containerPort: 8080
|
||
- containerPort: 443</code></pre><h3 id=heading-4>在特定命名空间中部署租户应用</h3><p>现在集群管理员已经给租户创建了命名空间(<code>istio-system1</code>),并且对 Istio Pilot 的服务发现进行了配置,要求它关注应用的命名空间(<code>ns-1</code>),创建应用的 Yaml 文件,将其部署到租户的专属命名空间中:</p><pre><code class=language-yaml>apiVersion: v1
|
||
kind: Namespace
|
||
metadata:
|
||
name: ns-1</code></pre><p>然后把每个资源的命名空间都指定到 <code>ns-1</code>,例如:</p><pre><code class=language-yaml>apiVersion: v1
|
||
kind: Service
|
||
metadata:
|
||
name: details
|
||
labels:
|
||
app: details
|
||
namespace: ns-1</code></pre><p>虽然没有展示出来,但是应用的命名空间也应该有 RBAC 设置,用来对特定资源进行访问控制。集群管理员和租户管理员都有权完成这种 RBAC 限制。</p><h3 id=-istioctl>在多租户环境中使用 <code>istioctl</code></h3><p>定义<a href=https://archive.istio.io/v0.7/docs/reference/config/istio.routing.v1alpha1/#RouteRule>路由规则</a>或者<a href=https://archive.istio.io/v0.7/docs/reference/config/istio.routing.v1alpha1/#DestinationPolicy>目标策略</a>时,要确认 <code>istioctl</code> 命令是针对专有的 Istio 控制面所在的命名空间运行的。另外规则自身的定义也要限制在租户的命名空间里,这样才能保证规则在租户自己的网格中生效。<code>-i</code> 选项用来在 Istio 控制面所属的命名空间中创建(get 和 describe 也一样)规则。<code>-n</code> 参数会限制规则的所在范围是租户的网格,取值就是租户应用所在的命名空间。如果 Yaml 文件中的资源已经指定了范围,<code>-n</code> 参数会被跳过。</p><p>例如下面的命令会创建到 <code>istio-system1</code> 命名空间的路由规则:</p><pre><code class=language-command>$ istioctl –i istio-system1 create -n ns-1 -f route_rule_v2.yaml</code></pre><p>用下面的命令可以查看:</p><pre><code class=language-command>$ istioctl -i istio-system1 -n ns-1 get routerule
|
||
NAME KIND NAMESPACE
|
||
details-Default RouteRule.v1alpha2.config.istio.io ns-1
|
||
productpage-default RouteRule.v1alpha2.config.istio.io ns-1
|
||
ratings-default RouteRule.v1alpha2.config.istio.io ns-1
|
||
reviews-default RouteRule.v1alpha2.config.istio.io ns-1</code></pre><p><a href=/v1.0/zh/blog/2018/soft-multitenancy/#%E5%A4%9A%E4%B8%AA-istio-%E6%8E%A7%E5%88%B6%E9%9D%A2>Multiple Istio control planes</a> 中讲述了更多多租户环境下命名空间的相关问题。</p><h3 id=heading-5>测试结果</h3><p>根据前文的介绍,一个集群管理员能够创建一个受限于 RBAC 和命名空间的环境,租户管理员能在其中进行部署。</p><p>完成部署后,租户管理员就可以访问指定的 Istio 控制平面的 Pod 了。</p><pre><code class=language-command>$ kubectl get pods -n istio-system
|
||
NAME READY STATUS RESTARTS AGE
|
||
grafana-78d649479f-8pqk9 1/1 Running 0 1d
|
||
istio-ca-ffbb75c6f-98w6x 1/1 Running 0 1d
|
||
istio-ingress-68d65fc5c6-dnvfl 1/1 Running 0 1d
|
||
istio-mixer-5b9f8dffb5-8875r 3/3 Running 0 1d
|
||
istio-pilot-678fc976c8-b8tv6 2/2 Running 0 1d
|
||
istio-sidecar-injector-7587bd559d-5tgk6 1/1 Running 0 1d
|
||
prometheus-cf8456855-hdcq7 1/1 Running 0 1d
|
||
servicegraph-75ff8f7c95-wcjs7 1/1 Running 0 1d</code></pre><p>然而无法访问全部命名空间的 Pod:</p><pre><code class=language-command>$ kubectl get pods --all-namespaces
|
||
Error from server (Forbidden): pods is forbidden: User "dev-admin" cannot list pods at the cluster scope</code></pre><p>访问其他租户的命名空间也是不可以的:</p><pre><code class=language-command>$ kubectl get pods -n istio-system1
|
||
Error from server (Forbidden): pods is forbidden: User "dev-admin" cannot list pods in the namespace "istio-system1"</code></pre><p>租户管理员能够在租户指定的应用命名空间中进行应用部署。例如可以修改一下 <a href=/v1.0/zh/docs/examples/bookinfo/>Bookinfo</a> 的 Yaml 然后部署到租户的命名空间 <code>ns-0</code> 中,然后租户管理员就可以在这一命名空间中列出 Pod 了:</p><pre><code class=language-command>$ kubectl get pods -n ns-0
|
||
NAME READY STATUS RESTARTS AGE
|
||
details-v1-64b86cd49-b7rkr 2/2 Running 0 1d
|
||
productpage-v1-84f77f8747-rf2mt 2/2 Running 0 1d
|
||
ratings-v1-5f46655b57-5b4c5 2/2 Running 0 1d
|
||
reviews-v1-ff6bdb95b-pm5lb 2/2 Running 0 1d
|
||
reviews-v2-5799558d68-b989t 2/2 Running 0 1d
|
||
reviews-v3-58ff7d665b-lw5j9 2/2 Running 0 1d</code></pre><p>同样也是不能访问其他租户的应用程序命名空间:</p><pre><code class=language-command>$ kubectl get pods -n ns-1
|
||
Error from server (Forbidden): pods is forbidden: User "dev-admin" cannot list pods in the namespace "ns-1"</code></pre><p>如果部署了<a href=/v1.0/zh/docs/tasks/telemetry/>遥测组件</a>, 例如
|
||
<a href=/v1.0/zh/docs/tasks/telemetry/querying-metrics/>Prometheus</a>(限制在 Istio 的 <code>namespace</code>),其中获得的统计结果展示的也只是租户应用命名空间的私有数据。</p><h2 id=heading-6>结语</h2><p>上面的一些尝试表明 Istio 有足够的能力和安全性,符合少量多租户的用例需求。另外也很明显的,Istio 和 Kubernetes <strong>无法</strong>提供足够的能力和安全性来满足其他的用例,尤其是在租户之间要求完全的安全性和隔离的要求的用例。只有等容器技术(例如 Kubernetes )能够提供更好的安全模型以及隔离能力,我们才能进一步的增强这方面的支持,Istio 的支持并不是很重要。</p><h2 id=heading-7>问题</h2><ul><li>一个租户的 CA(Certificate Authority) 和 Mixer 的 Pod 中产生的 Log 包含了另一个租户的控制面的 <code>info</code> 信息。</li></ul><h2 id=heading-8>其他多租户模型的挑战</h2><p>还有其他值得考虑的多租户部署模型:</p><ol><li><p>一个网格中运行多个应用程序,每个租户一个应用。集群管理员能控制和监控网格范围内的所有应用,租户管理员只能控制一个特定应用。</p></li><li><p>单独的 Istio 控制平面控制多个网格,每个租户一个网格。集群管理员控制和监控整个 Istio 控制面以及所有网格,租户管理员只能控制特定的网格。</p></li><li><p>一个云环境(集群控制),多个 Kubernetes 控制面(租户控制)</p></li></ol><p>这些选项,有的需要改写代码才能支持,有的无法满足用户要求。</p><p>目前的 Istio 能力不适合第一种方案,这是因为其 RBAC 能力无法覆盖这种租户操作。另外在当前的网格模型中,Istio 的配置信息需要传递给 Envoy 代理服务器,多个租户在同一网格内共存的做法非常不安全。</p><p>再看看第二个方式,目前的 Istio 假设每个 Istio 控制面对应一个网格。要支持这种模型需要大量改写。这种情况需要更好的对资源的范围限制进行调整,同时根据命名空间进行安全限制,此外还需要调整 Istio 的 RBAC 模型。这种模式未来可能会支持,但目前来说是不可能的。</p><p>第三个方式对多数案例都是不合适的,毕竟多数集群管理员倾向于将同一个 Kubernetes 控制面作为 <a href=https://en.wikipedia.org/wiki/Platform_as_a_service>PaaS</a> 提供给他们的租户。</p><h2 id=heading-9>未来</h2><p>很明显,单一 Istio 控制面控制多个网格可能是下一个功能。还有可能就是在同一个网格中支持多个租户,并提供某种程度的隔离和安全保障。要完成这样的能力,就需要像 Kubernetes 中对命名空间的的操作那样,在一个单独的控制平面中进行分区,社区中发出了<a href=https://docs.google.com/document/d/14Hb07gSrfVt5KX9qNi7FzzGwB_6WBpAnDpPG6QEEd9Q>这篇文档</a>来定义其他的用例,以及要支持这些用例所需要的 Istio 功能。</p><h2 id=heading-10>参考</h2><ul><li>视频:<a href="https://www.youtube.com/watch?v=ahwCkJGItkU">用 RBAC 和命名空间支持的多租户功能及安全模型</a>, <a href=https://schd.ws/hosted_files/kccncna17/21/Multi-tenancy%20Support%20%26%20Security%20Modeling%20with%20RBAC%20and%20Namespaces.pdf>幻灯片</a>.</li><li>Kubecon 讨论,关于对”协同软性多租户"的支持 <a href="https://www.youtube.com/watch?v=YRR-kZub0cA">Building for Trust: How to Secure Your Kubernetes</a>.</li><li>Kubernetes <a href=https://kubernetes.io/docs/reference/access-authn-authz/rbac/>RBAC 文档</a> 以及 <a href=https://kubernetes.io/docs/tasks/administer-cluster/namespaces-walkthrough/>命名空间文档</a>.</li><li>Kubecon 幻灯片 <a href=https://schd.ws/hosted_files/kccncna17/a9/kubecon-multitenancy.pdf>Multi-tenancy Deep Dive</a>.</li><li>Google 文档 <a href=https://docs.google.com/document/d/15w1_fesSUZHv-vwjiYa9vN_uyc--PySRoLKTuDhimjc>Multi-tenancy models for Kubernetes</a>. (需要授权)</li><li>Cloud Foundry 提出的文档:<a href=https://docs.google.com/document/d/14Hb07gSrfVt5KX9qNi7FzzGwB_6WBpAnDpPG6QEEd9Q>Multi-cloud and Multi-tenancy</a></li><li><a href=https://docs.google.com/document/d/12F183NIRAwj2hprx-a-51ByLeNqbJxK16X06vwH5OWE>Istio Auto Multi-Tenancy 101</a></li></ul></main><div class="container-fluid d-print-none"><br><div class=row><div class="col-6 pagenav"><p><a title="描述如何在AWS上使用网络负载均衡器配置 Istio Ingress。" href=/v1.0/zh/blog/2018/aws-nlb/><i class="fa fa-long-arrow-alt-left"></i>使用AWS NLB 配置 Istio Ingress</a></p></div><div class="col-6 pagenav" style=text-align:right><p><a title=介绍更安全,低风险的部署和发布到生产。 href=/v1.0/zh/blog/2018/traffic-mirroring/>用于在生产环境进行测试的 Istio 流量镜像功能
|
||
<i class="fa fa-long-arrow-alt-right"></i></a></p></div></div></div><div class="d-none d-print-block" aria-hidden=true><h2>Links</h2><ol id=endnotes></ol></div></div><div class="col-12 col-md-2 d-none d-xl-block d-print-none"><nav class=toc><div class=spacer></div><div id=toc class=directory role=directory><nav id=TableOfContents><ul><li><a href=#heading>软性多租户</a></li><li><a href=#heading-1>部署</a></li><ul><li><a href=#-istio->多个 Istio 控制面</a></li><li><a href=#heading-2>区分通用资源和命名空间资源</a></li><li><a href=#istio--kubernetes-rbac->Istio 控制面的 Kubernetes RBAC 设置</a></li><li><a href=#heading-3>关注特定命名空间进行服务发现</a></li><li><a href=#heading-4>在特定命名空间中部署租户应用</a></li><li><a href=#-istioctl>在多租户环境中使用 <code>istioctl</code></a></li><li><a href=#heading-5>测试结果</a></li></ul><li><a href=#heading-6>结语</a></li><li><a href=#heading-7>问题</a></li><li><a href=#heading-8>其他多租户模型的挑战</a></li><li><a href=#heading-9>未来</a></li><li><a href=#heading-10>参考</a></li></ul></nav></div></nav></div></div></div></div><footer class="d-print-none container-fluid"><div class=row><div class="col-5 col-lg-4" role=navigation><div class=container-fluid><div class=row><div class=icon><span>discuss</span>
|
||
<a title="Join the Istio discussion board to participate in discussions and get help troubleshooting problems" href=https://discuss.istio.io aria-label="Istio discussion board"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><path d="M225.9 32C103.3 32 0 130.5.0 252.1.0 256 .1 480 .1 480l225.8-.2c122.7.0 222.1-102.3 222.1-223.9S348.6 32 225.9 32zM224 384c-19.4.0-37.9-4.3-54.4-12.1L88.5 392l22.9-75c-9.8-18.1-15.4-38.9-15.4-61 0-70.7 57.3-128 128-128s128 57.3 128 128-57.3 128-128 128z" /></svg></a></div><div class=icon><span>slack</span>
|
||
<a title="在 Slack 上与 Istio 社区交互讨论开发问题(仅限邀请)" href=https://istio.slack.com aria-label=slack><svg viewBox="0 0 31.444 31.443"><path d="M31.202 16.369c-.62-1.388-2.249-2.011-3.637-1.391l-1.325.594-3.396-7.591 1.325-.592c1.388-.622 2.01-2.25 1.389-3.637-.62-1.389-2.248-2.012-3.637-1.39l-1.324.593-.593-1.326c-.621-1.388-2.249-2.009-3.637-1.388-1.388.62-2.009 2.247-1.389 3.637l.593 1.325L7.98 8.598 7.388 7.273c-.621-1.39-2.249-2.009-3.637-1.39C2.363 6.504 1.742 8.132 2.362 9.52l.592 1.324L1.63 11.438c-1.388.621-2.01 2.247-1.389 3.636.62 1.388 2.249 2.01 3.637 1.39l1.325-.594 3.394 7.592-1.325.592c-1.388.621-2.009 2.25-1.389 3.637.621 1.389 2.249 2.011 3.637 1.391l1.324-.593.593 1.325c.621 1.389 2.249 2.01 3.637 1.389 1.387-.62 2.009-2.248 1.388-3.636l-.591-1.326 7.591-3.394.592 1.321c.621 1.391 2.248 2.013 3.637 1.392 1.388-.619 2.01-2.248 1.389-3.637l-.592-1.324 1.323-.594C31.201 19.384 31.823 17.757 31.202 16.369zM13.623 21.215l-3.395-7.593 7.591-3.394 3.395 7.591L13.623 21.215z"/></svg></a></div><div class=icon><span>twitter</span>
|
||
<a title="关注我们的 Twitter 来获最新信息" href=https://twitter.com/IstioMesh aria-label=Twitter><svg viewBox="0 0 310 310"><path d="M302.973 57.388c-4.87 2.16-9.877 3.983-14.993 5.463 6.057-6.85 10.675-14.91 13.494-23.73.632-1.977-.023-4.141-1.648-5.434-1.623-1.294-3.878-1.449-5.665-.39-10.865 6.444-22.587 11.075-34.878 13.783-12.381-12.098-29.197-18.983-46.581-18.983-36.695.0-66.549 29.853-66.549 66.547.0 2.89.183 5.764.545 8.598C101.163 99.244 58.83 76.863 29.76 41.204c-1.036-1.271-2.632-1.956-4.266-1.825-1.635.128-3.104 1.05-3.93 2.467-5.896 10.117-9.013 21.688-9.013 33.461.0 16.035 5.725 31.249 15.838 43.137-3.075-1.065-6.059-2.396-8.907-3.977-1.529-.851-3.395-.838-4.914.033-1.52.871-2.473 2.473-2.513 4.224-.007.295-.007.59-.007.889.0 23.935 12.882 45.484 32.577 57.229-1.692-.169-3.383-.414-5.063-.735-1.732-.331-3.513.276-4.681 1.597-1.17 1.32-1.557 3.16-1.018 4.84 7.29 22.76 26.059 39.501 48.749 44.605-18.819 11.787-40.34 17.961-62.932 17.961-4.714.0-9.455-.277-14.095-.826-2.305-.274-4.509 1.087-5.294 3.279-.785 2.193.047 4.638 2.008 5.895 29.023 18.609 62.582 28.445 97.047 28.445 67.754.0 110.139-31.95 133.764-58.753 29.46-33.421 46.356-77.658 46.356-121.367.0-1.826-.028-3.67-.084-5.508 11.623-8.757 21.63-19.355 29.773-31.536 1.237-1.85 1.103-4.295-.33-5.998C307.394 57.037 305.009 56.486 302.973 57.388z"/></svg></a></div><div class=icon><span>stack overflow</span>
|
||
<a title="Stack Overflow 中列举了针对实际问题以及部署、配置和使用 Istio 的各项回答" href=https://stackoverflow.com/questions/tagged/istio aria-label="Stack Overflow"><svg viewBox="0 0 120 120"><polygon points="84.4,93.8 84.4,70.6 92.1,70.6 92.1,101.5 22.6,101.5 22.6,70.6 30.3,70.6 30.3,93.8"/><path d="M38.8 68.4l37.8 7.9 1.6-7.6-37.8-7.9L38.8 68.4zM43.8 50.4l35 16.3 3.2-7-35-16.4L43.8 50.4zM53.5 33.2l29.7 24.7 4.9-5.9L58.4 27.3 53.5 33.2zM72.7 14.9l-6.2 4.6 23 31 6.2-4.6-23-31zM38 86h38.6v-7.7H38V86z"/></svg></a></div></div><div class="tag row d-none d-lg-flex">对于用户</div></div></div><div class="col-7 col-lg-4"><p class="text-center copyright" role=contentinfo>Istio
|
||
Archive
|
||
1.0<br>© 2019 Istio Authors, <a href=https://policies.google.com/privacy>Privacy Policy</a><br>Archived on March 19, 2019</p></div><div class="col-6 col-lg-4 d-none d-lg-flex" role=navigation><div class=container-fluid><div class="row justify-content-end"><div class=icon><span>github</span>
|
||
<a title="Istio 的代码在 GitHub 上开发" href=https://github.com/istio/community aria-label=GitHub><svg viewBox="0 0 478.165 478.165"><path d="M349.22 55.768c6.136 14.046 10.241 37.556 4.224 54.69 24.426 20.999 33.073 71.904 21.079 113.704 35.006 2.73 76.666-1.235 103.642 9.484-25.183-3.248-59.651-9.563-91.987-7.431-6.136.458-15.361-.239-14.903 8.408 37.735 3.008 75.092 6.117 105.894 15.779-30.702-4.981-67.74-12.552-105.894-13.668-15.54 30.921-47.239 46.262-90.991 49.49 4.682 10.261 13.847 14.066 15.879 30.702 3.267 24.406-4.881 60.328 3.208 76.686 4.064 7.89 10.579 8.009 14.863 14.604-10.699 12.871-37.257-1.395-40.186-14.604-5.14-22.852 7.89-58.256-6.415-73.737.996 24.865-5.718 59.85.996 82.145 2.789 8.806 10.659 12.113 8.647 20.063-49.809 5.08-28.989-64.373-37.177-105.356-7.471.697-4.204 11.197-4.224 15.76-.199 40.106 8.189 94.836-34.846 89.556-1.315-8.348 5.838-11.217 8.467-19.007 7.91-22.434-1.454-56.045 2.112-83.161-16.417 12.512 1.793 55.666-8.428 77.961-5.838 12.671-24.785 18.27-39.19 12.651 1.873-9.464 11.695-7.989 15.879-16.875 5.818-12.452.02-30.244 2.092-48.494-30.423 6.097-53.993-.877-65.608-20.023-5.12-8.507-6.356-18.708-12.632-26.219-6.117-7.551-16.098-8.507-19.087-18.808 37.755-9.185 39.17 38.771 73.06 39.807 10.44.418 15.799-2.909 25.402-5.16 2.749-12.113 8.428-21.039 16.875-27.494-42.078-5.658-76.865-18.788-93.023-50.466-38.293 1.893-73.339 7.013-105.894 14.843 29.547-10.679 65.807-14.604 104.778-15.819-2.351-13.807-22.434-10.022-34.866-9.543C47.677 227.17 18.449 230.138.0 233.645c26.817-9.543 64.233-8.348 100.454-8.428-11.038-34.767-7.232-90.014 17.015-110.615-6.854-17.254-4.722-45.346 4.184-58.834 27.036 1.175 43.374 12.891 60.388 24.247 21.019-6.017 43.035-9.045 71.904-7.451 12.133.677 24.705 6.097 33.731 5.32 8.906-.877 18.728-10.898 27.534-14.843C326.507 58.099 336.17 56.206 349.22 55.768z"/></svg></a></div><div class=icon><span>drive</span>
|
||
<a title="如果您想深入了解 Istio 的技术细节,请查看我们日益完善的设计文档" href=https://groups.google.com/forum/#!forum/istio-team-drive-access aria-label="team drive"><svg viewBox="0 0 207.027 207.027"><path d="M69.866 15.557.0 138.919l28.732 52.552 143.288-.029 35.008-59.588L136.39 15.735 69.866 15.557zM17.166 139.046 74.268 38.205 91.21 67.783 33.24 168.447 17.166 139.046zM99.841 82.851l23.805 41.558-47.732-.006L99.841 82.851zM163.434 176.443l-117.332.024 21.53-37.065 64.606.008.067.119 52.865-.085L163.434 176.443zM140.932 124.411 90.157 35.767l-2.966-5.178 40.751.121 57.003 93.706L140.932 124.411z"/></svg></a></div><div class=icon><span>working groups</span>
|
||
<a title="如果您想为 Istio 项目做出贡献,请考虑加入我们的工作组" href=https://github.com/istio/community/blob/master/WORKING-GROUPS.md aria-label="working groups"><svg viewBox="0 -45 439.833 439.833"><polygon points="246.048,195.833 299.966,235.085 319.497,227.296 276.278,195.833"/><polygon points="193.786,195.833 163.556,195.833 120.33,227.3 139.862,235.089"/><path d="M219.927 11.558c-23.854.0-37.057 12.362-36.814 36.182.348 32.623 14.211 52.414 36.814 52.068.0.0 36.802 1.492 36.802-52.068C256.729 23.918 244.294 11.558 219.927 11.558z"/><path d="M285.017 124.567l-36.77-14.659-8.608-7.256c-2.274-1.922-5.636-1.78-7.741.317l-11.973 11.904-12.008-11.907c-2.109-2.094-5.465-2.229-7.736-.313l-8.611 7.256-36.77 14.661c-11.842 4.715-11.83 46.647-12.848 50.497h155.93C296.866 171.228 296.862 129.28 285.017 124.567z"/><path d="M77.976 228.568s36.801 1.492 36.801-52.068c0-23.82-12.434-36.182-36.801-36.182-23.854.0-37.057 12.362-36.814 36.182C41.509 209.124 55.372 228.915 77.976 228.568z"/><path d="M143.065 253.329l-36.77-14.658-8.609-7.256c-2.275-1.923-5.635-1.781-7.742.315l-11.971 11.904-12.008-11.908c-2.109-2.094-5.465-2.229-7.736-.312l-8.611 7.256-36.77 14.66C1.006 258.045 1.018 299.977.0 303.827h155.93C154.915 299.988 154.911 258.042 143.065 253.329z"/><path d="M361.878 228.568s36.801 1.492 36.801-52.068c0-23.82-12.434-36.182-36.801-36.182-23.854.0-37.057 12.362-36.812 36.182C325.411 209.124 339.274 228.915 361.878 228.568z"/><path d="M426.968 253.329l-36.77-14.658-8.609-7.256c-2.273-1.923-5.635-1.781-7.742.315l-11.971 11.904-12.008-11.908c-2.109-2.094-5.465-2.229-7.736-.312l-8.61 7.256-36.771 14.66c-11.842 4.715-11.83 46.646-12.848 50.497h155.93C438.817 299.988 438.812 258.042 426.968 253.329z"/></svg></a></div></div><div class="tag row justify-content-end text-right">对于开发者</div></div></div></div></footer><div class="d-xl-none d-print-none"><button id=scroll-to-top aria-hidden=true onclick=scrollToTop() title="Back to top"><i class="fa fa-lg fa-arrow-up"></i></button></div><script src=https://code.jquery.com/jquery-3.2.1.slim.min.js integrity=sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN crossorigin=anonymous></script><script src=https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js integrity=sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl crossorigin=anonymous></script><script src=https://cdnjs.cloudflare.com/ajax/libs/clipboard.js/1.7.1/clipboard.min.js></script><script src="https://www.google.com/cse/brand?form=search_form"></script><script src=/v1.0/js/all.min.js data-manual></script></body></html> |