调整工程结构

This commit is contained in:
zhouqj 2022-03-03 15:18:56 +08:00
parent fdc7c9272c
commit e00c239862
8 changed files with 435 additions and 0 deletions

View File

@ -0,0 +1,63 @@
// This file is auto-generated, don't edit it. Thanks.
package main
import (
"fmt"
openapi "github.com/alibabacloud-go/darabonba-openapi/client"
eci20180808 "github.com/alibabacloud-go/eci-20180808/client"
"github.com/alibabacloud-go/tea/tea"
"os"
)
/**
* 使用AK&SK初始化账号Client
* @param accessKeyId
* @param accessKeySecret
* @return Client
* @throws Exception
*/
func CreateClient(accessKeyId *string, accessKeySecret *string) (_result *eci20180808.Client, _err error) {
config := &openapi.Config{
AccessKeyId: accessKeyId,
AccessKeySecret: accessKeySecret,
}
// 访问的域名
config.Endpoint = tea.String("eci.aliyuncs.com")
_result = &eci20180808.Client{}
_result, _err = eci20180808.NewClient(config)
return _result, _err
}
func _main(args []*string) (_err error) {
client, _err := CreateClient(tea.String("LTAI4GKsRHtEqUu8bzq5dt6N"), tea.String("j96G9E2ijwpiN987VC03HmcFsaJngt"))
if _err != nil {
return _err
}
describeContainerGroupsRequest := &eci20180808.DescribeContainerGroupsRequest{
OwnerAccount: tea.String("test"),
RegionId: tea.String("cn-hangzhou"),
}
//deleteContainerGroupRequest := &eci20180808.DeleteContainerGroupRequest{
// ResourceOwnerAccount: tea.String("test"),
// ResourceOwnerId: tea.Int64(1),
// OwnerAccount: tea.String("test"),
// RegionId: tea.String("test"),
//}
// 复制代码运行请自行打印 API 的返回值
_, _err = client.DescribeContainerGroups(describeContainerGroupsRequest)
//describeContainerGroupsResponse := client.DescribeContainerGroups(describeContainerGroupsRequest)
fmt.Println(_err)
if _err != nil {
return _err
}
return _err
}
func main() {
err := _main(tea.StringSlice(os.Args[1:]))
if err != nil {
panic(err)
}
}

View File

@ -0,0 +1,42 @@
package client
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 = "NVZH8MA2QCWFC3KPLHWJ"
sk = "CACGSvC4BPq0aQkgFkLfsbc7RUzBw0dD92wXZWuL"
)
// 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)
}

View File

@ -0,0 +1,57 @@
package main
import (
"fmt"
"PCM/container_api_adaptor/huawei/client"
"PCM/container_api_adaptor/huawei/deployment"
"PCM/container_api_adaptor/huawei/namespace"
"PCM/container_api_adaptor/huawei/network"
)
func main() {
// 有多种认证方式,具体请参考
//《使用cci-iam-authenticator进行认证并创建client》https://support.huaweicloud.com/sdkreference-cci/cci_09_0004.html
cs, err := client.NewClient()
if err != nil {
panic(err)
}
// Network为CRD对象创建Network对象请参考
//《使用client-go访问CCI的CRD资源Network》https://support.huaweicloud.com/sdkreference-cci/cci_09_0004.html
//《Namespace和Network》https://support.huaweicloud.com/devg-cci/cci_05_0023.html#section3
fmt.Println("start to create network")
_, err = network.CreateNetwork()
if err != nil {
panic(err)
}
fmt.Println("network created")
fmt.Println("start to create deployment")
_, err = deployment.CreateDeployment(cs)
if err != nil {
panic(err)
}
fmt.Println("deployment created")
fmt.Println("start to get deployment details")
_, err = deployment.GetDeployment(cs)
if err != nil {
panic(err)
}
fmt.Println("deployment details got")
fmt.Println("start to delete deployment")
err = deployment.DeleteDeployment(cs)
if err != nil {
panic(err)
}
fmt.Println("deployment deleted")
fmt.Println("start to delete namespace")
err = namespace.DeleteNamespace(cs)
if err != nil {
panic(err)
}
fmt.Println("namespace terminating")
}

View File

