从外部管理集群的最佳实践

时间:2020-03-23 21:50:59

标签: kubernetes

我有一个最佳实践的问题:

我有一个Django应用程序在某个跟踪我的最终用户帐户的地方(非k8s)运行。另外,我有一个k8s集群,该集群为每个用户提供服务。当新用户在Django中注册时,应在集群中创建新服务。

执行此操作的最佳做​​法是什么?我看到的两个选择是:

  1. 集群中有一个长期服务,类似于user-pod-creator,该服务向Django端公开了一个API,从而允许其请求创建pod。
  2. 授予Django权限以直接使用集群的API;让它根据需要创建(和删除)吊舱。

直觉上,我更喜欢第一个,因为它创建的关注点分离并且出于安全原因。但是第二个将为Django应用程序提供很大的灵活性,以便它不仅可以创建和删除Pod,而且如果需要使用直接API调用,它可以对集群具有更大的可见性,而不必让我暴露新的API端点在user-pod-creator或其他服务中。

1 个答案:

答案 0 :(得分:0)

选项2是有效的方法,可以用service account解决。

为您的Django应用创建一个ServiceAccount

kubectl create serviceaccount django

此ServiceAccount指向一个Secret,并且此Secret包含令牌。

找出与ServiceAccount关联的机密:

kubectl get serviceaccount django -o yaml

在秘密中获取令牌:

kubectl get secret django-token-d2tz4 -o jsonpath='{.data.token}'

现在,您可以在集群外部的Django应用发出的Kubernetes API请求中将此令牌用作HTTP承载令牌。

也就是说,将令牌包含在Kubernetes API请求的HTTP Authorization标头中,如下所示:

Authorization: Bearer <TOKEN>

通过这种方式,您的请求通过了API服务器中的身份验证阶段。但是,该服务帐户尚无权限(授权)。

您可以使用Roles和RoleBindings将所需的权限分配给您的服务帐户:

kubectl create role django --verb <...> --resource <...>
kubectl create rolebinding django --role django --serviceaccount django

关于安全性:仅授予服务帐户所需的最低权限(最低特权原则),如果您认为有人盗用了服务帐户令牌,则只需使用kubectl delete serviceaccount django删除服务帐户即可使令牌。

另请参阅here,以获取所提供方法的示例。特别是:

服务帐户承载令牌非常有效,可以在集群外部使用,并且可以用于为希望与Kubernetes API对话的长期工作创建身份。