文档首页/ 云容器实例 CCI/ SDK参考/ 使用client-go访问CCI
更新时间:2024-04-26 GMT+08:00

使用client-go访问CCI

本节将介绍如何将CCI认证工具cci-iam-authenticator与client-go结合使用以调用API。

安装cci-iam-authenticator

请参考使用kubectl,下载安装及设置cci-iam-authenticator。

安装kubernetes client-go

详情请参考Installing client-go

  • 当前CCI服务开放的API对应的Kubernetes版本为1.19,根据Compatibility: client-go <-> Kubernetes clusters,推荐使用的SDK版本为k8s.io/client-go@kubernetes-1.19.0。
  • CCI服务是共享集群,不支持watch集群下全量的命名空间以及全量命名空间下的资源,支持watch指定命名空间下的资源

使用Go SDK

示例已通过以下版本的测试:

  1. k8s.io/client-go@kubernetes-1.15.0
  2. k8s.io/client-go@kubernetes-1.16.0
  3. k8s.io/client-go@kubernetes-1.17.0
  4. k8s.io/client-go@kubernetes-1.18.0
  5. k8s.io/client-go@kubernetes-1.19.0
  6. k8s.io/client-go@kubernetes-1.20.0
使用用户名/密码进行认证
import (
	"fmt"

	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/tools/clientcmd/api"
)

const (
	apiVersion = "client.authentication.k8s.io/v1beta1"
	
        // 云容器实例 CCI,参考https://developer.huaweicloud.com/intl/zh-cn/endpoint
	cciEndpoint = "<例如华北-北京四: https://cci.cn-north-4.myhuaweicloud.com>"
	
        // 统一身份认证服务 IAM,参考https://developer.huaweicloud.com/intl/zh-cn/endpoint
	iamEndpoint = "<例如华北-北京四: https://iam.cn-north-4.myhuaweicloud.com>"
	
        // 地区和终端节点,参考https://developer.huaweicloud.com/intl/zh-cn/endpoint	
        projectName = "<例如华北-北京四: cn-north-4>"
)

// userName, domainName, password分别表示用户名、账号名及密码,需用户自行传入,因用户名、账号名及密码用于认证,存在安全风险,请用户注意使用安全;
var userName, domainName, password string

// NewClient 通过username/password创建Clientset
func NewClient() (*kubernetes.Clientset, error) {
	config, err := clientcmd.BuildConfigFromFlags(cciEndpoint, "")
	if err != nil {
		return nil, err
	}
	var optionArgs []string
	optionArgs = append(optionArgs, fmt.Sprintf("--iam-endpoint=%s", iamEndpoint))
	optionArgs = append(optionArgs, fmt.Sprintf("--project-name=%s", projectName))
	optionArgs = append(optionArgs, fmt.Sprintf("--token-only=false"))
	optionArgs = append(optionArgs, fmt.Sprintf("--domain-name=%s", domainName))
	optionArgs = append(optionArgs, fmt.Sprintf("--user-name=%s", userName))
	optionArgs = append(optionArgs, fmt.Sprintf("--password=%s", password))

	config.ExecProvider = &api.ExecConfig{
		Command:    "cci-iam-authenticator",
		APIVersion: apiVersion,
		Args:       append([]string{"token"}, optionArgs...),
		Env:        make([]api.ExecEnvVar, 0),
	}
	return kubernetes.NewForConfig(config)
}

使用AK/SK进行认证

import (
	"fmt"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/tools/clientcmd/api"
)

const (
	apiVersion = "client.authentication.k8s.io/v1beta1"
	
        // 云容器实例 CCI,参考https://developer.huaweicloud.com/intl/zh-cn/endpoint
	cciEndpoint = "<例如华北-北京四: https://cci.cn-north-4.myhuaweicloud.com>"
	
        // 统一身份认证服务 IAM,参考https://developer.huaweicloud.com/intl/zh-cn/endpoint
	iamEndpoint = "<例如华北-北京四: https://iam.cn-north-4.myhuaweicloud.com>"
	
        // 地区和终端节点,参考https://developer.huaweicloud.com/intl/zh-cn/endpoint
	projectName = "<例如华北-北京四: 'cn-north-4'>"
)

// 获取AK/SK参考: https://support.huaweicloud.com/intl/zh-cn/devg-cci/cci_kubectl_01.html#cci_kubectl_01__section17023744719
// ak,sk分别表示用户AK/SK,需用户自行传入,因AK/SK用于认证,存在安全风险,请用户注意使用安全。
var ak, sk string

// NewClient 通过AK/SK认证创建Clientset
func NewClient() (*kubernetes.Clientset, error) {
	config, err := clientcmd.BuildConfigFromFlags(cciEndpoint, "")
	if err != nil {
		return nil, err
	}
	var optionArgs []string
	optionArgs = append(optionArgs, fmt.Sprintf("--iam-endpoint=%s", iamEndpoint))
	optionArgs = append(optionArgs, fmt.Sprintf("--project-name=%s", projectName))
	optionArgs = append(optionArgs, fmt.Sprintf("--token-only=false"))
	optionArgs = append(optionArgs, fmt.Sprintf("--ak=%s", ak))
	optionArgs = append(optionArgs, fmt.Sprintf("--sk=%s", sk))
	config.ExecProvider = &api.ExecConfig{
		Command:    "cci-iam-authenticator",
		APIVersion: apiVersion,
		Args:       append([]string{"token"}, optionArgs...),
		Env:        make([]api.ExecEnvVar, 0),
	}
	return kubernetes.NewForConfig(config)
}

生成kubeconfig配置文件用于认证配置,参考使用cci-iam-authenticator的子命令generate-kubeconfig生成kubeconfig配置文件

import (
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

// NewClient 通过kubeconfig配置文件创建Clientset
// kubeconfig配置文件需包含认证相关信息,具体请参考《cci-iam-authenticator使用参考》生成kubeconfig配置文件:https://support.huaweicloud.com/intl/zh-cn/devg-cci/cci_kubectl_03.html
func NewClient() (*kubernetes.Clientset, error) {
	config, err := clientcmd.BuildConfigFromFlags("", "/path/to/kubeconfig")
	if err != nil {
		return nil, err
	}
	return kubernetes.NewForConfig(config)
}

FAQ

问:上述代码示例是否存在请求结果返回码为401的情况?

答:一般情况下,如果密码或AK/SK配置无误,client-go提供的定期刷新token的机制(即定期调用cci-iam-authenticator刷新token,具体实现参考https://github.com/kubernetes/client-go/blob/master/plugin/pkg/client/auth/exec/exec.go),能确保token不会因过期而失效(token的有效期为24小时),从而避免请求结果返回码为401。

但当账号权限发生变更时,token可能也会失效,不属于超期失效的情形,在该情形下,仍会出现请求结果返回码为401的情况。