Qorista hawlwadeenka Kubernetes ee Golang

Ogow. turjumiHawl-wadeenadu waa software kaaliyaha ah ee Kubernetes oo loogu talagalay in lagu habeeyo ficilada joogtada ah ee walxaha kooxda marka dhacdooyinka qaarkood dhacaan. Horay ayaan wax uga qornay hawl-wadeennada gudaha maqaalkani, kaas oo ka hadlay fikradaha aasaasiga ah iyo mabaadi'da hawlgalka. Laakiin iyada oo maaddadaas ay ka badan tahay aragtida ka shaqeynta qaybaha diyaarsan ee Kubernetes, tarjumaadda la soo jeediyay ee maqaalkan cusub waa aragtida horumarinta / DevOps injineer, oo la yaabay hirgelinta hawlwadeenka cusub.

Qorista hawlwadeenka Kubernetes ee Golang

Waxaan go'aansaday inaan ku qoro qoraalkan tusaale ahaan adduunka dhabta ah ka dib markii aan isku dayay inaan helo dukumeenti ku saabsan abuurista hawlwadeenka Kubernetes, taas oo keentay in aan barto koodka.

Tusaalaha lagu sifayn doono waa kan: Kubernetes kutladayada, mid walba Namespace waxay ka dhigan tahay jawiga sandbox-ka kooxda, waxaana rabnay inaan xaddidno gelitaankooda si ay kooxuhu ugu ciyaaraan kaliya sanduuqyada ciidooda.

Natiijada la rabo waxaa lagu gaari karaa iyadoo loo xilsaarayo isticmaalaha koox leh RoleBinding si gaar ah Namespace ΠΈ ClusterRole leh xuquuqda tafatirka. Matalaadda YAML waxay u ekaan doontaa sidan:

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: kubernetes-team-1
  namespace: team-1
subjects:
- kind: Group
  name: kubernetes-team-1
  apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: edit
apiGroup: rbac.authorization.k8s.io

(doorbidid.yamlgudaha cayriin)

Si loo abuuro sida RoleBinding Tan waxaad ku samayn kartaa gacanta, laakiin ka dib markaad ka gudubto 100ka calaamadda magac, waxay noqotaa mid caajis ah. Tani waa halka hawl wadeenada Kubernetes ay ku anfacaanβ€”waxay kuu oggolaanayaan inaad si toos ah u abuurto ilaha Kubernetes iyadoo lagu salaynayo isbeddelada kheyraadka. Xaaladeena, waxaan rabnaa inaan abuurno RoleBinding marka la abuurayo Namespace.

Marka hore aan qeexno shaqada main, kaas oo fulinaya habaynta loo baahan yahay si uu u socodsiiyo hawlwadeenka ka dibna u yeedha hawlwadeenka ficilkiisa:

(Ogow. turjumiHalkan ka dib, faallooyinka koodka ayaa loo tarjumay Ruush. Intaa waxaa dheer, soo gelisyada waxaa loo beddelay meelo bannaan halkii laga isticmaali lahaa tabs [lagu taliyay in Go] oo keliya ujeeddada hagaajinta akhrinta gudaha qaabka Habr. Liis kasta oo la socdaa waa xidhiidhiya koodka asalka ah ee GitHub, halkaas oo faallooyinka Ingiriisiga lagu xafido.

func main() {
  // УстанавливаСм Π²Ρ‹Π²ΠΎΠ΄ Π»ΠΎΠ³ΠΎΠ² Π² ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ STDOUT
  log.SetOutput(os.Stdout)

  sigs := make(chan os.Signal, 1) // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ°Π½Π°Π» для получСния сигналов ОБ
  stop := make(chan struct{})     // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ°Π½Π°Π» для получСния стоп-сигнала

  // РСгистрируСм ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ SIGTERM Π² ΠΊΠ°Π½Π°Π»Π΅ sigs
  signal.Notify(sigs, os.Interrupt, syscall.SIGTERM, syscall.SIGINT) 

  // Goroutines ΠΌΠΎΠ³ΡƒΡ‚ сами Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ сСбя Π² WaitGroup,
 // Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΡ… выполнСния доТидались
  wg := &sync.WaitGroup{} 

  runOutsideCluster := flag.Bool("run-outside-cluster", false, "Set this flag when running outside of the cluster.")
  flag.Parse()
  // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ clientset для взаимодСйствия с кластСром Kubernetes
  clientset, err := newClientSet(*runOutsideCluster)

  if err != nil {
    panic(err.Error())
  }

  controller.NewNamespaceController(clientset).Run(stop, wg)

  <-sigs // Π–Π΄Π΅ΠΌ сигналов (Π΄ΠΎ получСния сигнала Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ происходит)
  log.Printf("Shutting down...")

  close(stop) // Π“ΠΎΠ²ΠΎΡ€ΠΈΠΌ goroutines ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ
  wg.Wait()   // ОТидаСм, Ρ‡Ρ‚ΠΎ всС остановлСно
}

(ugu weyn.gogudaha cayriin)

Waxaan samaynaa kuwan soo socda:

  1. Waxaan u habeyneynaa maamule calaamadaha nidaamka qalliinka ee gaarka ah si ay u keento joojinta quruxda badan ee hawlwadeenka.
  2. Waxaan isticmaalnaa WaitGroupin si xarrago leh loo joojiyo dhammaan gorutines ka hor inta uusan codsiga joojin.
  3. Waxaan bixinaa gelitaanka kooxda anagoo abuurayna clientset.
  4. Daahfurka NamespaceController, kaas oo dhammaan caqli-galkeennu ku jiri doono.

Hadda waxaynu u baahannahay sal u ah caqli-gal, xaaladdeenna waa tii la sheegay NamespaceController:

// NamespaceController слСдит Ρ‡Π΅Ρ€Π΅Π· Kubernetes API Π·Π° измСнСниями
// Π² пространствах ΠΈΠΌΠ΅Π½ ΠΈ создаСт RoleBinding для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ namespace.
type NamespaceController struct {
  namespaceInformer cache.SharedIndexInformer
  kclient           *kubernetes.Clientset
}

// NewNamespaceController создаСт Π½ΠΎΠ²Ρ‹ΠΉ NewNamespaceController
func NewNamespaceController(kclient *kubernetes.Clientset) *NamespaceController {
  namespaceWatcher := &NamespaceController{}

  // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ΅Ρ€ для слСТСния Π·Π° Namespaces
  namespaceInformer := cache.NewSharedIndexInformer(
    &cache.ListWatch{
      ListFunc: func(options metav1.ListOptions) (runtime.Object, error) {
        return kclient.Core().Namespaces().List(options)
      },
      WatchFunc: func(options metav1.ListOptions) (watch.Interface, error) {
        return kclient.Core().Namespaces().Watch(options)
      },
    },
    &v1.Namespace{},
    3*time.Minute,
    cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc},
  )

  namespaceInformer.AddEventHandler(cache.ResourceEventHandlerFuncs{
    AddFunc: namespaceWatcher.createRoleBinding,
  })

  namespaceWatcher.kclient = kclient
  namespaceWatcher.namespaceInformer = namespaceInformer

  return namespaceWatcher
}