@ -0,0 +1,75 @@
package deployment
import (
v1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
)
const (
app = "test-k8s-client-deployment"
namespace = "test-k8s-client-namespace"
)
// CreateDeployment 创建Deployment
// API参考https://support.huaweicloud.com/api-cci/createAppsV1NamespacedDeployment.html
func CreateDeployment(client *kubernetes.Clientset) (*v1.Deployment, error) {
var replicas int32 = 2
var priority int32 = 0
podTemplate := corev1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{Labels: map[string]string{"app": app}},
Spec: corev1.PodSpec{
Priority: &priority,
ImagePullSecrets: []corev1.LocalObjectReference{{Name: "imagepull-secret"}},
Containers: []corev1.Container{{
Name: "container-0",
Image: "library/nginx:stable-alpine-perl",
Resources: corev1.ResourceRequirements{
Requests: map[corev1.ResourceName]resource.Quantity{
corev1.ResourceCPU: resource.MustParse("500m"),
corev1.ResourceMemory: resource.MustParse("1024Mi"),
},
Limits: map[corev1.ResourceName]resource.Quantity{
corev1.ResourceCPU: resource.MustParse("500m"),
corev1.ResourceMemory: resource.MustParse("1024Mi"),
},
},
}},
},
}
deployment := &v1.Deployment{
TypeMeta: metav1.TypeMeta{
APIVersion: "apps/v1",
Kind: "Deployment",
},
ObjectMeta: metav1.ObjectMeta{
Name: app,
},
Spec: v1.DeploymentSpec{
Replicas: &replicas,
Selector: &metav1.LabelSelector{
MatchLabels: map[string]string{
"app": app,
},
},
Template: podTemplate,
},
}
return client.AppsV1().Deployments(namespace).Create(nil, deployment, metav1.CreateOptions{})
}
// DeleteDeployment 删除Deployment
// API参考https://support.huaweicloud.com/api-cci/deleteAppsV1NamespacedDeployment.html
func DeleteDeployment(client *kubernetes.Clientset) error {
return client.AppsV1().Deployments(namespace).Delete(nil, app, metav1.DeleteOptions{})
}
// GetDeployment 查询Deployment
// API参考https://support.huaweicloud.com/api-cci/readAppsV1NamespacedDeployment.html
func GetDeployment(client *kubernetes.Clientset) (*v1.Deployment, error) {
return client.AppsV1().Deployments(namespace).Get(nil, app, metav1.GetOptions{})
}

View File

@ -0,0 +1,33 @@
package huawei
import (
"fmt"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/core/auth/basic"
cce "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cce/v3"
"github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cce/v3/model"
region "github.com/huaweicloud/huaweicloud-sdk-go-v3/services/cce/v3/region"
)
func main() {
ak := "NVZH8MA2QCWFC3KPLHWJ"
sk := "CACGSvC4BPq0aQkgFkLfsbc7RUzBw0dD92wXZWuL"
auth := basic.NewCredentialsBuilder().
WithAk(ak).
WithSk(sk).
Build()
client := cce.NewCceClient(
cce.CceClientBuilder().
WithRegion(region.ValueOf("cn-north-4")).
WithCredential(auth).
Build())
request := &model.ListClustersRequest{}
response, err := client.ListClusters(request)
if err == nil {
fmt.Printf("%+v\n", response)
} else {
fmt.Println(err)
}
}

View File

@ -0,0 +1,59 @@
package namespace
import (
"time"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/kubernetes"
)
const (
namespace = "test-k8s-client-namespace"
)
// CreateNamespace 创建命名空间
// API参考https://support.huaweicloud.com/api-cci/createCoreV1Namespace.html
func CreateNamespace(cs *kubernetes.Clientset) (*corev1.Namespace, error) {
namespace := &corev1.Namespace{
TypeMeta: metav1.TypeMeta{},
ObjectMeta: metav1.ObjectMeta{
Name: namespace,
Annotations: map[string]string{
"namespace.kubernetes.io/flavor": "general-computing",
"network.cci.io/warm-pool-size": "10",
},
Labels: map[string]string{
"rbac.authorization.cci.io/enable-k8s-rbac": "false",
},
},
}
return cs.CoreV1().Namespaces().Create(nil, namespace, metav1.CreateOptions{
TypeMeta: metav1.TypeMeta{},
DryRun: nil,
FieldManager: "",
FieldValidation: "",
})
}
// DeleteNamespace 删除Namespace
// API参考https://support.huaweicloud.com/api-cci/deleteCoreV1Namespace.html
func DeleteNamespace(cs *kubernetes.Clientset) error {
return cs.CoreV1().Namespaces().Delete(nil, namespace, metav1.DeleteOptions{})
}
// WaitNamespaceActive 查询Namespace状态等待其状态变为"Active"
// API参考https://support.huaweicloud.com/api-cci/readCoreV1Namespace.html
func WaitNamespaceActive(cs *kubernetes.Clientset) error {
return wait.Poll(time.Second*5, time.Second*30, func() (done bool, err error) {
ns, err := cs.CoreV1().Namespaces().Get(nil, namespace, metav1.GetOptions{})
if err != nil {
return false, err
}
if ns.Status.Phase == corev1.NamespaceActive {
return true, nil
}
return false, nil
})
}

