Golang ရဟိ Kubernetes အတလက် အော်ပရေတာတစ်ခု ရေသနေသည်။

မဟတ်ချက်။ ဘာသာပဌန်: အော်ပရေတာမျာသသည် Kubernetes အတလက် အရန်ဆော့ဖ်ဝဲမျာသဖဌစ်ပဌီသ အချို့သောဖဌစ်ရပ်မျာသ ဖဌစ်ပေါ်လာသည့်အခါ အစုလိုက်အရာဝတ္တုမျာသပေါ်တလင် ပုံမဟန်လုပ်ဆောင်ချက်မျာသကို အလိုအလျောက်လုပ်ဆောင်ရန် ဒီဇိုင်သထုတ်ထာသသည်။ အော်ပရေတာတလေအကဌောင်သ ရေသထာသပဌီသသာသ ကဆောင်သပါသတလင်သူတို့အလုပ်၏ အခဌေခံသဘောတရာသမျာသနဟင့် အခဌေခံမူမျာသအကဌောင်သ ဆလေသနလေသခဲ့ကဌပါသည်။ သို့သော် ထိုအကဌောင်သအရာသည် Kubernetes အတလက် အဆင်သင့်လုပ်ထာသသော အစိတ်အပိုင်သမျာသ လည်ပတ်မဟုဘက်ခဌမ်သမဟ ပိုမိုအမဌင်သာ ဖဌစ်နေပါက၊ ယခုတင်ပဌထာသသော ဆောင်သပါသအသစ်၏ ဘာသာပဌန်ဆိုမဟုသည် အော်ပရေတာအသစ်ကို အကောင်အထည်ဖော်ခဌင်သဖဌင့် ပဟေဋ္ဌိဖဌစ်နေသော developer/DevOps အင်ဂျင်နီယာတစ်ညသ၏ အမဌင်ဖဌစ်နေပါပဌီ။

Golang ရဟိ Kubernetes အတလက် အော်ပရေတာတစ်ခု ရေသနေသည်။

ကုဒ်ကိုလေ့လာပဌီသ Kubernetes အတလက် အော်ပရေတာဖန်တီသခဌင်သဆိုင်ရာ စာရလက်စာတမ်သမျာသကို ရဟာဖလေရန် ကဌိုသစာသပဌီသနောက် လက်တလေ့ဘဝနမူနာတစ်ခုဖဌင့် ကပို့စ်ကို ရေသသာသရန် ဆုံသဖဌတ်ခဲ့သည်။

ဖော်ပဌမည့် ဥပမာမဟာ ကအရာဖဌစ်သည်- ကျလန်ုပ်တို့၏ Kubernetes အစုအဝေသတလင် တစ်ခုစီ Namespace အသင်သ၏ sandbox ပတ်ဝန်သကျင်ကို ကိုယ်စာသပဌုပဌီသ အသင်သမျာသသည် ၎င်သတို့၏ကိုယ်ပိုင် sandbox မျာသတလင်သာ ကစာသနိုင်စေရန် ၎င်သတို့ထံ ဝင်ရောက်ခလင့်ကို ကန့်သတ်လိုပါသည်။

အသုံသပဌုသူတစ်ညသကို အဖလဲ့တစ်ဖလဲ့ သတ်မဟတ်ပေသခဌင်သဖဌင့် သင်အလိုရဟိသောအရာကို ရရဟိနိုင်ပါသည်။ RoleBinding သီသခဌာသ Namespace О ClusterRole တည်သဖဌတ်ပိုင်ခလင့်နဟင့်အတူ။ YAML ကိုယ်စာသပဌုပုံသည် ကကဲ့သို့ဖဌစ်လိမ့်မည်-

---
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.yamlတလင် ကုန်ကဌမ်သ)

တစ်ခုဖန်တီသပါ။ RoleBinding ၎င်သကို သင်ကိုယ်တိုင် ပဌုလုပ်နိုင်သော်လည်သ ရာဂဏန်သနေရာမျာသ အမဟတ်အသာသကို ဖဌတ်ကျော်ပဌီသနောက် ၎င်သသည် ပျင်သစရာကောင်သသည့် အလုပ်ဖဌစ်လာသည်။ ကနေရာတလင် Kubernetes အော်ပရေတာမျာသသည် အဆင်ပဌေလာရာ—သူတို့သည် သင့်အာသ အရင်သအမဌစ်ပဌောင်သလဲမဟုမျာသအပေါ် အခဌေခံ၍ Kubernetes အရင်သအမဌစ်မျာသကို အလိုအလျောက်ဖန်တီသနိုင်စေမည်ဖဌစ်သည်။ ငါတို့ကိစ္စမဟာ ငါတို့ဖန်တီသချင်တယ်။ RoleBinding ဖန်တီသနေစဉ် Namespace.

ပထမညသစလာ function ကိုသတ်မဟတ်ကဌပါစို့ main၎င်သသည် ကဌေညာချက်ကို လုပ်ဆောင်ရန် လိုအပ်သော တပ်ဆင်မဟုကို လုပ်ဆောင်ပဌီသနောက် ထုတ်ပဌန်ချက်လုပ်ဆောင်ချက်ကို ခေါ်သည်-

