Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ แƒ’แƒแƒšแƒแƒœแƒ’แƒจแƒ˜

แฒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ. แƒ—แƒแƒ แƒ’แƒ›แƒœแƒ: แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜ แƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒฎแƒ›แƒแƒ แƒ” แƒžแƒ แƒแƒ’แƒ แƒแƒ›แƒฃแƒšแƒ˜ แƒฃแƒ–แƒ แƒฃแƒœแƒ•แƒ”แƒšแƒงแƒแƒคแƒ Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒšแƒ˜แƒ แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒฃแƒš แƒแƒ‘แƒ˜แƒ”แƒฅแƒขแƒ”แƒ‘แƒ–แƒ” แƒ แƒฃแƒขแƒ˜แƒœแƒฃแƒšแƒ˜ แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒแƒชแƒ˜แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒฎแƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒ แƒ™แƒ•แƒ”แƒฃแƒšแƒ˜ แƒ›แƒแƒ•แƒšแƒ”แƒœแƒ”แƒ‘แƒ˜. แƒฉแƒ•แƒ”แƒœ แƒฃแƒ™แƒ•แƒ” แƒ“แƒแƒ•แƒฌแƒ”แƒ แƒ”แƒ— แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ”แƒก แƒ›แƒฃแƒฎแƒšแƒ˜, แƒกแƒแƒ“แƒแƒช แƒ˜แƒกแƒแƒฃแƒ‘แƒ แƒ”แƒก แƒ—แƒแƒ•แƒ˜แƒแƒœแƒ—แƒ˜ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒคแƒฃแƒœแƒ“แƒแƒ›แƒ”แƒœแƒขแƒฃแƒ  แƒ˜แƒ“แƒ”แƒ”แƒ‘แƒกแƒ แƒ“แƒ แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒ”แƒ‘แƒ–แƒ”. แƒ›แƒแƒ’แƒ แƒแƒ› แƒ—แƒฃ แƒ”แƒก แƒ›แƒแƒกแƒแƒšแƒ แƒฃแƒคแƒ แƒ แƒ›แƒ”แƒขแƒแƒ“ แƒฉแƒแƒœแƒ“แƒ Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ›แƒ–แƒ แƒ™แƒแƒ›แƒžแƒแƒœแƒ”แƒœแƒขแƒ”แƒ‘แƒ˜แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒœแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒก แƒ›แƒฎแƒ แƒ˜แƒ•, แƒ›แƒแƒจแƒ˜แƒœ แƒแƒฎแƒšแƒ แƒจแƒ”แƒ›แƒแƒ—แƒแƒ•แƒแƒ–แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒแƒฎแƒแƒšแƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ˜แƒก แƒ—แƒแƒ แƒ’แƒ›แƒแƒœแƒ˜ แƒฃแƒ™แƒ•แƒ” แƒแƒ แƒ˜แƒก แƒ“แƒ”แƒ•แƒ”แƒšแƒแƒžแƒ”แƒ แƒ˜/DevOps แƒ˜แƒœแƒŸแƒ˜แƒœแƒ แƒ˜แƒก แƒฎแƒ”แƒ“แƒ•แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ™แƒ•แƒ˜แƒ แƒ•แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒแƒฎแƒแƒšแƒ˜ แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒ’แƒแƒœแƒฎแƒแƒ แƒชแƒ˜แƒ”แƒšแƒ”แƒ‘แƒ˜แƒ—.

Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒฌแƒ”แƒ แƒ แƒ’แƒแƒšแƒแƒœแƒ’แƒจแƒ˜

แƒ’แƒแƒ“แƒแƒ•แƒฌแƒงแƒ•แƒ˜แƒขแƒ” แƒ“แƒแƒ›แƒ”แƒฌแƒ”แƒ แƒ แƒ”แƒก แƒžแƒแƒกแƒขแƒ˜ แƒ แƒ”แƒแƒšแƒฃแƒ แƒ˜ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜แƒ— แƒ›แƒแƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒช แƒ›แƒชแƒ“แƒ”แƒšแƒแƒ‘แƒ แƒ›แƒ”แƒžแƒแƒ•แƒ Kubernetes-แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ แƒ“แƒแƒ™แƒฃแƒ›แƒ”แƒœแƒขแƒแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ’แƒแƒ˜แƒแƒ แƒ แƒ™แƒแƒ“แƒ˜แƒก แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒแƒ–แƒ”.

แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒแƒฆแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒแƒกแƒ”แƒ—แƒ˜แƒ: แƒฉแƒ•แƒ”แƒœแƒก Kubernetes แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒจแƒ˜, แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ 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

(แƒ แƒแƒšแƒ˜แƒก แƒจแƒ”แƒ™แƒ•แƒ แƒ.yamlIn แƒœแƒ”แƒ“แƒšแƒ”แƒฃแƒšแƒ˜)

แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒ”แƒ แƒ—แƒ˜ RoleBinding แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒแƒ›แƒ˜แƒก แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ แƒฎแƒ”แƒšแƒ˜แƒ—, แƒ›แƒแƒ’แƒ แƒแƒ› แƒแƒกแƒ˜ แƒกแƒแƒฎแƒ”แƒšแƒ”แƒ‘แƒ˜แƒก แƒœแƒ˜แƒจแƒœแƒ˜แƒก แƒ’แƒแƒ“แƒแƒ™แƒ•แƒ”แƒ—แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ”แƒก แƒฎแƒ“แƒ”แƒ‘แƒ แƒ“แƒแƒ›แƒฆแƒšแƒ”แƒšแƒ˜ แƒแƒ›แƒแƒชแƒแƒœแƒ. แƒกแƒฌแƒแƒ แƒ”แƒ“ แƒแƒฅ แƒ’แƒแƒ›แƒแƒ“แƒ’แƒ”แƒ‘แƒ Kubernetes-แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ”แƒ‘แƒ˜ - แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒกแƒแƒจแƒฃแƒแƒšแƒ”แƒ‘แƒแƒก แƒ’แƒแƒซแƒšแƒ”แƒ•แƒ— แƒแƒ•แƒขแƒแƒ›แƒแƒขแƒ˜แƒ–แƒ˜แƒ แƒ“แƒ”แƒ— Kubernetes แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒจแƒ˜ แƒชแƒ•แƒšแƒ˜แƒšแƒ”แƒ‘แƒ”แƒ‘แƒ˜แƒก แƒกแƒแƒคแƒฃแƒซแƒ•แƒ”แƒšแƒ–แƒ”. แƒฉแƒ•แƒ”แƒœแƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒ˜แƒœแƒ“แƒ แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— RoleBinding แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒกแƒแƒก Namespace.

แƒžแƒ˜แƒ แƒ•แƒ”แƒš แƒ แƒ˜แƒ’แƒจแƒ˜ แƒ’แƒแƒœแƒ•แƒกแƒแƒ–แƒฆแƒ•แƒ แƒแƒ— แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ mainแƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒก แƒกแƒแƒญแƒ˜แƒ แƒ แƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒแƒชแƒ˜แƒแƒก แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒกแƒแƒจแƒ•แƒ”แƒ‘แƒแƒ“ แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒฃแƒฌแƒแƒ“แƒ”แƒ‘แƒก แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ›แƒแƒฅแƒ›แƒ”แƒ“แƒ”แƒ‘แƒแƒก:

(แฒจแƒ”แƒœแƒ˜แƒจแƒ•แƒœแƒ. แƒ—แƒแƒ แƒ’แƒ›แƒœแƒ: แƒแƒฅ แƒ“แƒ แƒฅแƒ•แƒ”แƒ›แƒแƒ— แƒ™แƒแƒ“แƒ˜แƒก แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒ˜ แƒ—แƒแƒ แƒ’แƒ›แƒœแƒ˜แƒšแƒ˜แƒ แƒ แƒฃแƒกแƒฃแƒšแƒแƒ“. แƒ’แƒแƒ แƒ“แƒ แƒแƒ›แƒ˜แƒกแƒ, แƒฉแƒแƒฆแƒ แƒ›แƒแƒ•แƒ”แƒ‘แƒ แƒจแƒ”แƒกแƒฌแƒแƒ แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ แƒ˜แƒœแƒขแƒ”แƒ แƒ•แƒแƒšแƒ˜แƒ—, แƒœแƒแƒชแƒ•แƒšแƒแƒ“ [แƒ แƒ”แƒ™แƒแƒ›แƒ”แƒœแƒ“แƒ”แƒ‘แƒฃแƒšแƒ˜แƒ Go] แƒฉแƒแƒœแƒแƒ แƒ—แƒ”แƒ‘แƒ˜แƒก แƒœแƒแƒชแƒ•แƒšแƒแƒ“, แƒ›แƒฎแƒแƒšแƒแƒ“ Habr แƒ’แƒแƒœแƒšแƒแƒ’แƒ”แƒ‘แƒ˜แƒก แƒฃแƒ™แƒ”แƒ— แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒก แƒ›แƒ˜แƒ–แƒœแƒ˜แƒ—. แƒงแƒแƒ•แƒ”แƒšแƒ˜ แƒฉแƒแƒ›แƒแƒœแƒแƒ—แƒ•แƒแƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒแƒ แƒ˜แƒก แƒแƒ แƒ˜แƒ’แƒ˜แƒœแƒแƒšแƒ˜แƒก แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜ 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()   // ะžะถะธะดะฐะตะผ, ั‡ั‚ะพ ะฒัะต ะพัั‚ะฐะฝะพะฒะปะตะฝะพ
}

(แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜.แƒฌแƒแƒ“แƒ˜In แƒœแƒ”แƒ“แƒšแƒ”แƒฃแƒšแƒ˜)

แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ— แƒจแƒ”แƒ›แƒ“แƒ”แƒ’แƒก:

  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
}

(แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ แƒ˜.แƒฌแƒแƒ“แƒ˜In แƒœแƒ”แƒ“แƒšแƒ”แƒฃแƒšแƒ˜)

แƒแƒฅ แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ™แƒแƒœแƒคแƒ˜แƒ’แƒฃแƒ แƒ˜แƒ แƒ”แƒ‘แƒ— 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))
  }
}

(แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ แƒ˜.แƒฌแƒแƒ“แƒ˜In แƒœแƒ”แƒ“แƒšแƒ”แƒฃแƒšแƒ˜)

แƒฉแƒ•แƒ”แƒœ แƒ•แƒ˜แƒฆแƒ”แƒ‘แƒ— แƒกแƒแƒฎแƒ”แƒšแƒ—แƒ แƒกแƒ˜แƒ•แƒ แƒชแƒ”แƒก แƒ แƒแƒ’แƒแƒ แƒช 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
}

(แƒ™แƒแƒœแƒขแƒ แƒแƒšแƒ”แƒ แƒ˜.แƒฌแƒแƒ“แƒ˜In แƒœแƒ”แƒ“แƒšแƒ”แƒฃแƒšแƒ˜)

แƒแƒฅ แƒ•แƒกแƒแƒฃแƒ‘แƒ แƒแƒ‘แƒ— WaitGroupแƒ แƒแƒ› แƒ’แƒแƒ•แƒฃแƒจแƒ•แƒแƒ— แƒ’แƒแƒ แƒฃแƒขแƒ˜แƒœแƒ˜ แƒ“แƒ แƒ›แƒ”แƒ แƒ” แƒ“แƒแƒ•แƒฃแƒ แƒ”แƒ™แƒแƒ— namespaceInformer, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒ“แƒ แƒ” แƒ˜แƒงแƒ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜. แƒ แƒแƒ“แƒ”แƒกแƒแƒช แƒ’แƒแƒฉแƒ”แƒ แƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ’แƒœแƒแƒšแƒ˜ แƒ›แƒแƒ•แƒ, แƒ˜แƒก แƒ“แƒแƒแƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒแƒก, แƒแƒชแƒœแƒแƒ‘แƒ”แƒ— WaitGroup, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒแƒฆแƒแƒ  แƒแƒ แƒ˜แƒก แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ“แƒ แƒ”แƒก แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ แƒ’แƒแƒ›แƒแƒ•แƒ.

แƒ˜แƒœแƒคแƒแƒ แƒ›แƒแƒชแƒ˜แƒ แƒแƒ› แƒ’แƒแƒœแƒชแƒฎแƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ˜แƒกแƒ แƒ“แƒ แƒ’แƒแƒจแƒ•แƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒกแƒแƒฎแƒ”แƒ‘ Kubernetes แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒ–แƒ” แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ˜แƒฎแƒ˜แƒšแƒแƒ— แƒแƒฅ แƒกแƒแƒชแƒแƒ•แƒ˜ GitHub-แƒ–แƒ”.

แƒ”แƒก แƒแƒ แƒ˜แƒก แƒ˜แƒก แƒแƒžแƒ”แƒ แƒแƒขแƒแƒ แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฅแƒ›แƒœแƒ˜แƒก RoleBinding แƒ แƒแƒ“แƒ”แƒกแƒแƒช Namespace แƒ™แƒฃแƒ‘แƒ”แƒ แƒœแƒ”แƒขแƒ˜แƒก แƒ™แƒšแƒแƒกแƒขแƒ”แƒ แƒจแƒ˜, แƒ›แƒ–แƒแƒ“แƒแƒ.

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