เด—เต‹เดฒเดพเด™เตเด™เดฟเดฒเต† เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเดฟเดจเดพเดฏเดฟ เด’เดฐเต เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผ เดŽเดดเตเดคเตเดจเตเดจเต

เด•เตเดฑเดฟเดชเตเดชเต. เดตเดฟเดตเตผเดคเตเดคเดจเด‚.: เดšเดฟเดฒ เด‡เดตเดจเตเดฑเตเด•เตพ เดธเด‚เดญเดตเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด•เตเดฒเดธเตเดฑเตเดฑเตผ เด’เดฌเตโ€Œเดœเด•เตโ€Œเดฑเตเดฑเตเด•เดณเดฟเดฒเต† เดชเดคเดฟเดตเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด™เตเด™เดณเตเดŸเต† เดจเดฟเตผเดตเตเดตเดนเดฃเด‚ เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เดฐเต‚เดชเด•เตฝเดชเตเดชเดจ เดšเต†เดฏเตโ€Œเดคเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดจเตเดฑเต† เดธเดนเดพเดฏ เดธเต‹เดซเตเดฑเตเดฑเตโ€Œเดตเต†เดฏเดฑเดพเดฃเต เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผเดฎเดพเตผ. เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผเดฎเดพเดฐเต† เด•เตเดฑเดฟเดšเตเดšเต เดžเด™เตเด™เตพ เด‡เดคเดฟเดจเด•เด‚ เดŽเดดเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต เดˆ เดฒเต‡เด–เดจเด‚, เด…เดตเดฟเดŸเต† เด…เดตเตผ เด…เดตเดฐเตเดŸเต† เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เด†เดถเดฏเด™เตเด™เดณเต†เดฏเตเด‚ เดคเดคเตเดตเด™เตเด™เดณเต†เดฏเตเด‚ เด•เตเดฑเดฟเดšเตเดšเต เดธเด‚เดธเดพเดฐเดฟเดšเตเดšเต. เดŽเดจเตเดจเดพเตฝ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเดฟเดจเดพเดฏเดฟ เดฑเต†เดกเดฟเดฎเต†เดฏเตเดกเต เด˜เดŸเด•เด™เตเด™เตพ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดฑเต† เดตเดถเดคเตเดคเต เดจเดฟเดจเตเดจเตเดณเตเดณ เด•เดพเดดเตเดšเดฏเดพเดฃเต เด† เดฎเต†เดฑเตเดฑเต€เดฐเดฟเดฏเดฒเต†เด™เตเด•เดฟเตฝ, เด‡เดชเตเดชเต‹เตพ เดจเดฟเตผเดฆเตเดฆเต‡เดถเดฟเดšเตเดšเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เดชเตเดคเดฟเดฏ เดฒเต‡เด–เดจเดคเตเดคเดฟเดจเตเดฑเต† เดตเดฟเดตเตผเดคเตเดคเดจเด‚ เด‡เดคเดฟเดจเด•เด‚ เดคเดจเตเดจเต† เด’เดฐเต เดชเตเดคเดฟเดฏ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผ เดจเดŸเดชเตเดชเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเดคเดฟเตฝ เด†เดถเดฏเด•เตเด•เตเดดเดชเตเดชเดคเตเดคเดฟเดฒเดพเดฏ เด’เดฐเต เดกเดตเดฒเดชเตเดชเตผ/DevOps เดŽเดžเตเดšเดฟเดจเต€เดฏเดฑเตเดŸเต† เด•เดพเดดเตเดšเดชเตเดชเดพเดŸเดพเดฃเต.

เด—เต‹เดฒเดพเด™เตเด™เดฟเดฒเต† เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเดฟเดจเดพเดฏเดฟ เด’เดฐเต เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผ เดŽเดดเตเดคเตเดจเตเดจเต

