全部产品
Search
文档中心

Container Service for Kubernetes:Mengakses sumber daya multi-cluster dengan menggunakan SDK untuk Go

更新时间:Jun 26, 2025

Untuk mengintegrasikan instance Fleet dari Distributed Cloud Container Platform for Kubernetes (ACK One) ke dalam platform guna mengakses sumber daya setiap kluster, Anda dapat menggunakan SDK untuk Go. Topik ini menjelaskan cara memanfaatkan SDK untuk Go dalam mengelola sumber daya Kubernetes di beberapa kluster menggunakan file kubeconfig dari instance Fleet.

Prinsip akses sumber daya multi-cluster

ACK One menggunakan Cluster Gateway dari komunitas open source untuk mengimplementasikan akses terpusat ke sumber daya Kubernetes di beberapa kluster melalui file kubeconfig dari instance Fleet. ACK One juga memanfaatkan peniruan pengguna untuk mengelola akses pengguna ke izin Role-Based Access Control (RBAC) kluster.

  1. Masuk ke Fleet menggunakan akun Alibaba Cloud atau pengguna RAM, lalu peroleh file kubeconfig.

    Anda dapat memberikan izin RBAC pada kluster kepada pengguna RAM sebelumnya.

  2. Peroleh sumber daya Open Cluster Management (OCM) ManagedCluster di Fleet. Cluster Gateway mengubah kluster dengan menggunakan nama ManagedCluster untuk mengakses sumber daya Kubernetes kluster tersebut.

Peniruan Pengguna

Cluster Gateway memungkinkan Anda menggunakan peniruan pengguna untuk mengelola akses ke sumber daya Kubernetes di kluster. Berikut adalah langkah-langkah rinci:

  1. Masuk ke Konsol ACK menggunakan akun Alibaba Cloud. Di panel navigasi kiri, pilih Fleet > Permissions. Klik tab Associated Clusters dan berikan pengguna RAM izin RBAC pada setiap kluster.

  2. Masuk ke Konsol ACK One. Di panel navigasi kiri, pilih Fleet > Fleet Information. Klik tab Connect to Fleet untuk mendapatkan file kubeconfig.

  3. Gunakan file kubeconfig untuk mengakses sumber daya Kubernetes setiap kluster menggunakan Cluster Gateway. Untuk informasi lebih lanjut, lihat Contoh kode.

    Jika Anda tidak memiliki izin untuk melakukan operasi pada suatu sumber daya, Cluster Gateway akan melaporkan pesan kesalahan yang mirip dengan konten berikut:

    stream error: stream ID 3; INTERNAL_ERROR; received from peer

Contoh kode

Contoh kode berikut didasarkan pada OCM v0.14.0. Contoh ini menunjukkan cara mengakses sumber daya Kubernetes multi-cluster menggunakan file kubeconfig dari instance Fleet dan mencetak UID namespace kube-system dari semua kluster. Ikuti langkah-langkah berikut:

  1. Peroleh sumber daya OCM ManagedCluster yang sesuai dengan kluster terkait menggunakan file kubeconfig.

  2. Gunakan Cluster Gateway untuk mengonfigurasi parameter kubeClient untuk setiap kluster.

  3. Cetak UID namespace kube-system dari semua kluster.

package main

import (
	"context"
	"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/util/errors"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
	ocmcluster "open-cluster-management.io/api/client/cluster/clientset/versioned"
)

// Cetak UID namespace kube-system dari kluster.
func main() {
	fleetKubeconfigPath := "<your fleet kubeconifg path>"
	memberClients, err := GenerateMemberClusterKubeClients(fleetKubeconfigPath)
	if err != nil {
		panic(err.Error())
	}

	for cluster, kubeClient := range memberClients {
		ns, err := kubeClient.CoreV1().Namespaces().Get(context.TODO(), "kube-system", metav1.GetOptions{})
		if err != nil {
			fmt.Println(fmt.Sprintf("failed to get kube-system for member cluster %s: %v", cluster, err))
			continue
		}
		fmt.Println(fmt.Sprintf("Cluster %s kube-system namespace UID: %s", cluster, ns.UID))
	}
}

