添加新云提供商
本节阐述了如何为Kubeskoop诊断添加新的云提供商。
实现InfraShim
InfraShim用于对底层基础设施网络进行配置检查。
type InfraShim interface {
NodeToNode(src *v1.Node, oif string, dst *v1.Node, packet *model.Packet) ([]model.Suspicion, error)
NodeToExternal(src *v1.Node, oif string, packet *model.Packet) ([]model.Suspicion, error)
}
NodeToNode(): 在两个节点之间进行数据传输。接受Kubernetes*v1.Node用于源和目的、出网络接口名称以及*model.Pakcet作为参数,返回[]model.Suspicion作为结果。NodeToExternal(): 在节点和外部网络(如互联网)之间进行数据传输。接受Kubernetes*v1.Node用于源、出网络接口名称以及*model.Packet作为参数,返回[]model.Suspicions作为结果。
InfraShim需要检查数据包是否能够在底层网络中到达其目的地址。如一个内网但是在集群外的地址应当检查路由或安全组配置;一个公网地址应当检查NAT是否配置正确。
InfraShim实现应当放在pkg/skoop/network/<提供商名称>下。
实现Network
Network也位于pkg/skoop/network/<提供商名称>下。它的实现也是云提供商以及插件特定的,所以你需要为你支持的插件实现自己的Network。
type Network interface {
Diagnose(ctx *ctx.Context, src model.Endpoint, dst model.Endpoint) ([]model.Suspicion, *model.PacketPath, error)
}
Diagnose(): 接受*ctx.Context,*model.Endpoint类型的源和目的地址作为参数,返回[]model.Suspicion和*model.PacketPath作为结果。
Network应当对诊断过程中所需需要的所有资源进行配置,包括Plugin、Diagnostor、InfraShim等。
添加新的Provider
Provider位于pkg/skoop/provider。
type Provider interface {
CreateNetwork(ctx *ctx.Context) (network.Network, error)
}
CreateNetwork(): 接受*ctx.Context作为参数,返回network.Network。
Provider的实现过程很简单:检查网络插件类型,并为其创建对应的Network。
type genericProvider struct {
}
func (g genericProvider) CreateNetwork(ctx *context.Context) (network.Network, error) {
switch ctx.ClusterConfig().NetworkPlugin {
case context.NetworkPluginFlannel:
return generic.NewFlannelNetwork(ctx)
case context.NetworkPluginCalico:
return generic.NewCalicoNetwork(ctx)
default:
return nil, fmt.Errorf("not support cni type %q", ctx.ClusterConfig().NetworkPlugin)
}
}
你需要在pkg/skoop/provider/<提供商名称>.go中实现你的Provider。
之后,需要为新的提供商类型添加一个常量,位于pkg/skoop/provider/provider.go。
const (
providerNameGeneric = "generic"
providerNameAliyun = "aliyun"
// 在此处添加新的提供商名称
)
这个常量的值也会在命令行参数中被使用。
最后,把你的实现添加到providers中。
var providers = map[string]Provider{
providerNameGeneric: genericProvider{},
providerNameAliyun: aliyunProvider{},
// 添加新的提供商
}
云提供商所使用的其它组件
云提供商相关的组件放在pkg/skoop/infra/<提供商名称>下,比如配置或是云客户端。
如果你想为你的插件添加命令行参数,你应当实现ConfigBinder接口并将其注册到程序中。如pkg/skoop/infra/aliyun/config.go中的实现:
type ProviderConfig struct {
AccessKeyID string
AccessKeySecret string
SecurityToken string
}
var Config = &ProviderConfig{}
func init() {
context.RegisterConfigBinder("Aliyun provider", Config)
}
func (pc *ProviderConfig) BindFlags(fs *pflag.FlagSet) {
fs.StringVarP(&pc.AccessKeyID, "aliyun-access-key-id", "", "", "Aliyun access key.")
fs.StringVarP(&pc.AccessKeySecret, "aliyun-access-key-secret", "", "", "Aliyun access secret.")
fs.StringVarP(&pc.SecurityToken, "aliyun-security-token", "", "", "Aliyun security token (optional).")
}
func (pc *ProviderConfig) Validate() error {
return nil
}