เด•เตเดฌเต†เตผเดจเต†เดฑเตเดฑเดธเดฟเดจเดพเดฏเดฟ เด’เดฐเต เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเตเดณเตเดณ เดŽเดจเตเดฑเต† เดถเตเดฐเดฎเด™เตเด™เตพเด•เตเด•เต เดถเต‡เดทเด‚ เด’เดฐเต เดฏเดฅเดพเตผเดคเตเดฅ เดœเต€เดตเดฟเดค เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเต‹เดŸเต† เดˆ เดชเต‹เดธเตเดฑเตเดฑเต เดŽเดดเตเดคเดพเตป เดžเดพเตป เดคเต€เดฐเตเดฎเดพเดจเดฟเดšเตเดšเต, เด…เดคเต เด•เต‹เดกเต เดชเด เดฟเดšเตเดšเต.

เดตเดฟเดตเดฐเดฟเด•เตเด•เตเดจเตเดจ เด‰เดฆเดพเดนเดฐเดฃเด‚ เด‡เดคเดพเดฃเต: เดžเด™เตเด™เดณเตเดŸเต† เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเตฝ, เด“เดฐเต‹เดจเตเดจเตเด‚ Namespace เด’เดฐเต เดŸเต€เดฎเดฟเดจเตเดฑเต† เดธเดพเตปเดกเตโ€Œเดฌเต‹เด•เตโ€Œเดธเต เดชเดฐเดฟเดคเดธเตเดฅเดฟเดคเดฟเดฏเต† เดชเตเดฐเดคเดฟเดจเดฟเดงเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเต, เดŸเต€เดฎเตเด•เตพเด•เตเด•เต เด…เดตเดฐเตเดŸเต† เดธเตเดตเดจเตเดคเด‚ เดธเดพเตปเดกเตโ€Œเดฌเต‹เด•เตโ€Œเดธเตเด•เดณเดฟเตฝ เดฎเดพเดคเตเดฐเด‚ เด•เดณเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเตเดจเตเดจ เดคเดฐเดคเตเดคเดฟเตฝ เด…เดตเดฐเดฟเดฒเต‡เด•เตเด•เตเดณเตเดณ เด†เด•เตโ€Œเดธเดธเต เดชเดฐเดฟเดฎเดฟเดคเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เดžเด™เตเด™เตพ เด†เด—เตเดฐเดนเดฟเดšเตเดšเต.

เด’เดฐเต เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเดฟเดจเต เด‰เดณเตเดณ เด’เดฐเต เด—เตเดฐเต‚เดชเตเดชเดฟเดจเต† เดจเดฟเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดฒเต‚เดŸเต† เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณเดคเต เดจเต‡เดŸเดพเดจเดพเด•เตเด‚ 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

(เดฑเต‹เตพเดฌเตˆเตปเดกเดฟเด‚เด—เต.yamlเด…เด•เดคเตเดคเต เด…เดธเด‚เดธเตเด•เตƒเดคเดฎเดพเดฏ)

เด’เดฐเต†เดฃเตเดฃเด‚ เด‰เดฃเตเดŸเดพเด•เตเด•เตเด• RoleBinding เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเต เดธเตเดตเดฎเต‡เดงเดฏเดพ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚, เดŽเดจเตเดจเดพเตฝ เดจเต‚เดฑเต เดจเต†เดฏเดฟเด‚เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเต เด•เดŸเดจเตเดจเดคเดฟเดจเต เดถเต‡เดทเด‚, เด‡เดคเต เดฎเดŸเตเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจ เดœเต‹เดฒเดฟเดฏเดพเดฏเดฟ เดฎเดพเดฑเตเดจเตเดจเต. เด‡เดตเดฟเดŸเต†เดฏเดพเดฃเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเตเดธเต เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผเดฎเดพเตผ เด‰เดชเดฏเต‹เด—เดชเตเดฐเดฆเดฎเดพเด•เตเดจเตเดจเดคเต - เด‰เดฑเดตเดฟเดŸเด™เตเด™เดณเดฟเดฒเต† เดฎเดพเดฑเตเดฑเด™เตเด™เดณเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ เด•เตเดฌเตผเดจเต†เดฑเตเดฑเตเดธเต เด‰เดฑเดตเดฟเดŸเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจเดคเต เด“เดŸเตเดŸเต‹เดฎเต‡เดฑเตเดฑเต เดšเต†เดฏเตเดฏเดพเตป เด…เดตเตผ เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เดžเด™เตเด™เดณเตเดŸเต† เด•เดพเดฐเตเดฏเดคเตเดคเดฟเตฝ, เดžเด™เตเด™เตพ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต RoleBinding เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ Namespace.

