云容器实例 CCI
云容器实例 CCI
- 最新动态
- 功能总览
- 产品介绍
- 计费说明
- 快速入门
- 用户指南
- 最佳实践
- 开发指南
-
API参考
- 使用前必读
- 如何调用API
- 快速入门
- API
-
Kubernetes API
- ConfigMap
- Pod
- StorageClass
- Service
- Deployment
- Ingress
- OpenAPIv2
- VolcanoJob
- Namespace
- ClusterRole
- Secret
- Endpoint
- ResourceQuota
- CronJob
-
API groups
- 查询APIVersions
- 查询所有v1版本的API
- 查询APIGroupList
- 查询APIGroup /apis/apps
- 查询所有apps/v1的API
- 查询APIGroup /apis/batch
- 查询APIGroup /apis/batch.volcano.sh
- 查询所有batch.volcano.sh/v1alpha1的API
- 查询所有batch/v1的API
- 查询所有batch/v1beta1的API
- 查询APIGroup /apis/crd.yangtse.cni
- 查询所有crd.yangtse.cni/v1的API
- 查询APIGroup /apis/extensions
- 查询所有extensions/v1beta1的API
- 查询APIGroup /apis/metrics.k8s.io
- 查询所有metrics.k8s.io/v1beta1的API
- 查询APIGroup /apis/networking.cci.io
- 查询所有networking.cci.io/v1beta1的API
- 查询APIGroup /apis/rbac.authorization.k8s.io
- 查询所有rbac.authorization.k8s.io/v1的API
- Event
- PersistentVolumeClaim
- RoleBinding
- StatefulSet
- Job
- ReplicaSet
- 数据结构
- 权限和授权项
- 附录
- 历史API
- 修订记录
- SDK参考
- 场景代码示例
- 常见问题
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
使用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
示例已通过以下版本的测试:
- k8s.io/client-go@kubernetes-1.15.0
- k8s.io/client-go@kubernetes-1.16.0
- k8s.io/client-go@kubernetes-1.17.0
- k8s.io/client-go@kubernetes-1.18.0
- k8s.io/client-go@kubernetes-1.19.0
- 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/endpoint cciEndpoint = "<例如华北-北京四: https://cci.cn-north-4.myhuaweicloud.com>" // 统一身份认证服务 IAM,参考https://developer.huaweicloud.com/endpoint iamEndpoint = "<例如华北-北京四: https://iam.cn-north-4.myhuaweicloud.com>" // 地区和终端节点,参考https://developer.huaweicloud.com/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/endpoint cciEndpoint = "<例如华北-北京四: https://cci.cn-north-4.myhuaweicloud.com>" // 统一身份认证服务 IAM,参考https://developer.huaweicloud.com/endpoint iamEndpoint = "<例如华北-北京四: https://iam.cn-north-4.myhuaweicloud.com>" // 地区和终端节点,参考https://developer.huaweicloud.com/endpoint projectName = "<例如华北-北京四: 'cn-north-4'>" ) // 获取AK/SK参考: https://support.huaweicloud.com/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/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) }
代码示例
您可以前往开发体验馆Codelabs / Namespace生命周期代码示例(Go)下载相关代码,并在线调试。
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的情况。