เชจเซเซ
เชง. เช
เชจเซเชตเชพเชฆ: เชเชชเชฐเซเชเชฐเซเชธ เช เชเซเชฌเชฐเชจเซเชเซเชธ เชฎเชพเชเซ เชธเชนเชพเชฏเช เชธเซเชซเซเชเชตเซเชฐ เชเซ, เชเซเชฏเชพเชฐเซ เช
เชฎเซเช เชเชเชจเชพเช เชฌเชจเซ เชคเซเชฏเชพเชฐเซ เชเซเชฒเชธเซเชเชฐ เชเชฌเซเชเซเชเซเชเซเชธ เชชเชฐ เชจเชฟเชฏเชฎเชฟเชค เชเซเชฐเชฟเชฏเชพเชเชจเชพ เช
เชฎเชฒเชจเซ เชธเซเชตเชเชพเชฒเชฟเชค เชเชฐเชตเชพ เชฎเชพเชเซ เชฐเชเชพเชฏเซเชฒ เชเซ. เชฎเชพเช เชเชชเชฐเซเชเชฐเซ เชตเชฟเชถเซ เช
เชฎเซ เชชเชนเซเชฒเซเชฅเซ เช เชฒเชเซเชฏเซเช เชเซ
เชเซเชฌเชฐเชจเซเชเซเชธ เชฎเชพเชเซ เชเชชเชฐเซเชเชฐ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเซเชจเชพ เชฆเชธเซเชคเชพเชตเซเชเซ เชถเซเชงเชตเชพเชจเชพ เชฎเชพเชฐเชพ เชชเซเชฐเชฏเชพเชธเซ เชชเชเซ เชฎเซเช เช เชชเซเชธเซเชเชจเซ เชตเชพเชธเซเชคเชตเชฟเช เชเซเชตเชจเชจเชพ เชเชฆเชพเชนเชฐเชฃ เชธเชพเชฅเซ เชฒเชเชตเชพเชจเซเช เชจเชเซเชเซ เชเชฐเซเชฏเซเช, เชเซ เชเซเชกเชจเซ เช
เชญเซเชฏเชพเชธ เชเชฐเชตเชพเชฎเชพเช เชเชตเซเชฏเซ เชนเชคเซ.
เชเซ เชเชฆเชพเชนเชฐเชฃเชจเซเช เชตเชฐเซเชฃเชจ เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ เชคเซ เช เชเซ: เช
เชฎเชพเชฐเชพ เชเซเชฌเชฐเชจเซเชเซเชธ เชเซเชฒเชธเซเชเชฐเชฎเชพเช, เชฆเชฐเซเช 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
เชคเชฎเซ เชคเซ เชเชพเชคเซ เชเชฐเซ เชถเชเซ เชเซ, เชชเชฐเชเชคเซ เชธเซ เชจเซเชฎเชธเซเชชเซเชธ เชเชฟเชนเซเชจเชจเซ เชชเชพเชฐ เชเชฐเซเชฏเชพ เชชเชเซ, เชคเซ เชเช เชเชเชเชพเชณเชพเชเชจเช เชเชพเชฐเซเชฏ เชฌเชจเซ เชเชพเชฏ เชเซ. เช เชคเซ เชเซ เชเซเชฏเชพเช เชเซเชฌเชฐเชจเซเชเซเชธ เชเชชเชฐเซเชเชฐเซ เชเชพเชฎเชฎเชพเช เชเชตเซ เชเซ-เชคเซเช เชคเชฎเชจเซ เชธเชเชธเชพเชงเชจเซเชฎเชพเช เชซเซเชฐเชซเชพเชฐเชจเชพ เชเชงเชพเชฐเซ เชเซเชฌเชฐเชจเซเชเซเชธ เชธเชเชธเชพเชงเชจเซเชจเซ เชฐเชเชจเชพเชจเซ เชธเซเชตเชเชพเชฒเชฟเชค เชเชฐเชตเชพเชจเซ เชฎเชเชเซเชฐเซ เชเชชเซ เชเซ. เช
เชฎเชพเชฐเชพ เชเชฟเชธเซเชธเชพเชฎเชพเช เช
เชฎเซ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชเชเซเช เชเซเช 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() // ะะถะธะดะฐะตะผ, ััะพ ะฒัะต ะพััะฐะฝะพะฒะปะตะฝะพ
}
(
เช เชฎเซ เชจเซเชเซ เชฎเซเชเชฌ เชเชฐเซเช เชเซเช:
- เชเชชเชฐเซเชเชฐเชจเซ เชเชเชฐเซเชทเช เชธเชฎเชพเชชเซเชคเชฟเชจเซเช เชเชพเชฐเชฃ เชฌเชจเซ เชคเซ เชฎเชพเชเซ เช เชฎเซ เชเซเชเซเชเชธ เชเชชเชฐเซเชเชฟเชเช เชธเชฟเชธเซเชเชฎ เชธเชฟเชเซเชจเชฒเซ เชฎเชพเชเซ เชนเซเชจเซเชกเชฒเชฐเชจเซ เชเซเช เชตเซเช เชเซเช.
- เช
เชฎเซ เชเชชเชฏเซเช เชเชฐเซเช เชเซเช
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
, เชเซ เชฒเชพเชเชฌเชพ เชธเชฎเชฏ เชธเซเชงเซ เชเชเซเชเชฟเชเซเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ เชจเชนเซเช, เช
เชจเซ เช เชซเชเชเซเชถเชจ เชฌเชนเชพเชฐ เชจเซเชเชณเซ เชเชถเซ.
เชเซเชฌเชฐเชจเซเชเซเชธ เชเซเชฒเชธเซเชเชฐ เชชเชฐ เช เชจเชฟเชตเซเชฆเชจ เชฌเชจเชพเชตเชตเชพ เช
เชจเซ เชเชฒเชพเชตเชตเชพ เชตเชฟเชถเซเชจเซ เชฎเชพเชนเชฟเชคเซ เชเชฎเชพเช เชฎเชณเซ เชถเชเซ เชเซ
เชคเซ เชเชชเชฐเซเชเชฐ เชฎเชพเชเซ เชเซ เชเซ เชฌเชจเชพเชตเซ เชเซ RoleBinding
เชเซเชฏเชพเชฐเซ Namespace
เชเซเชฌเชฐเชจเซเชเซเชธ เชเซเชฒเชธเซเชเชฐเชฎเชพเช, เชคเซเชฏเชพเชฐ.
เชธเซเชฐเซเชธ: www.habr.com