เจ—เฉ‹เจฒเฉฐเจ— เจตเจฟเฉฑเจš เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ เจ‡เฉฑเจ• เจ†เจชเจฐเฉ‡เจŸเจฐ เจฒเจฟเจ–เจฃเจพ

เจจเฉ‹เจŸ เจ•เจฐเฉ‹เฅค เจ…เจจเฉเจตเจพเจฆ: เจ†เจชเจฐเฉ‡เจŸเจฐ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ เจธเจนเจพเจ‡เจ• เจธเจพเจซเจŸเจตเฉ‡เจ…เจฐ เจนเจจ, เจœเฉ‹ เจ•เจฟ เจ•เฉเจ เจ˜เจŸเจจเจพเจตเจพเจ‚ เจตเจพเจชเจฐเจจ 'เจคเฉ‡ เจ•เจฒเฉฑเจธเจŸเจฐ เจตเจธเจคเฉ‚เจ†เจ‚ 'เจคเฉ‡ เจฐเฉเจŸเฉ€เจจ เจ•เจพเจฐเจตเจพเจˆเจ†เจ‚ เจจเฉ‚เฉฐ เจธเจตเฉˆเจšเจฒเจฟเจค เจ•เจฐเจจ เจฒเจˆ เจคเจฟเจ†เจฐ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจตเจฟเจš เจ†เจชเจฐเฉ‡เจŸเจฐเจพเจ‚ เจฌเจพเจฐเฉ‡ เจ…เจธเฉ€เจ‚ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจฒเจฟเจ–เจฟเจ† เจนเฉˆ เจ‡เจธ เจฒเฉ‡เจ–, เจœเจฟเฉฑเจฅเฉ‡ เจ‰เจจเฉเจนเจพเจ‚ เจจเฉ‡ เจ†เจชเจฃเฉ‡ เจ•เฉฐเจฎ เจฆเฉ‡ เจฌเฉเจจเจฟเจ†เจฆเฉ€ เจตเจฟเจšเจพเจฐเจพเจ‚ เจ…เจคเฉ‡ เจธเจฟเจงเจพเจ‚เจคเจพเจ‚ เจฌเจพเจฐเฉ‡ เจ—เฉฑเจฒ เจ•เฉ€เจคเฉ€เฅค เจชเจฐ เจœเฉ‡เจ•เจฐ เจ‰เจน เจธเจฎเฉฑเจ—เจฐเฉ€ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจฒเจˆ เจคเจฟเจ†เจฐ-เจ•เฉ€เจคเฉ‡ เจญเจพเจ—เจพเจ‚ เจฆเฉ‡ เจธเฉฐเจšเจพเจฒเจจ เจฆเฉ‡ เจชเฉฑเจ– เจคเฉ‹เจ‚ เจตเจงเฉ‡เจฐเฉ‡ เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจธเฉ€, เจคเจพเจ‚ เจนเฉเจฃ เจชเฉเจฐเจธเจคเจพเจตเจฟเจค เจจเจตเฉ‡เจ‚ เจฒเฉ‡เจ– เจฆเจพ เจ…เจจเฉเจตเจพเจฆ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจ‡เฉฑเจ• เจจเจตเฉ‡เจ‚ เจ†เจชเจฐเฉ‡เจŸเจฐ เจฆเฉ‡ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเฉเจ†เจฐเจพ เจ‰เจฒเจเฉ‡ เจนเฉ‹เจ เจ‡เฉฑเจ• เจกเจฟเจตเฉˆเจฒเจชเจฐ/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

(rolebinding.yaml, เจตเจฟเจš เจ•เฉฑเจšเจพ)

