Manoratra mpandraharaha ho an'ny Kubernetes ao Golang

Fanamarihana. transl.: Ny operatera dia rindrambaiko fanampiny ho an'ny Kubernetes, natao ho azy ny fanatanterahana ny hetsika mahazatra amin'ny zavatra cluster rehefa misy hetsika sasany. Efa nanoratra momba ny opΓ©rateur in ity lahatsoratra ity, izay niresahan’izy ireo ny hevitra fototra sy ny foto-kevitra fototra amin’ny asany. Fa raha io fitaovana io dia fomba fijery bebe kokoa amin'ny lafiny fampandehanana singa efa vita ho an'ny Kubernetes, ny fandikana ny lahatsoratra vaovao natolotra ankehitriny dia efa fahitan'ny injeniera developer/DevOps very hevitra tamin'ny fampiharana mpandraharaha vaovao.

Manoratra mpandraharaha ho an'ny Kubernetes ao Golang

Nanapa-kevitra ny hanoratra ity lahatsoratra ity miaraka amin'ny ohatra tena izy aho taorian'ny fiezahako hitady antontan-taratasy momba ny famoronana mpandraharaha ho an'ny Kubernetes, izay nandalo fianarana ny kaody.

Ny ohatra holazaina dia izao: ao amin'ny cluster Kubernetes, tsirairay avy Namespace dia maneho ny tontolon'ny sandbox an'ny ekipa iray, ary tianay hamerana ny fidirana amin'izy ireo mba tsy ahafahan'ny ekipa milalao afa-tsy ao anaty boaty fasika.

Azonao atao ny manatratra izay tadiavinao amin'ny alalan'ny fanendrena mpampiasa vondrona manana RoleBinding manokana Namespace ΠΈ ClusterRole miaraka amin'ny zon'ny fanovana. Ny fanehoana YAML dia ho toy izao:

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

Mamorona iray RoleBinding Azonao atao ny manao izany amin'ny tanana, fa rehefa avy niampita ny mari-pamantarana anarana an-jatony dia lasa asa mandreraka. Eto no misy ny mpandraharaha Kubernetes - mamela anao hanao automatique ny famoronana loharano Kubernetes mifototra amin'ny fiovan'ny loharanon-karena. Amin'ny tranga misy antsika dia te hamorona isika RoleBinding rehefa mamorona Namespace.

Voalohany indrindra, andeha hofaritana ny asa mainizay manao ny fanamboarana ilaina mba hampandehanana ny fanambarana ary avy eo miantso ny hetsika fanambarana:

(Fanamarihana. transl.: eto sy eo ambany ny fanehoan-kevitra ao amin'ny kaody dia adika amin'ny teny Rosiana. Ho fanampin'izay, nahitsy amin'ny habaka fa tsy amin'ny kiheba [nasosoka ao amin'ny Go] fotsiny ny indentation mba hahamora kokoa ny famakiana ao anatin'ny layout Habr. Aorian'ny lisitra tsirairay dia misy rohy mankany amin'ny tany am-boalohany ao amin'ny GitHub, izay misy ny fanehoan-kevitra sy tabilao amin'ny teny anglisy.)

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

Manao izao manaraka izao izahay:

  1. Manefa mpandrindra izahay ho an'ny famantarana rafitra miasa manokana mba hampitsaharana tsara ny mpandraharaha.
  2. Ampiasainay WaitGrouphampiato tsara ny goroutine rehetra alohan'ny hamaranana ny fampiharana.
  3. Manome fidirana amin'ny cluster izahay amin'ny famoronana clientset.
  4. fandefasana NamespaceController, izay hitoeran'ny lojikantsika rehetra.

Ankehitriny dia mila fototra ho an'ny lojika isika, ary amin'ny tranga misy antsika dia io ilay voalaza 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 manta)

Eto izahay dia manamboatra SharedIndexInformer, izay hiandry (mampiasa cache) amin'ny fomba mahomby ny fanovana amin'ny toeran'ny anarana (vakio bebe kokoa momba ny mpanome vaovao ao amin'ny lahatsoratra "Ahoana no tena fiasan'ny mpandrindra Kubernetes?"- eo ho eo FANDIKAN-TENY). Aorian'io dia mifandray isika EventHandler amin'ny mpampita vaovao, ka rehefa manampy toerana misy anarana (Namespace) atao hoe function createRoleBinding.

Ny dingana manaraka dia ny famaritana io asa io 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 manta)

Mahazo ny namespace toy ny obj ary avadika ho zavatra Namespace. Dia faritanay RoleBinding, mifototra amin'ny rakitra YAML voalaza tany am-piandohana, mampiasa ilay zavatra nomena Namespace ary mamorona RoleBinding. Farany, misoratra anarana izahay raha nahomby ny famoronana.

Ny asa farany hofaritana dia 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 manta)

Eto isika dia miresaka WaitGroupfa manomboka ny goroutine ary miantso avy eo namespaceInformer, izay efa voafaritra teo aloha. Rehefa tonga ny famantarana fiatoana dia hamarana ny asa, mampahafantatra WaitGroup, izay tsy vita intsony, ary hivoaka ity asa ity.

Ny fampahalalana momba ny fananganana sy ny fampandehanana ity fanambarana ity amin'ny cluster Kubernetes dia azo jerena ao repository ao amin'ny GitHub.

Izany dia ho an'ny mpandraharaha izay mamorona RoleBinding rahoviana Namespace ao amin'ny cluster Kubernetes, vonona.

Source: www.habr.com

Add a comment