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.
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.
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:
Masuk ke Konsol ACK menggunakan akun Alibaba Cloud. Di panel navigasi kiri, pilih . Klik tab Associated Clusters dan berikan pengguna RAM izin RBAC pada setiap kluster.
Masuk ke Konsol ACK One. Di panel navigasi kiri, pilih . Klik tab Connect to Fleet untuk mendapatkan file kubeconfig.
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:
Peroleh sumber daya OCM ManagedCluster yang sesuai dengan kluster terkait menggunakan file kubeconfig.
Gunakan Cluster Gateway untuk mengonfigurasi parameter kubeClient untuk setiap kluster.
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
)