Na-ede onye ọrụ maka Kubernetes na Golang

Rịba ama. ntụgharị asụsụ.: Ndị na-arụ ọrụ bụ ngwa enyemaka Kubernetes, emebere ka akpaaka mmezu nke omume na-emekarị na ụyọkọ ihe mgbe ụfọdụ ihe mere. Anyị edeelarị gbasara ndị na-arụ ọrụ na isiokwu a, ebe ha na-ekwu banyere isi echiche na ụkpụrụ nke ọrụ ha. Ma ọ bụrụ na ihe ahụ bụ ihe a na-ele anya site n'akụkụ nke arụ ọrụ njikere emebere maka Kubernetes, mgbe ahụ, nsụgharị nke ọhụrụ isiokwu ugbu a na-atụ aro ugbu a ọhụụ nke onye mmepụta / DevOps engineer mgbagwoju anya site na mmejuputa iwu nke onye ọrụ ọhụrụ.

Na-ede onye ọrụ maka Kubernetes na Golang

Ekpebiri m iji ihe atụ nke ndụ dee post a mgbe m gbalịrị ịchọta akwụkwọ na ịmepụta onye na-arụ ọrụ maka Kubernetes, bụ nke gafere site n'ịmụ koodu ahụ.

Ihe atụ nke a ga-akọwa bụ nke a: na ụyọkọ Kubernetes anyị, nke ọ bụla Namespace na-anọchi anya gburugburu ebe igbe ájá dị otu, ma anyị chọrọ igbochi ohere ịnweta ha ka ndị otu nwee ike igwu egwu naanị n'igbe aja nke ha.

Ị nwere ike nweta ihe ịchọrọ site n'inye onye ọrụ otu nwere RoleBinding kpọmkwem Namespace и ClusterRole na ikike ndezi. Nnọchite anya YAML ga-adị ka nke a:

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

(orubinding.yaml, na ndu)

Mepụta otu RoleBinding Ị nwere ike iji aka mee ya, ma mgbe ị gafechara akara narị aha, ọ na-aghọ ọrụ na-agwụ ike. Nke a bụ ebe ndị ọrụ Kubernetes na-abịa aka-ha na-enye gị ohere ịmepụta akụrụngwa Kubernetes dabere na mgbanwe na akụrụngwa. N'ọnọdụ anyị, anyị chọrọ ịmepụta RoleBinding mgbe eke Namespace.

Nke mbụ, ka anyị kọwaa ọrụ ahụ mainnke na-eme ntọala achọrọ iji mee nkwupụta wee kpọọ ọrụ nkwupụta:

(Rịba ama. ntụgharị asụsụ.: ebe a na n'okpuru okwu ndị dị na koodu ka a sụgharịrị n'asụsụ Russian. Na mgbakwunye, emezigharị nbanye ahụ gaa na oghere kama ịbụ taabụ [akwadoro na Go] naanị maka ebumnuche ọgụgụ ka mma n'ime nhazi Habr. Mgbe ndepụta nke ọ bụla gasịrị, enwere njikọ na nke mbụ na GitHub, ebe echekwara okwu na taabụ Bekee.)

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()   // Ожидаем, что все остановлено
}

(isi.go, na ndu)

Anyị na-eme ihe ndị a:

  1. Anyị na-ahazi onye njikwa maka akara sistemụ arụmọrụ akọwapụtara iji mee ka njedebe mara mma nke onye ọrụ.
  2. Anyị na-eji WaitGroupiji amara kwụsị goroutines niile tupu ị kwụsị ngwa ahụ.
  3. Anyị na-enye ohere ịnweta ụyọkọ site na ịmepụta clientset.
  4. Mwepụta NamespaceController, nke anyị niile mgbagha ga-adị.

Ugbu a, anyị chọrọ ntọala maka mgbagha, na n'ọnọdụ anyị nke a bụ nke a kpọtụrụ aha 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
}

(njikwa.go, na ndu)

Ebe a anyị na-ahazi SharedIndexInformer, nke ga-arụ ọrụ nke ọma (iji cache) chere maka mgbanwe na oghere aha (gụkwuo maka ndị na-enye ozi n'isiokwu ahụ "Kedu ka onye nhazi Kubernetes si arụ ọrụ n'ezie?"- - ihe ruru. ntụgharị asụsụ). Mgbe nke a gasịrị, anyị jikọọ EventHandler nye onye na-agwa ya, nke mere na mgbe ị na-agbakwunye oghere aha (Namespace) a na-akpọ ọrụ createRoleBinding.

Nzọụkwụ ọzọ bụ ịkọwa ọrụ a 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))
  }
}

(njikwa.go, na ndu)

Anyị na-enweta aha oghere dị ka obj ma tụgharịa ya ka ọ bụrụ ihe Namespace. Mgbe ahụ, anyị na-akọwa RoleBinding, dabere na faịlụ YAML a kpọtụrụ aha na mbido, na-eji ihe enyere Namespace na-eke RoleBinding. N'ikpeazụ, anyị na-edebanye ma ihe okike ahụ ọ gara nke ọma.

Ọrụ ikpeazụ a ga-akọwapụta bụ 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
}

(njikwa.go, na ndu)

Lee, anyị na-ekwu okwu WaitGroupka anyị malite goroutine wee kpọọ namespaceInformer, nke akọwara na mbụ. Mgbe mgbaàmà nkwụsị ahụ rutere, ọ ga-akwụsị ọrụ ahụ, gwa ya WaitGroup, nke anaghịzi eme ya, ọrụ a ga-apụkwa.

Enwere ike ịhụ ozi gbasara iwulite na ịme nkwupụta a na ụyọkọ Kubernetes ebe nchekwa na GitHub.

Nke ahụ bụ maka onye ọrụ na-emepụta RoleBinding mgbe ole Namespace na ụyọkọ Kubernetes, dị njikere.

isi: www.habr.com

Tinye a comment