Qorista hawlwadeenka Kubernetes ee Golang

Ogow. turjumiHawl-wadeenadu waa software-ka caawiya Kubernetes, oo loogu talagalay inay si otomaatig ah u fuliyaan fulinta falalka joogtada ah ee walxaha clusterka marka dhacdooyinka qaarkood dhacaan. Horay ayaan wax uga qornay hawl-wadeennada gudaha maqaalkani, halkaas oo ay kaga hadleen fikradaha aasaasiga ah iyo mabaadiida shaqadooda. Laakiin haddii alaabtaasi ay ahayd mid ka badan aragtida dhinaca ka shaqeynta qaybaha diyaarsan ee Kubernetes, ka dibna tarjumaadda maqaalka cusub ee hadda la soo jeediyay ayaa horeyba u ahaa aragtida horumarinta / DevOps engineer oo la yaabay hirgelinta hawlwadeen cusub.

Qorista hawlwadeenka Kubernetes ee Golang

Waxaan go'aansaday inaan ku qoro qoraalkan tusaalaha nolosha dhabta ah ka dib markii aan isku dayay inaan helo dukumeenti ku saabsan abuurista hawlwadeenka Kubernetes, kaas oo dhex maray barashada 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.

Waxaad ku gaari kartaa waxaad rabto adiga oo ku meeleeya isticmaale koox leh RoleBinding si gaar ah Namespace ΠΈ ClusterRole xuquuqda tafatirka leh. 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)

Hal abuur RoleBinding Waxaad ku samayn kartaa gacanta, laakiin ka dib markaad ka gudubto boqolka magac ee calaamadda, waxay noqotaa hawl adag. Tani waa halka hawl wadeenada Kubernetes ay ku anfacaan-waxay kuu oggolaanayaan inaad si toos ah u abuurto ilaha Kubernetes iyadoo lagu salaynayo isbeddelada ilaha. Xaaladeena waxaan rabnaa inaan abuurno RoleBinding inta la abuurayo Namespace.

Marka hore aan qeexno shaqada mainkaas oo sameeya habaynta loo baahan yahay si uu u socodsiiyo bayaanka ka dibna ugu yeedha ficilka bayaanka:

(Ogow. turjumiHalkan iyo hoosta faallooyinka koodka waxaa lagu tarjumay Ruush. Intaa waxaa dheer, soo gelista waxa lagu saxay meelo bannaan halkii laga ahaan lahaa [lagu taliyay in Go] tabsiyada oo keliya ujeedada akhriska wanaagsan ee qaabka Habr. Liis kasta ka dib waxaa jira xiriiriya asalka GitHub, halkaas oo faallooyinka iyo tabaha afka Ingiriisiga lagu kaydiyo.)

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 gaarka ah si ay u sababto joojinta quruxda badan ee hawlwadeenka.
  2. Waxaan isticmaalnaa WaitGroupin si qurux badan loo joojiyo dhammaan gorutines ka hor inta aan la joojin codsiga.
  3. Waxaan bixinaa gelitaanka kooxda anagoo abuurayna clientset.
  4. Daahfurka NamespaceController, kaas oo dhammaan caqli-galkeennu ku jiri doono.

Hadda waxaan u baahannahay aasaas macquul ah, xaaladdeenna tani waa tan 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 waxaan ku habayn SharedIndexInformer, kaas oo si wax ku ool ah (adoo isticmaalaya khasnado) 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 waanu isku xidhna EventHandler wargeliyaha, si marka lagu daro meel magac ah (Namespace) shaqada ayaa 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 una beddel shay Namespace. Markaas ayaanu qeexaynaa RoleBinding, oo ku salaysan faylka YAML ee lagu sheegay bilowga, iyadoo la adeegsanayo shayga la bixiyay Namespace iyo abuurista RoleBinding. Ugu dambayntii, waxaynu galnay in abuurku guulaystay iyo in kale.

Shaqada ugu dambeysa ee lagu qeexayo 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)

Waar waannu ka hadlaynaa WaitGroupin aan bilowno goroutine ka dibna wac namespaceInformer, oo hore loo qeexay. Marka calaamada joogsiga yimaado, waxay joojin doontaa shaqada, ogeysii WaitGroup, kaas oo aan hadda la fulin, shaqadana way bixi doontaa.

Macluumaadka ku saabsan dhisidda iyo socodsiinta bayaankan kutlada Kubernetes waxaa laga heli karaa gudaha kaydka GitHub.

Taas ayaa loogu talagalay hawlwadeenka abuura RoleBinding muuqaalka kore Namespace Kubernetes kutlada, diyaar ah.

Source: www.habr.com

Add a comment