(maamule.gogudaha cayriin)

Halkan waanu dejinay SharedIndexInformer, kaas oo si hufan (adoo isticmaalaya khasnadda) sugi doona isbeddelada meelaha magacyada (ka akhri wax badan oo ku saabsan xog-ogayaasha maqaalka "Sidee buu u shaqeeyaa jadwalka Kubernetes?"- qiyaastii turjumaada)Intaa ka dib waan isku xireynaa EventHandler wargeliyaha, si marka lagu daro meel magac ah (Namespace) shaqada waxaa loo yaqaan createRoleBinding.

Tallaabada xigta waa in la qeexo shaqadan createRoleBinding:

func (c *NamespaceController) createRoleBinding(obj interface{}) {
  namespaceObj := obj.(*v1.Namespace)
  namespaceName := namespaceObj.Name

  roleBinding := &v1beta1.RoleBinding{
    TypeMeta: metav1.TypeMeta{
      Kind:       "RoleBinding",
      APIVersion: "rbac.authorization.k8s.io/v1beta1",
    },
    ObjectMeta: metav1.ObjectMeta{
      Name:      fmt.Sprintf("ad-kubernetes-%s", namespaceName),
      Namespace: namespaceName,
    },
    Subjects: []v1beta1.Subject{
      v1beta1.Subject{
        Kind: "Group",
        Name: fmt.Sprintf("ad-kubernetes-%s", namespaceName),
      },
    },
    RoleRef: v1beta1.RoleRef{
      APIGroup: "rbac.authorization.k8s.io",
        Kind:     "ClusterRole",
        Name:     "edit",
    },
  }

  _, err := c.kclient.Rbac().RoleBindings(namespaceName).Create(roleBinding)

  if err != nil {
    log.Println(fmt.Sprintf("Failed to create Role Binding: %s", err.Error()))
  } else {
    log.Println(fmt.Sprintf("Created AD RoleBinding for Namespace: %s", roleBinding.Name))
  }
}

(maamule.gogudaha cayriin)

Waxaan u helnaa goobta magaceed sida obj oo u beddelo shay Namespace. Kadibna waxaan go'aamineynaa RoleBinding, oo ku salaysan faylka YAML ee lagu sheegay bilowga, iyadoo la adeegsanayo shayga la bixiyay Namespace iyo abuurista RoleBindingUgu dambayntii, waxaynu galnay in abuurku guulaystay iyo in kale.

Shaqada ugu dambeysa ee u baahan in la qeexo waa Run:

// Run запускаСт процСсс оТидания ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² пространствах ΠΈΠΌΡ‘Π½
// ΠΈ дСйствия Π² соотвСтствии с этими измСнСниями.
func (c *NamespaceController) Run(stopCh <-chan struct{}, wg *sync.WaitGroup) {
  // Когда эта функция Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΠΌ ΠΊΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π½ΡƒΡŽ
  defer wg.Done()

  // Π˜Π½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌ wait group, Ρ‚.ΠΊ. собираСмся Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ goroutine
  wg.Add(1)

  // Π’Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ goroutine
  go c.namespaceInformer.Run(stopCh)

  // ОТидаСм получСния стоп-сигнала
  <-stopCh
}

(maamule.gogudaha cayriin)

Halkaan ka hadal WaitGroup, in aan bilowno gorutine ka dibna wac namespaceInformer, oo hore loo qeexay. Marka calaamada joogsiga la helo, waxay joojin doontaa shaqada, warbixinta WaitGroup, kaas oo aan hadda soconayn, shaqadanina way dhammaan doontaa.

Macluumaadka ku saabsan dhisida iyo socodsiinta hawlwadeenkan kutlada Kubernetes waxa laga heli karaa at kaydka GitHub.

On hawlwadeenkan, kaas oo abuura RoleBinding muuqaalka kore Namespace Kubernetes cluster, diyaar ah.

Source: www.habr.com

U soo iibso martigelin lagu kalsoonaan karo oo loogu talagalay bogagga leh ilaalinta DDoS, VPS VDS servers πŸ”₯ Iibso martigelin degel oo lagu kalsoonaan karo oo leh ilaalinta DDoS, VPS VDS servers | ProHoster