āĻŦāĻŋāĻāĻĻā§āĻ°āĻ. āĻ
āĻ¨ā§āĻŦāĻžāĻĻ: āĻ
āĻĒāĻžāĻ°ā§āĻāĻ° āĻšāĻ˛ 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
(
āĻāĻ°āĻāĻŽ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨ RoleBinding
āĻāĻĒāĻ¨āĻŋ āĻāĻāĻŋ āĻŽā§āĻ¯āĻžāĻ¨ā§āĻ¯āĻŧāĻžāĻ˛āĻŋ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨, āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻŦāĻžāĻ° āĻāĻĒāĻ¨āĻŋ āĻāĻāĻļā§āĻ° āĻŦā§āĻļāĻŋ āĻ¨āĻžāĻŽāĻ¸ā§āĻĨāĻžāĻ¨ āĻĒā§āĻ¯āĻŧā§ āĻā§āĻ˛ā§, āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻā§āĻ˛āĻžāĻ¨ā§āĻ¤āĻŋāĻāĻ° āĻāĻžāĻ āĻšāĻ¯āĻŧā§ āĻ¯āĻžāĻ¯āĻŧāĨ¤ āĻāĻāĻžāĻ¨ā§āĻ Kubernetes āĻ
āĻĒāĻžāĻ°ā§āĻāĻ°āĻĻā§āĻ° āĻāĻžāĻā§ āĻāĻ¸ā§ - āĻ¤āĻžāĻ°āĻž āĻāĻĒāĻ¨āĻžāĻā§ āĻ¸āĻŽā§āĻĒāĻĻā§āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§āĻ° āĻāĻĒāĻ° āĻāĻŋāĻ¤ā§āĻ¤āĻŋ āĻāĻ°ā§ Kubernetes āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨āĻā§āĻ˛āĻŋ āĻ¸ā§āĻŦāĻ¯āĻŧāĻāĻā§āĻ°āĻŋāĻ¯āĻŧāĻāĻžāĻŦā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻĻā§āĻ¯āĻŧāĨ¤ āĻāĻŽāĻžāĻĻā§āĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻāĻŽāĻ°āĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻāĻžāĻ RoleBinding
āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ Namespace
.
āĻĒā§āĻ°āĻĨāĻŽāĻ¤, āĻĢāĻžāĻāĻļāĻ¨āĻāĻŋ āĻ¸āĻāĻā§āĻāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻāĻ°āĻž āĻ¯āĻžāĻ main
, āĻ¯āĻž āĻ¸ā§āĻā§āĻāĻŽā§āĻ¨ā§āĻ āĻāĻžāĻ˛āĻžāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻ¸ā§āĻāĻāĻĒ āĻāĻ°ā§ āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻĒāĻ° āĻ¸ā§āĻā§āĻāĻŽā§āĻ¨ā§āĻ āĻ
ā§āĻ¯āĻžāĻāĻļāĻ¨ āĻāĻšā§āĻŦāĻžāĻ¨ āĻāĻ°ā§:
(āĻŦāĻŋāĻāĻĻā§āĻ°āĻ. āĻ āĻ¨ā§āĻŦāĻžāĻĻ: āĻāĻ°āĻĒāĻ°ā§, āĻā§āĻĄā§āĻ° āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻ°āĻžāĻļāĻŋāĻ¯āĻŧāĻžāĻ¨ āĻāĻžāĻˇāĻžāĻ¯āĻŧ āĻ āĻ¨ā§āĻŦāĻžāĻĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤ āĻāĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° 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() // ĐĐļидаĐĩĐŧ, ŅŅĐž вŅĐĩ ĐžŅŅĐ°ĐŊОвĐģĐĩĐŊĐž
}
(
āĻāĻŽāĻ°āĻž āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻāĻ°āĻŋ:
- āĻāĻŽāĻ°āĻž āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻ āĻ āĻĒāĻžāĻ°ā§āĻāĻŋāĻ āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽ āĻ¸āĻŋāĻāĻ¨ā§āĻ¯āĻžāĻ˛ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ° āĻ¸ā§āĻ āĻāĻĒ āĻāĻ°āĻŋ āĻ¯āĻžāĻ¤ā§ āĻ āĻĒāĻžāĻ°ā§āĻāĻ°āĻā§ āĻ¸ā§āĻ¨ā§āĻĻāĻ°āĻāĻžāĻŦā§ āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
- āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°
WaitGroup
āĻāĻŦā§āĻĻāĻ¨ āĻļā§āĻˇ āĻšāĻāĻ¯āĻŧāĻžāĻ° āĻāĻā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻ°āĻāĻāĻŋāĻ¨āĻā§āĻ˛āĻŋ āĻāĻ°ā§āĻŖāĻāĻžāĻŦā§ āĻŦāĻ¨ā§āĻ§ āĻāĻ°āĻ¤ā§āĨ¤ - āĻāĻŽāĻ°āĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§ āĻā§āĻ˛āĻžāĻ¸ā§āĻāĻžāĻ° āĻ
ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸ āĻĒā§āĻ°āĻĻāĻžāĻ¨
clientset
. - āĻāĻžāĻ˛āĻžāĻ¨
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
}
(
āĻāĻāĻžāĻ¨ā§ āĻāĻŽāĻ°āĻž āĻ¸ā§āĻ āĻāĻ°āĻāĻŋ 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))
}
}
(
āĻāĻŽāĻ°āĻž āĻ¨āĻžāĻŽāĻ¸ā§āĻĨāĻžāĻ¨ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻĒā§āĻ¤ā§ 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
}
(
āĻāĻāĻžāĻ¨ā§ āĻāĻŽāĻ°āĻž āĻāĻĨāĻž āĻŦāĻ˛āĻāĻŋ WaitGroup
āĻ¯ā§ āĻāĻŽāĻ°āĻž āĻā§āĻ°ā§āĻāĻŋāĻ¨ āĻļā§āĻ°ā§ āĻāĻ°āĻŋ āĻāĻŦāĻ āĻ¤āĻžāĻ°āĻĒāĻ° āĻāĻ˛ āĻāĻ°āĻŋ namespaceInformer
āĻ¯āĻž āĻĒā§āĻ°ā§āĻŦā§ āĻ¸āĻāĻā§āĻāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤ āĻ¯āĻāĻ¨ āĻāĻāĻāĻŋ āĻ¸ā§āĻāĻĒ āĻ¸āĻŋāĻāĻ¨ā§āĻ¯āĻžāĻ˛ āĻāĻ¸ā§, āĻāĻāĻŋ āĻĢāĻžāĻāĻļāĻ¨āĻāĻŋ āĻļā§āĻˇ āĻāĻ°āĻŦā§, āĻāĻžāĻ¨āĻŋāĻ¯āĻŧā§ āĻĻā§āĻŦā§ WaitGroup
, āĻ¯āĻž āĻāĻ° āĻāĻžāĻ°ā§āĻ¯āĻāĻ° āĻšāĻā§āĻā§ āĻ¨āĻž āĻāĻŦāĻ āĻāĻ āĻĢāĻžāĻāĻļāĻ¨āĻāĻŋ āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻāĻ°āĻŦā§āĨ¤
āĻāĻāĻāĻŋ Kubernetes āĻā§āĻ˛āĻžāĻ¸ā§āĻāĻžāĻ°ā§ āĻāĻ āĻŦāĻŋāĻŦā§āĻ¤āĻŋāĻāĻŋ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖ āĻāĻŦāĻ āĻāĻžāĻ˛āĻžāĻ¨ā§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻ¤āĻĨā§āĻ¯ āĻāĻāĻžāĻ¨ā§ āĻĒāĻžāĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§
āĻāĻ āĻŦāĻŋāĻŦā§āĻ¤āĻŋāĻ¤ā§, āĻ¯āĻž āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§ RoleBinding
āĻāĻāĻ¨ Namespace
āĻāĻāĻāĻŋ Kubernetes āĻā§āĻ˛āĻžāĻ¸ā§āĻāĻžāĻ°ā§, āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤āĨ¤
āĻāĻ¤ā§āĻ¸: www.habr.com