Kunyora mushandisi weKubernetes muGolang

Cherechedza. transl.: Vashandisi isoftware yekubatsira yeKubernetes, yakagadzirirwa kuitisa otomatiki kuita kwemaitiro echinyakare pazvinhu zvesumbu kana zvimwe zviitiko zvikaitika. Takatonyora nezvevashandi mu ichi chinyorwa, pavakataura nezvepfungwa dzinokosha uye nheyo dzebasa ravo. Asi kana izvo zvinyorwa zvaive zvakanyanya zvekuonekwa kubva kudivi rekushanda zvakagadzirirwa-zvakagadzirwa zvikamu zveKubernetes, saka kushandura kwechinyorwa chitsva chave kurongwa chatova chiono chemugadziri / DevOps injinjini inokatyamadzwa nekuitwa kwemushandisi mutsva.

Kunyora mushandisi weKubernetes muGolang

Ndakafunga kunyora chinyorwa ichi nemuenzaniso wehupenyu chaihwo mushure mekuedza kwangu kutsvaga zvinyorwa pakugadzira mushandisi weKubernetes, iyo yakapfuura nekudzidza kodhi.

Muenzaniso uchatsanangurwa ndeuyu: muboka redu reKubernetes, rimwe nerimwe Namespace inomiririra nharaunda yebhokisi rejecha rechikwata, uye isu taida kudzikisira kusvika kwavari kuitira kuti zvikwata zvingotamba mumabhokisi ejecha zvawo.

Iwe unogona kuzadzisa zvaunoda nekupa mushandisi boka rine RoleBinding kune zvakananga Namespace ΠΈ ClusterRole nekodzero dzekugadzirisa. Iyo YAML inomiririra ichaita seizvi:

---
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

(rolebinding.yamlin mbishi)

Gadzira imwe RoleBinding Iwe unogona kuzviita nemaoko, asi mushure mekuyambuka zana remazita emucherechedzo, rinova basa rinonetesa. Apa ndipo panouya Kubernetes vanoshanda-vanokutendera kuti uite otomatiki kusikwa kweKubernetes zviwanikwa zvichienderana nekuchinja kune zviwanikwa. Muchiitiko chedu tinoda kugadzira RoleBinding uchigadzira Namespace.

Chekutanga, ngatitsanangurirei basa racho mainiyo inoita iyo inodiwa setup yekumhanyisa chirevo uye yobva yadaidza chirevo chiito:

(Cherechedza. transl.: pano uye pasi pemashoko ari mukodhi anoshandurirwa muchiRussia. Pamusoro pezvo, indentation yakagadziridzwa kune nzvimbo panzvimbo pe[inokurudzirwa muGo] matebu chete nechinangwa chekuverenga zvirinani mukati meiyo Habr marongero. Mushure mekunyorwa kwega kwega kune zvinongedzo kune yekutanga paGitHub, panochengetwa Chirungu-mutauro uye ma tabo.)

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()   // ОТидаСм, Ρ‡Ρ‚ΠΎ всС остановлСно
}

(main.goin mbishi)

Isu tinoita zvinotevera:

  1. Isu tinogadzirisa mubato kune chaiwo masisitimu anoshanda masisitimu kukonzeresa kumisa zvine nyasha kweanoshanda.
  2. Isu tinoshandisa WaitGroupkumisa zvakanaka magoroutines usati wamisa application.
  3. Isu tinopa mukana kune cluster nekugadzira clientset.
  4. Kutanga NamespaceController, umo pfungwa dzedu dzese dzichawanikwa.

Zvino isu tinoda hwaro hwepfungwa, uye mune yedu iyi ndiyo yakataurwa 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
}

(controller.goin mbishi)

Pano tinogadzirisa SharedIndexInformer, iyo ichaita (uchishandisa cache) kumirira shanduko mumazita (verenga zvakawanda nezvevanozivisa muchinyorwa "Iyo Kubernetes scheduler inoshanda sei chaizvo?"- approx. shanduro). Mushure meizvi tinobatanidza EventHandler kumuzivisi, kuitira kuti kana uchiwedzera zita (Namespace) basa rinonzi createRoleBinding.

Nhanho inotevera ndeyekutsanangura basa iri 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))
  }
}

(controller.goin mbishi)

Isu tinowana nzvimbo yezita se obj wochishandura kuita chinhu Namespace. Zvadaro tinotsanangura RoleBinding, zvichibva pafaira reYAML rataurwa pakutanga, uchishandisa chinhu chakapihwa Namespace uye kugadzira RoleBinding. Pakupedzisira, tinonyora kana kusikwa kwakabudirira.

Basa rekupedzisira rinotsanangurwa ndeiyi 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
}

(controller.goin mbishi)

Apa tiri kutaura WaitGroupkuti titange goroutine tozofona namespaceInformer, izvo zvakambotsanangurwa. Kana chiratidzo chekumira chasvika, chinopedza basa, zivisa WaitGroup, iyo isisiri kuurayiwa, uye basa iri richabuda.

Ruzivo rwekuvaka uye nekumhanyisa chirevo ichi pane Kubernetes cluster inogona kuwanikwa mukati repositories paGitHub.

Ndizvo zvemushandisi anogadzira RoleBinding riinhi Namespace muKubernetes cluster, yakagadzirira.

Source: www.habr.com

Voeg