View File

@ -0,0 +1,73 @@
package network
import (
"time"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/wait"
"k8s.io/client-go/tools/clientcmd"
"examples.com/cci-examples/pkg/apis/networking.cci.io/v1beta1"
clientset "examples.com/cci-examples/pkg/client/networking.cci.io/v1beta1"
)
const (
name = "test-k8s-client-namespace-cn-north-1-default-network"
namespace = "test-k8s-client-namespace"
)
// CreateNetwork 创建Network并等待其状态变更为Active
// 参考《Namespace和Network》 https://support.huaweicloud.com/devg-cci/cci_05_0023.html
// API参考https://support.huaweicloud.com/api-cci/createNetworkingCciIoV1beta1NamespacedNetwork.html
func CreateNetwork() (*v1beta1.Network, error) {
config, _ := clientcmd.BuildConfigFromFlags("", "{path to kubeconfig}")
cs, err := clientset.NewForConfig(config)
if err != nil {
return nil, err
}
projectId := "<账号ID可以在我的凭证获取>"
domainId := "<项目ID可以在我的凭证获取>"
securityGroupID := "<安全组ID可以在安全组控制台获取>"
availableZone := "<az名称例如cn-north-1a、cn-north-4a或cn-east-3a>"
vpcID := "虚拟私有云的ID可在VPC控制台获取"
cidr := "<子网网段例如192.168.128.0/18>"
networkID := "<子网的网络ID可在VPC控制台 > 子网中获取>"
subnetID := "<子网ID可在VPC控制台 > 子网获取>"
network := &v1beta1.Network{
ObjectMeta: metav1.ObjectMeta{
Annotations: map[string]string{
"network.alpha.kubernetes.io/default-security-group": securityGroupID,
"network.alpha.kubernetes.io/domain-id": domainId,
"network.alpha.kubernetes.io/project-id": projectId,
},
Name: name,
},
Spec: v1beta1.NetworkSpec{
AvailableZone: availableZone,
CIDR: cidr,
AttachedVPC: vpcID,
NetworkID: networkID,
NetworkType: "underlay_neutron",
SubnetID: subnetID,
},
}
network, err = cs.NetworkingCCIV1beta1().Networks(namespace).Create(network)
if err != nil {
return nil, err
}
// 查询Network状态等待其状态变为"Active"
err = wait.Poll(time.Second*5, time.Second*30, func() (done bool, err error) {
network, err = cs.NetworkingCCIV1beta1().Networks(namespace).Get(name, metav1.GetOptions{})
if err != nil {
return false, err
}
if network.Status.State == v1beta1.NetworkActive {
return true, nil
}
return false, nil
})
return network, err
}

View File

@ -0,0 +1,33 @@
package main
import (
"fmt"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/profile"
tke "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke/v20180525"
)
func main() {
credential := common.NewCredential(
"AKIDRefQxnhmuqTU1KRWFl58wQeCE0XoAeEZ",
"LUMVRmGj2kFrEahhZzA5pKvHNSMASntj",
)
cpf := profile.NewClientProfile()
cpf.HttpProfile.Endpoint = "tke.tencentcloudapi.com"
client, _ := tke.NewClient(credential, "ap-beijing", cpf)
request := tke.NewDescribeEKSContainerInstancesRequest()
response, err := client.DescribeEKSContainerInstances(request)
if _, ok := err.(*errors.TencentCloudSDKError); ok {
fmt.Printf("An API error has returned: %s", err)
return
}
if err != nil {
panic(err)
}
fmt.Printf("%s", response.ToJsonString())
}