我有一个最佳实践的问题:
我有一个Django应用程序在某个跟踪我的最终用户帐户的地方(非k8s)运行。另外,我有一个k8s集群,该集群为每个用户提供服务。当新用户在Django中注册时,应在集群中创建新服务。
执行此操作的最佳做法是什么?我看到的两个选择是:
user-pod-creator
,该服务向Django端公开了一个API,从而允许其请求创建pod。直觉上,我更喜欢第一个,因为它创建的关注点分离并且出于安全原因。但是第二个将为Django应用程序提供很大的灵活性,以便它不仅可以创建和删除Pod,而且如果需要使用直接API调用,它可以对集群具有更大的可见性,而不必让我暴露新的API端点在user-pod-creator
或其他服务中。
答案 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对话的长期工作创建身份。