แฒจแแแแจแแแ. แแแ แแแแ: แแแแ แแขแแ แแแ แแ แแก แแแแฎแแแ แ แแ แแแ แแแฃแแ แฃแแ แฃแแแแแงแแคแ 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
(
แจแแฅแแแแแ แแ แแ 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() // ะะถะธะดะฐะตะผ, ััะพ ะฒัะต ะพััะฐะฝะพะฒะปะตะฝะพ
}
(
แฉแแแ แแแแแแแแ แจแแแแแแก:
- แฉแแแ แแแแแแคแแแฃแ แแ แแแ แแแแแฃแจแแแแแแแก แแแแแ แแขแฃแแ แแแแ แแชแแฃแแ แกแแกแขแแแแก แกแแแแแแแแแกแแแแก, แ แแแ แแแแแแฌแแแแก แแแแ แแขแแ แแก แแแฎแแแแแแ แจแแฌแงแแแขแ.
- แฒฉแแแ แแแงแแแแแ
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
แแฃแแแ แแแขแแก แแแแกแขแแ แจแ, แแแแแแ.
แฌแงแแ แ: www.habr.com