34. 保护您的集群

Linkerd 为您的 Kubernetes 集群和服务提供了强大的内省功能。 Linkerd 安装默认是安全的。此页面说明了以安全方式启用此内省的最佳实践。

Tap

LinkerdViz 扩展包括 Tap 支持。此功能可通过以下命令使用:

根据您的 RBAC 设置,您可能需要执行额外的步骤来使您的用户能够执行 Tap 操作。

检查 Tap 访问

使用 kubectl 确定您的用户是否有权执行 tap 操作。 有关更多信息,请参阅有关授权的 Kubernetes 文档

要确定您是否可以查看所有命名空间中的 pod

kubectl auth can-i watch pods.tap.linkerd.io --all-namespaces

要确定您是否可以在 emojivoto 命名空间中 watch deployments

kubectl auth can-i watch deployments.tap.linkerd.io -n emojivoto

要确定特定用户是否可以 watch emojivoto 命名空间中的 deployments

kubectl auth can-i watch deployments.tap.linkerd.io -n emojivoto --as $(whoami)

您还可以使用 Linkerd CLI--as 标志来确认:

$ linkerd viz tap -n linkerd deploy/linkerd-controller --as $(whoami)
Cannot connect to Linkerd Viz: namespaces is forbidden: User "XXXX" cannot list resource "namespaces" in API group "" at the cluster scope
Validate the install with: linkerd viz check
...

启用 Tap 访问

如果上述命令表明您需要额外的访问权限,您可以按照您选择的粒度启用访问权限。

细粒度的 Tap 访问

要启用对所有命名空间中所有资源的 tap 访问, 您可以将您的用户绑定到默认安装的 linkerd-linkerd-tap-admin ClusterRole

$ kubectl describe clusterroles/linkerd-linkerd-viz-tap-admin
Name:         linkerd-linkerd-viz-tap-admin
Labels:       component=tap
              linkerd.io/extension=viz
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRole","metadata":{"annotations":{},"labels":{"component=tap...
PolicyRule:
  Resources         Non-Resource URLs  Resource Names  Verbs
  ---------         -----------------  --------------  -----
  *.tap.linkerd.io  []                 []              [watch]

linkerd-linkerd-viz-tap-admin ClusterRole 绑定到特定用户:

kubectl create clusterrolebinding \
  $(whoami)-tap-admin \
  --clusterrole=linkerd-linkerd-viz-tap-admin \
  --user=$(whoami)

您可以通过以下方式验证您现在是否具有 tap 访问权限:

$ linkerd viz tap -n linkerd deploy/linkerd-controller --as $(whoami)
req id=3:0 proxy=in  src=10.244.0.1:37392 dst=10.244.0.13:9996 tls=not_provided_by_remote :method=GET :authority=10.244.0.13:9996 :path=/ping
...

集群管理员访问

简单地授予您的用户集群管理员(cluster-admin)访问权限:

kubectl create clusterrolebinding \
  $(whoami)-cluster-admin \
  --clusterrole=cluster-admin \
  --user=$(whoami)

GKE

Google Kubernetes Engine (GKE) 通过 Google Cloud IAM 提供对 Kubernetes 集群的访问。 有关更多信息,请参阅 GKE IAM 文档

因为 GCloud 提供了这种额外的访问级别, 所以在某些情况下,kubectl auth can-i 会报告您拥有 Tap 访问权限, 而您的 RBAC 用户可能没有。 要验证这一点,请检查您的 GCloud 用户是否具有 Tap 访问权限:

$ kubectl auth can-i watch pods.tap.linkerd.io --all-namespaces
yes

然后验证您的 RBAC 用户是否具有 Tap 访问权限:

$ kubectl auth can-i watch pods.tap.linkerd.io --all-namespaces --as $(gcloud config get-value account)
no - no RBAC policy matched

如果第二个命令报告您没有访问权限,您可以使用以下命令启用访问权限:

kubectl create clusterrolebinding \
  $(whoami)-tap-admin \
  --clusterrole=linkerd-linkerd-viz-tap-admin \
  --user=$(gcloud config get-value account)

简单地授予您的用户集群管理员访问权限:

kubectl create clusterrolebinding \
  $(whoami)-cluster-admin \
  --clusterrole=cluster-admin \
  --user=$(gcloud config get-value account)

Linkerd Dashboard tap 访问

默认情况下,Linkerd dashboard](../../features/dashboard/) 具有挖掘资源所需的 RBAC 权限。

确认:

$ kubectl auth can-i watch pods.tap.linkerd.io --all-namespaces --as system:serviceaccount:linkerd-viz:web
yes

此访问是通过 linkerd-linkerd-viz-web-admin ClusterRoleBinding 启用的:

$ kubectl describe clusterrolebindings/linkerd-linkerd-viz-web-admin
Name:         linkerd-linkerd-viz-web-admin
Labels:       component=web
              linkerd.io/extensions=viz
Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                {"apiVersion":"rbac.authorization.k8s.io/v1","kind":"ClusterRoleBinding","metadata":{"annotations":{},"labels":{"component=web...
Role:
  Kind:  ClusterRole
  Name:  linkerd-linkerd-viz-tap-admin
Subjects:
  Kind            Name         Namespace
  ----            ----         ---------
  ServiceAccount  web          linkerd-viz

如果您想限制 Linkerd 仪表板的 tap 访问。 您可以使用 --set dashboard.restrictPrivileges flag 安装 Linkerd viz

linkerd viz install --set dashboard.restrictPrivileges

这将省略 linkerd-linkerd-web-admin ClusterRoleBinding 。 如果你已经安装了 Linkerd,你可以简单地手动删除 ClusterRoleBinding

kubectl delete clusterrolebindings/linkerd-linkerd-viz-web-admin

确认:

$ kubectl auth can-i watch pods.tap.linkerd.io --all-namespaces --as system:serviceaccount:linkerd-viz:web
no