เด’เดจเตเดจเดพเดฎเดคเดพเดฏเดฟ, เดจเดฎเตเด•เตเด•เต เดซเด‚เด—เตเดทเตป เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดพเด‚ 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เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดฎเตเดฎเตเดชเต เดŽเดฒเตเดฒเดพ เด—เต‹เดฑเต‚เดŸเตเดŸเต€เดจเตเด•เดณเตเด‚ เดฎเดจเต‹เดนเดฐเดฎเดพเดฏเดฟ เดจเดฟเตผเดคเตเดคเตเด•.
  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เด…เด•เดคเตเดคเต เด…เดธเด‚เดธเตเด•เตƒเดคเดฎเดพเดฏ)

เด‡เดตเดฟเดŸเต† เดžเด™เตเด™เตพ เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดฏเตเดจเตเดจเต SharedIndexInformer, เด‡เดคเต เดซเดฒเดคเตเดคเดฟเตฝ (เด’เดฐเต เด•เดพเดทเต† เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต) เดจเต†เดฏเดฟเด‚เดธเตโ€Œเดชเต†เดฏเตโ€Œเดธเดฟเดฒเต† เดฎเดพเดฑเตเดฑเด™เตเด™เตพเด•เตเด•เดพเดฏเดฟ เด•เดพเดคเตเดคเดฟเดฐเดฟเด•เตเด•เตเด‚ (เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดตเดฟเดตเดฐเด‚ เดจเตฝเด•เตเดจเตเดจเดตเดฐเต† เด•เตเดฑเดฟเดšเตเดšเต เด•เต‚เดŸเตเดคเตฝ เดตเดพเดฏเดฟเด•เตเด•เตเด• "เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เดทเต†เดกเตเดฏเต‚เดณเตผ เดฏเดฅเดพเตผเดคเตเดฅเดคเตเดคเดฟเตฝ เดŽเด™เตเด™เดจเต†เดฏเดพเดฃเต เดชเตเดฐเดตเตผเดคเตเดคเดฟเด•เตเด•เตเดจเตเดจเดคเต?"- เดเด•เดฆเต‡เดถเด‚. เดตเดฟเดตเตผเดคเตเดคเดจเด‚). เด‡เดคเดฟเดจเตเดถเต‡เดทเด‚ เดžเด™เตเด™เตพ เดฌเดจเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเต EventHandler เดตเดฟเดตเดฐเดฎเดฑเดฟเดฏเดฟเด•เตเด•เตเดจเตเดจเดฏเดพเตพเด•เตเด•เต, เด…เด™เตเด™เดจเต† เด’เดฐเต เดจเต†เดฏเดฟเด‚เดธเตเดชเต‡เดธเต เดšเต‡เตผเด•เตเด•เตเดฎเตเดชเต‹เตพ (Namespace) เดซเด‚เด—เตเดทเตป เดŽเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจเต 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เด…เด•เดคเตเดคเต เด…เดธเด‚เดธเตเด•เตƒเดคเดฎเดพเดฏ)