// Hasilkan KubeClient untuk kluster.
func GenerateMemberClusterKubeClients(fleetKubeconfigPath string) (map[string]kubernetes.Interface, error) {
	fleetConfig, err := clientcmd.BuildConfigFromFlags("", fleetKubeconfigPath)
	if err != nil {
		return nil, err
	}

	// dapatkan managedclusters oleh ocmClusterClient
	ocmClusterClient, err := ocmcluster.NewForConfig(fleetConfig)
	if err != nil {
		return nil, fmt.Errorf("failed to create ocm cluster client: %v", err)
	}
	managedClusters, err := ocmClusterClient.ClusterV1().ManagedClusters().List(context.Background(), metav1.ListOptions{})
	if err != nil {
		return nil, err
	}

	var errs []error
	memberClients := make(map[string]kubernetes.Interface)
	for _, cluster := range managedClusters.Items {
		configCopy := *fleetConfig
		configCopy.Host = fmt.Sprintf("%s/apis/cluster.core.oam.dev/v1alpha1/clustergateways/%s/proxy", fleetConfig.Host, cluster.Name)
		kubeClient, err := kubernetes.NewForConfig(&configCopy)
		if err != nil {
			errs = append(errs, fmt.Errorf("failed to create kube client for cluster %s: %v", cluster.Name, err))
			continue
		}
		memberClients[cluster.Name] = kubeClient
	}

	return memberClients, errors.NewAggregate(errs)
}

Konfigurasi go.mod

go 1.21.0


require (
	k8s.io/apimachinery v0.29.0
	k8s.io/client-go v0.29.0
	open-cluster-management.io/api v0.14.0
)

require (
	github.com/davecgh/go-spew v1.1.1 // indirect
	github.com/emicklei/go-restful/v3 v3.11.0 // indirect
	github.com/go-logr/logr v1.4.1 // indirect
	github.com/go-openapi/jsonpointer v0.19.6 // indirect
	github.com/go-openapi/jsonreference v0.20.2 // indirect
	github.com/go-openapi/swag v0.22.3 // indirect
	github.com/gogo/protobuf v1.3.2 // indirect
	github.com/golang/protobuf v1.5.4 // indirect
	github.com/google/gnostic-models v0.6.8 // indirect
	github.com/google/gofuzz v1.2.0 // indirect
	github.com/google/uuid v1.3.0 // indirect
	github.com/imdario/mergo v0.3.6 // indirect
	github.com/josharian/intern v1.0.0 // indirect
	github.com/json-iterator/go v1.1.12 // indirect
	github.com/mailru/easyjson v0.7.7 // indirect
	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
	github.com/modern-go/reflect2 v1.0.2 // indirect
	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
	github.com/spf13/pflag v1.0.5 // indirect
	golang.org/x/net v0.23.0 // indirect
	golang.org/x/oauth2 v0.12.0 // indirect
	golang.org/x/sys v0.18.0 // indirect
	golang.org/x/term v0.18.0 // indirect
	golang.org/x/text v0.14.0 // indirect
	golang.org/x/time v0.3.0 // indirect
	google.golang.org/appengine v1.6.7 // indirect
	google.golang.org/protobuf v1.33.0 // indirect
	gopkg.in/inf.v0 v0.9.1 // indirect
	gopkg.in/yaml.v2 v2.4.0 // indirect
	gopkg.in/yaml.v3 v3.0.1 // indirect
	k8s.io/api v0.30.0 // indirect
	k8s.io/klog/v2 v2.120.1 // indirect
	k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect
	k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect
	sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
	sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect
	sigs.k8s.io/yaml v1.4.0 // indirect
)