เบซเบกเบฒเบโเปเบซเบโ. เปเบ.: เบเบปเบงเบเบฐเบเบดเบเบฑเบเบเบฒเบเปเบกเปเบเบเบญเบเปเบงเบเปเบงเบเปเบซเบผเบทเบญเบชเปเบฒเบฅเบฑเบ Kubernetes, เบญเบญเบเปเบเบเบกเบฒเปเบเบทเปเบญเบญเบฑเบเบเบฐเปเบเบกเบฑเบเบเบฒเบเบเบฐเบเบดเบเบฑเบเบเบฒเบเบเปเบฒเปเบเบตเบเบเบฒเบเบเบปเบเบเบฐเบเบดเบเปเบฝเบงเบเบฑเบเบงเบฑเบเบเบธ cluster เปเบกเบทเปเบญเบกเบตเปเบซเบเบเบฒเบเบชเบฐเปเบเบฒเบฐเปเบเบซเบเบถเปเบเปเบเบตเบเบเบถเปเบ. เบเบงเบเปเบฎเบปเบฒเปเบเปเบเบฝเบเปเบฅเปเบงเบเปเบฝเบงเบเบฑเบเบเบนเปเบเบฐเบเบญเบเบเบฒเบเปเบ
เบเปเบฒเบเบฐเปเบเบปเปเบฒเปเบเปเบเบฑเบเบชเบดเบเปเบเบเบฝเบเบเปเปเบเบงเบฒเบกเบเบตเปเบเปเบงเบเบเบปเบงเบขเปเบฒเบเบเบตเบงเบดเบเบเบดเบเบซเบผเบฑเบเบเบฒเบเบเบงเบฒเบกเบเบฐเบเบฒเบเบฒเบกเบเบญเบเบเปเบญเบเปเบเบทเปเบญเบเบญเบเบซเบฒเปเบญเบเบฐเบชเบฒเบเบเปเบฝเบงเบเบฑเบเบเบฒเบเบชเปเบฒเบเบเบปเบงเบเบฐเบเบดเบเบฑเบเบเบฒเบเบชเปเบฒเบฅเบฑเบ Kubernetes, เปเบเบดเปเบเปเบเปเบเปเบฒเบเบเบฒเบเบชเบถเบเบชเบฒเบฅเบฐเบซเบฑเบ.
เบเบปเบงเบขเปเบฒเบเบเบตเปเบเบฐเบเบทเบเบญเบฐเบเบดเบเบฒเบเบเบตเปเปเบกเปเบ: เปเบเบเบธเปเบก Kubernetes เบเบญเบเบเบงเบเปเบฎเบปเบฒ, เปเบเปเบฅเบฐเบเบปเบ Namespace
เปเบเบฑเบเบเบปเบงเปเบเบเบเบญเบเบชเบฐเบเบฒเบเปเบงเบเบฅเปเบญเบก sandbox เบเบญเบเบเบตเบกเบเบฒเบ, เปเบฅเบฐเบเบงเบเปเบฎเบปเบฒเบเปเบญเบเบเบฒเบเบเปเบฒเบเบฑเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเปเบซเปเปเบเบปเบฒเปเบเบปเปเบฒเปเบเบทเปเบญเปเบซเปเบเบตเบกเบเบฒเบเบชเบฒเบกเบฒเบเบซเบผเบดเปเบเปเบ sandbox เบเบญเบเปเบเบปเบฒเปเบเบปเปเบฒเปเบญเบเปเบเบปเปเบฒเบเบฑเปเบ.
เบเปเบฒเบเบชเบฒเบกเบฒเบเบเบฑเบเบฅเบธเบชเบดเปเบเบเบตเปเบเปเบฒเบเบเปเบญเบเบเบฒเบเปเบเบเบเบฒเบเบกเบญเบเบซเบกเบฒเบเปเบซเปเบเบนเปเปเบเปเบเบธเปเบกเบเบตเปเบกเบต 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
เบเปเบฒเบเบชเบฒเบกเบฒเบเปเบฎเบฑเบเปเบเปเบเปเบงเบเบเบปเบเปเบญเบ, เปเบเปเบซเบผเบฑเบเบเบฒเบเบเปเบฒเบกเบฎเปเบญเบ namespaces, เบกเบฑเบเบเบฒเบเปเบเบฑเบเบงเบฝเบเบเบฒเบเบเบตเปเบซเบเปเบฒเปเบเบทเปเบญ. เบเบตเปเปเบกเปเบเบเปเบญเบเบเบตเปเบเบนเปเบเบฐเบเบดเบเบฑเบเบเบฒเบ 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
เปเบเบทเปเบญเบขเบธเบเปเบเบปเบฒเบเบฒเบ goroutines เบเบฑเบเบซเบกเบปเบเบขเปเบฒเบเบชเบฐเบซเบเปเบฒเบเบฒเบกเบเปเบญเบเบเบตเปเบเบฐเบเบดเบเบเปเบฒเบฎเปเบญเบเบชเบฐเบซเบกเบฑเบ. - เบเบงเบเปเบฎเบปเบฒเบชเบฐเบซเบเบญเบเบเบฒเบเปเบเบปเปเบฒเปเบเบดเบเบเบธเปเบกเปเบเบเบเบฒเบเบชเปเบฒเบ
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
}
(
เบเบตเปเบเบตเปเบเบงเบเปเบฎเบปเบฒ configure SharedIndexInformer
, เปเบเบดเปเบเบเบฐเบกเบตเบเบฐเบชเบดเบเบเบดเบเบฒเบ (เปเบเป cache) เบฅเปเบเปเบฒเบเบฒเบเบเปเบฝเบเปเบเบเปเบ namespaces (เบญเปเบฒเบเปเบเบตเปเบกเปเบเบตเบกเบเปเบฝเบงเบเบฑเบเบเบนเปเปเบซเปเบเปเปเบกเบนเบเปเบเบเบปเบเบเบงเบฒเบก "EventHandler
เบเปเปเบเบฑเบเบเบนเปเปเบซเปเบเปเปเบกเบนเบ, เบเบฑเปเบเบเบฑเปเบเปเบกเบทเปเบญเปเบเบตเปเบก namespace (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))
}
}
(
เบเบงเบเปเบฎเบปเบฒเปเบเปเบฎเบฑเบ namespace เปเบเบฑเบ 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
เบเบตเปเบเบงเบเปเบฎเบปเบฒเปเบเบตเบ goroutine เปเบฅเบฐเบซเบผเบฑเบเบเบฒเบเบเบฑเปเบเปเบเบซเบฒ namespaceInformer
, เปเบเบดเปเบเปเบเปเบเบทเบเบเปเบฒเบเบปเบเปเบงเปเบเปเบญเบเบซเบเปเบฒเบเบตเป. เปเบกเบทเปเบญเบชเบฑเบเบเบฒเบเบขเบธเบเบกเบฒเบฎเบญเบ, เบกเบฑเบเบเบฐเบชเบดเปเบเบชเบธเบเบเบฒเบเบเปเบฒเบเบฒเบ, เปเบเปเบ WaitGroup
, เปเบเบดเปเบเบเปเปเบเบทเบเบเบฐเบเบดเบเบฑเบเบญเบตเบเบเปเปเปเบ, เปเบฅเบฐเบเบฑเบเบเบฑเบเบเบตเปเบเบฐเบญเบญเบ.
เบเปเปเบกเบนเบเบเปเบฝเบงเบเบฑเบเบเบฒเบเบชเปเบฒเบ เปเบฅเบฐเปเบฅเปเบเบเบณเบเบฐเปเบซเบผเบเบเบตเปเบขเบนเปเปเบเบเบธเปเบก Kubernetes เบชเบฒเบกเบฒเบเบเบปเบเปเบเปเปเบ
เบเบฑเปเบเปเบกเปเบเบกเบฑเบเบชเปเบฒเบฅเบฑเบเบเบนเปเบเบฐเบเบญเบเบเบฒเบเบเบตเปเบชเปเบฒเบ RoleBinding
เปเบกเบทเปเบญโเปเบโ Namespace
เปเบเบเบธเปเบก Kubernetes, เบเปเบญเบกเปเบฅเปเบง.
เปเบซเบผเปเบเบเปเปเบกเบนเบ: www.habr.com