เจ‡เฉฑเจ• เจฌเจฃเจพเจ“ RoleBinding เจคเฉเจธเฉ€เจ‚ เจ‡เจธเจจเฉ‚เฉฐ เจนเฉฑเจฅเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเฉ‡ เจนเฉ‹, เจชเจฐ เจธเฉŒ เจจเจพเจฎ-เจธเจฅเจพเจจเจพเจ‚ เจฆเฉ‡ เจจเจฟเจธเจผเจพเจจ เจจเฉ‚เฉฐ เจชเจพเจฐ เจ•เจฐเจจ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ, เจ‡เจน เจ‡เฉฑเจ• เจ”เจ–เจพ เจ•เฉฐเจฎ เจฌเจฃ เจœเจพเจ‚เจฆเจพ เจนเฉˆ. เจ‡เจน เจ‰เจน เจฅเจพเจ‚ เจนเฉˆ เจœเจฟเฉฑเจฅเฉ‡ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจ“เจชเจฐเฉ‡เจŸเจฐ เจ•เฉฐเจฎ เจ†เจ‰เจ‚เจฆเฉ‡ เจนเจจโ€”เจ‰เจน เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเจฐเฉ‹เจคเจพเจ‚ เจตเจฟเฉฑเจš เจคเจฌเจฆเฉ€เจฒเฉ€เจ†เจ‚ เจฆเฉ‡ เจ…เจงเจพเจฐ 'เจคเฉ‡ เจ•เฉเจฌเจฐเจจเฉ‡เจŸเจธ เจธเจฐเฉ‹เจคเจพเจ‚ เจฆเฉ€ เจฐเจšเจจเจพ เจจเฉ‚เฉฐ เจธเจตเฉˆเจšเจพเจฒเจค เจ•เจฐเจจ เจฆเฉ€ เจ†เจ—เจฟเจ† เจฆเจฟเฉฐเจฆเฉ‡ เจนเจจเฅค เจธเจพเจกเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ เจฌเจฃเจพเจ‰เจฃเจพ เจšเจพเจนเฉเฉฐเจฆเฉ‡ เจนเจพเจ‚ RoleBinding เจฌเจฃเจพเจ‰เจฃ เจตเฉ‡เจฒเฉ‡ Namespace.

เจธเจญ เจคเฉ‹เจ‚ เจชเจนเจฟเจฒเจพเจ‚, เจ†เจ“ เจซเฉฐเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจชเจฐเจฟเจญเจพเจธเจผเจฟเจค เจ•เจฐเฉ€เจ mainเจœเฉ‹ เจธเจŸเฉ‡เจŸเจฎเฉˆเจ‚เจŸ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฒเจˆ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเจพ เจธเฉˆเฉฑเจŸเจ…เฉฑเจช เจ•เจฐเจฆเจพ เจนเฉˆ เจ…เจคเฉ‡ เจซเจฟเจฐ เจธเจŸเฉ‡เจŸเจฎเฉˆเจ‚เจŸ เจเจ•เจธเจผเจจ เจจเฉ‚เฉฐ เจ•เจพเจฒ เจ•เจฐเจฆเจพ เจนเฉˆ:

(เจจเฉ‹เจŸ เจ•เจฐเฉ‹เฅค เจ…เจจเฉเจตเจพเจฆ: เจ‡เฉฑเจฅเฉ‡ เจ…เจคเฉ‡ เจนเฉ‡เจ เจพเจ‚ เจ•เฉ‹เจก เจตเจฟเฉฑเจš เจŸเจฟเฉฑเจชเจฃเฉ€เจ†เจ‚ เจฆเจพ เจฐเฉ‚เจธเฉ€ เจตเจฟเฉฑเจš เจ…เจจเฉเจตเจพเจฆ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจ‡เจธ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, เจธเจฟเจฐเจซเจผ เจนเฉˆเจฌเจฐ เจฒเฉ‡เจ†เจ‰เจŸ เจฆเฉ‡ เจ…เฉฐเจฆเจฐ เจฌเจฟเจนเจคเจฐ เจชเฉœเฉเจนเจจเจฏเฉ‹เจ—เจคเจพ เจฆเฉ‡ เจ‰เจฆเฉ‡เจธเจผ เจฒเจˆ [เจ—เฉ‹ เจตเจฟเฉฑเจš เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจ•เฉ€เจคเฉ€] เจŸเฉˆเจฌเจพเจ‚ เจฆเฉ€ เจฌเจœเจพเจ เจ‡เฉฐเจกเฉˆเจ‚เจŸเฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจธเจชเฉ‡เจธ เจตเจฟเฉฑเจš เจ เฉ€เจ• เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆเฅค เจนเจฐเฉ‡เจ• เจธเฉ‚เจšเฉ€ เจฆเฉ‡ เจฌเจพเจ…เจฆ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