Istio 实现 ext-authz 外部扩展鉴权以及对接基于 k8s 的微服务
可以实现基于 redis
的 token
鉴权以及实现 rbac
鉴权。
转载请注明来源:https://janrs.com/vrsr
Istio
的外部鉴权本质是基于 Envoy
实现的,直接看 Envoy
的代码,链接地址:点击自动跳转
Isio
官方的 Demo
代码,链接:点击自动跳转
实现
Istio
提供了基于 HTTP
方式以及 Grpc
方式的外部鉴权扩展,这里这实现了 Grpc
。
配置
修改 Istio
的 Configmap
配置。在 mesh
字段下面添加以下代码配置:
extensionProviders:
- name: "rgrpc-dev-authz-grpc-provider"
envoyExtAuthzGrpc:
service: "auth.rgrpc-dev.svc.cluster.local"
port: 50051
截图如下
创建 Istio
鉴权 Grpc
服务
本质上,Istio
的外部鉴权是基于 Evnoy
实现,只需要实现了 Envoy
的 Grpc
方法后 Istio
就会自动调用。
需要实现的 Envoy
的 external_auth.pb.go
文件 链接:点击自动跳转
只需要实现里面的 Check
方法即可。Envoy
官方提供了 v2
以及 v3
代码的实现,这里我只实现了 v3
的接口。
写好代码后将服务做成镜像部署到 k8s
。
案例代码如下:
package serverV1
import (
"encoding/json"
authv3 "github.com/envoyproxy/go-control-plane/envoy/service/auth/v3"
typev3 "github.com/envoyproxy/go-control-plane/envoy/type/v3"
"github.com/go-kit/log"
"github.com/go-kit/log/level"
"github.com/redis/go-redis/v9"
"google.golang.org/genproto/googleapis/rpc/status"
"google.golang.org/grpc/codes"
"authservice/config"
"golang.org/x/net/context"
)
type Server struct {
authv3.UnimplementedAuthorizationServer
conf *config.Config
redis *redis.Client
repo *Repository
logger log.Logger
}
func NewServer(
conf *config.Config,
redis *redis.Client,
repo *Repository,
logger log.Logger,
) authv3.AuthorizationServer {
return &Server{
conf: conf,
redis: redis,
repo: repo,
logger: logger,
}
}
var<