Kubernetes¶
Kubernetes,也称为 K8s,是一个开源系统,用于自动部署、扩展和管理容器化应用程序。
Dashboard 中的 Kubernetes¶
我们的 Dashboard 从 7.2.0 版本开始支持 Kubernetes 作为服务发现。你可以切换到Node节点页面,然后选择命名空间,CAP会列出该命名空间下的所有Services,点击 切换 按钮后Dashboard将检测该节点的CAP服务是否可用,如果可用则会代理到切换的节点进行数据查看。
以下是一个配置示例
services.AddCap(x =>
{
// ...
x.UseDashboard();
x.UseK8sDiscovery();
});
使用K8sDiscovery配置¶
此配置选项用于配置仪表板/节点以默认列出每个 K8s service
。如果将此设置为 true
,则只会列出带有dotnetcore.cap.visibility: show
标签的服务。有关标签的更多信息可以在 Kubernetes 标签配置 部分找到。
- ShowOnlyExplicitVisibleNodes
默认值:false
services.AddCap(x =>
{
// ...
x.UseK8sDiscovery(opt=>{
opt.ShowOnlyExplicitVisibleNodes = true;
});
});
组件将会自动检测是否处于集群内部,如果处于集群内部在需要赋予Pod Kubernetes Api 的权限。参考下一章节。
分配 Pod 访问 Kubernetes Api¶
如果你的Deployment关联的ServiceAccount没有K8s Api访问权限的话,则需要赋予 namespaces
, services
资源的 get
, list
权限。
这是一个实例yaml,首先创建一个 ServiceAccount 和 ClusterRole 并设置相关权限,然后使用 ClusterRoleBinding 进行绑定。最后在Deployment中使用 serviceAccountName: api-access
继续指定。
apiVersion: v1
kind: ServiceAccount
metadata:
name: api-access
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: ns-svc-reader
rules:
- apiGroups: [""]
resources: ["namespaces", "services"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-pods
subjects:
- kind: ServiceAccount
name: api-access
namespace: default
roleRef:
kind: ClusterRole
name: ns-svc-reader
apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-access-deployment
spec:
replicas: 1
selector:
matchLabels:
app: api-access-app
template:
metadata:
labels:
app: api-access-app
spec:
serviceAccountName: api-access
containers:
- name: api-access-container
image: your_image
---
apiVersion: v1
kind: Service
metadata:
name: api-access-service
spec:
selector:
app: api-access-app
ports:
- protocol: TCP
port: 80
targetPort: 80
从版本 8.3.0
及更高版本,您可以使用 Role
而不是 ClusterRole
,以允许仅在仪表板运行的命名空间内发现服务。 Kubernetes 角色在命名空间内拥有有限的管辖权。在上面的示例中,只需删除 ClusterRole 和 ClusterRoleBinding 并改为使用以下内容
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: ns-svc-reader
rules:
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-pods
subjects:
- kind: ServiceAccount
name: api-access
namespace: default
roleRef:
kind: ClusterRole
name: ns-svc-reader
apiGroup: rbac.authorization.k8s.io
Kubernetes 标签配置¶
可以通过向 kubernetes 服务添加标签来控制仪表板中显示的节点列表。
-
dotnetcore.cap.visibility
标签用于显示或隐藏列表中的服务。可能的值: show | hide
示例:
dotnetcore.cap.visibility: show
ordotnetcore.cap.visibility: hide
默认情况下,每个 k8s 服务都会列出该服务中找到的第一个端口。但是,如果服务上存在更多端口,您可以使用以下标签选择所需的端口:
-
dotnetcore.cap.portName
标签用于过滤需要的服务端口。可能的值: string
示例:
dotnetcore.cap.portName: grpc
ordotnetcore.cap.portName: http
If not found any port with the given name, it will try to match the next label portIndex
-
dotnetcore.cap.portIndex
标签用于过滤需要的服务端口。 仅当未设置标签 portName 或设置不匹配的 portName 时,才会考虑此过滤器。可能的值: 数字表示为字符串 ex: '2' or '14'
示例:
dotnetcore.cap.portIndex: '1'
ordotnetcore.cap.portIndex: '3'
如果提供的索引超出范围,那么它将回退到第一个端口(索引:0)
独立使用 Dashboard¶
你可以独立使用 Dashboard 而不需要配置CAP,此时相当于 Dashboard 可作为单独的 Pod 部署到 Kubernetes 集群中仅用作查看数据,待查看的服务不再需要配置 cap.UseK8sDiscovery()
配置项。
services.AddCapDashboardStandalone();
同样,你需要为此Pod配置 ServiceAccount 的访问权限。