เดจเดฎเตเด•เตเด•เต เดจเต†เดฏเดฟเด‚เดธเตเดชเต‡เดธเต เด‡เดชเตเดฐเด•เดพเดฐเด‚ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเต obj เด…เดคเดฟเดจเต† เด’เดฐเต เดตเดธเตเดคเตเดตเดพเด•เตเด•เดฟ เดฎเดพเดฑเตเดฑเตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเด• Namespace. เด…เดชเตเดชเต‹เตพ เดžเด™เตเด™เตพ เดจเดฟเตผเดตเดšเดฟเด•เตเด•เตเดจเตเดจเต RoleBinding, เดจเตฝเด•เดฟเดฏเดฟเดฐเดฟเด•เตเด•เตเดจเตเดจ เด’เดฌเตเดœเด•เตเดฑเตเดฑเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดคเตเดŸเด•เตเด•เดคเตเดคเดฟเตฝ เดธเต‚เดšเดฟเดชเตเดชเดฟเดšเตเดš YAML เดซเดฏเดฒเดฟเดจเต† เด…เดŸเดฟเดธเตเดฅเดพเดจเดฎเดพเด•เตเด•เดฟ Namespace เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต RoleBinding. เด…เดตเดธเดพเดจเด‚, เดธเตƒเดทเตเดŸเดฟ เดตเดฟเดœเดฏเด•เดฐเดฎเดพเดฃเต‹ เดŽเดจเตเดจเต เดžเด™เตเด™เตพ เดฐเต‡เด–เดชเตเดชเต†เดŸเตเดคเตเดคเตเดจเตเดจเต.

เดจเดฟเตผเดตเดšเดฟเด•เตเด•เต‡เดฃเตเดŸ เด…เดตเดธเดพเดจ เดซเด‚เด—เตเดทเตป 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เด…เด•เดคเตเดคเต เด…เดธเด‚เดธเตเด•เตƒเดคเดฎเดพเดฏ)

เด‡เดตเดฟเดŸเต† เดจเดฎเตเดฎเตพ เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดจเตเดจเต WaitGroupเดžเด™เตเด™เตพ เด—เตŠเดฑเต—เดŸเตเดŸเดฟเตป เดธเดฎเดพเดฐเด‚เดญเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดคเตเดŸเตผเดจเตเดจเต เดตเดฟเดณเดฟเด•เตเด•เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต namespaceInformer, เดฎเตเดฎเตเดชเต เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดชเตเดชเต†เดŸเตเดŸเดคเต. เดธเตเดฑเตเดฑเต‹เดชเตเดชเต เดธเดฟเด—เตเดจเตฝ เดŽเดคเตเดคเตเดฎเตเดชเต‹เตพ, เด…เดคเต เดชเตเดฐเดตเตผเดคเตเดคเดจเด‚ เด…เดตเดธเดพเดจเดฟเดชเตเดชเดฟเด•เตเด•เตเด‚, เด…เดฑเดฟเดฏเดฟเด•เตเด•เตเด• WaitGroup, เด…เดคเต เด‡เดจเดฟ เดŽเด•เตเดธเดฟเด•เตเดฏเต‚เดŸเตเดŸเต เดšเต†เดฏเตเดฏเดฟเดฒเตเดฒ, เดˆ เดซเด‚เด—เตเดทเตป เดชเตเดฑเดคเตเดคเตเด•เดŸเด•เตเด•เตเด‚.

เด’เดฐเต เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเตฝ เดˆ เดชเตเดฐเดธเตเดคเดพเดตเดจ เดจเดฟเตผเดฎเตเดฎเดฟเด•เตเด•เตเดจเตเดจเดคเตเด‚ เดชเตเดฐเดตเตผเดคเตเดคเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเตเด‚ เดธเด‚เดฌเดจเตเดงเดฟเดšเตเดš เดตเดฟเดตเดฐเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดพเดจเดพเด•เตเด‚ GitHub-เดฒเต† เดฑเดฟเดชเตเดชเต‹เดธเดฟเดฑเตเดฑเดฑเดฟเด•เตพ.

เด…เดคเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเดจเตเดจ เด“เดชเตเดชเดฑเต‡เดฑเตเดฑเตผเด•เตเด•เตเดณเตเดณเดคเดพเดฃเต RoleBinding เดŽเดชเตเดชเต‡เดพเตพ Namespace เด•เตเดฌเตผเดจเต†เดฑเตเดฑเดธเต เด•เตเดฒเดธเตเดฑเตเดฑเดฑเดฟเตฝ, เดคเดฏเตเดฏเดพเดฑเดพเดฃเต.

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•