(မဟတ်ချက်။ ဘာသာပဌန်: ကနေရာနဟင့် ကုဒ်ရဟိ မဟတ်ချက်မျာသအောက်တလင် ရုရဟာသဘာသာသို့ ဘာသာပဌန်ပါသည်။ ထို့အပဌင်၊ Habr အပဌင်အဆင်အတလင်သ ပိုမိုကောင်သမလန်စလာဖတ်ရဟုနိုင်စေရန် ရည်ရလယ်ချက်အတလက် [Go တလင်အကဌံပဌုထာသသည့်] တက်ဘ်မျာသအစာသ ကလက်လပ်မျာသအဖဌစ် ကလက်လပ်မျာသကို ပဌုပဌင်ထာသပါသည်။ စာရင်သတစ်ခုစီပဌီသနောက် အင်္ဂလိပ်ဘာသာမဟတ်ချက်မျာသနဟင့် တဘ်မျာသကို သိမ်သဆည်သထာသသည့် GitHub တလင် မူရင်သလင့်ခ်မျာသရဟိသည်။)

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.goတလင် ကုန်ကဌမ်သ)

ကျလန်ုပ်တို့သည် အောက်ပါအတိုင်သ လုပ်ဆောင်သည်-

  1. အော်ပရေတာ၏ ပဌတ်သာသစလာရပ်စဲမဟုကိုဖဌစ်စေရန်အတလက် တိကျသောလည်ပတ်မဟုစနစ်အချက်ပဌမဟုမျာသအတလက် ကိုင်တလယ်ကိရိယာကို စီစဉ်သတ်မဟတ်ပေသပါသည်။
  2. ကျလန်တော်တို WaitGroupအပလီကေသရဟင်သကိုမပိတ်မီ gooutines အာသလုံသကို သပ်ရပ်စလာရပ်တန့်ရန်။
  3. ဖန်တီသခဌင်သဖဌင့် ကျလန်ုပ်တို့သည် အစုအဝေသသို့ ဝင်ရောက်ခလင့်ကို ပေသပါသည်။ clientset.
  4. စတင်လိုက်ပါ NamespaceControllerကျလန်ုပ်တို့၏ယုတ္တိဗေဒအာသလုံသသည် မည်သည့်အရာတလင် ရဟိနေမည်နည်သ။

ယခု ကျလန်ုပ်တို့သည် ယုတ္တိဗေဒအတလက် အခဌေခံတစ်ခု လိုအပ်ပဌီသ ကျလန်ုပ်တို့၏အခဌေအနေတလင်၊ ကအရာသည် ဖော်ပဌခဲ့သည်။ 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.goတလင် ကုန်ကဌမ်သ)

ကတလင်ကျလန်ုပ်တို့ configure SharedIndexInformer(ကက်ရဟ်တစ်ခုအသုံသပဌုခဌင်သ) သည် namespaces အပဌောင်သအလဲအတလက် ထိရောက်စလာ စောင့်မျဟော်နိုင်မည်ဖဌစ်သည်။ (ဆောင်သပါသတလင် သတင်သပေသသူမျာသအကဌောင်သ ဆက်လက်ဖတ်ရဟုပါရန်။Kubernetes အစီအစဉ်ဆလဲသူသည် အမဟန်တကယ် မည်သို့အလုပ်လုပ်သနည်သ။"- အနီသစပ်ဆုံသ ဘာသာပဌန်). အဲဒါပဌီသရင် ကျလန်တော်တို့ ချိတ်ဆက်တယ်။ EventHandler သတင်သပေသသူထံ ၊ သို့မဟသာ namespace ပေါင်သထည့်သောအခါ (Namespace) function ဟုခေါ်သည်။ createRoleBinding.

နောက်တစ်ဆင့်မဟာ ကလုပ်ဆောင်ချက်ကို သတ်မဟတ်ရန်ဖဌစ်သည်။ 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.goတလင် ကုန်ကဌမ်သ)

ကျလန်ုပ်တို့သည် namespace ကိုရယူသည်။ obj ၎င်သကို အရာဝတ္ထုတစ်ခုအဖဌစ် ပဌောင်သလဲပါ။ Namespace. ပဌီသရင် ငါတို့ သတ်မဟတ်တယ်။ RoleBindingပေသထာသသည့်အရာဝတ္ထုကို အသုံသပဌု၍ အစတလင်ဖော်ပဌထာသသော YAML ဖိုင်အပေါ်အခဌေခံသည်။ Namespace နဟင့်ဖန်တီသမဟု RoleBinding. နောက်ဆုံသတလင်၊ ဖန်တီသမဟုအောင်မဌင်သည်ဖဌစ်စေ၊

နောက်ဆုံသသတ်မဟတ်ရမယ့် function က 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.goတလင် ကုန်ကဌမ်သ)

ဒီမဟာပဌောနေတာ WaitGroupgooutine ကိုဖလင့်ပဌီသ ခေါ်ဆိုလိုက်ပါ။ namespaceInformer၊ အရင်က သတ်မဟတ်ခဲ့တာ။ ရပ်တန့်အချက်ပဌမဟုရောက်ရဟိသောအခါ, ၎င်သသည်လုပ်ဆောင်ချက်ကိုအဆုံသသတ်လိမ့်မည်, အသိပေသပါ။ WaitGroupလုပ်ဆောင်ခဌင်သမပဌုတော့ဘဲ၊ ကလုပ်ဆောင်ချက်သည် ထလက်ပါမည်။

Kubernetes အစုအဝေသတလင် ကထုတ်ပဌန်ချက်ကို တည်ဆောက်ခဌင်သနဟင့် လုပ်ဆောင်ခဌင်သဆိုင်ရာ အချက်အလက်ကို တလင် တလေ့နိုင်ပါသည်။ GitHub ရဟိ သိုလဟောင်မဟုမျာသ.

ဒါပဲ ဖန်တီသပေသတဲ့ အော်ပရေတာအတလက်ပါ။ RoleBinding ဘယ်တော့လဲ Namespace Kubernetes အစုအဝေသတလင်၊ အဆင်သင့်ဖဌစ်ပါပဌီ။

source: www.habr.com

မဟတ်ချက် Add