เจจเฉเจ เจเจฐเฉเฅค เจ
เจจเฉเจตเจพเจฆ: เจเจชเจฐเฉเจเจฐ เจเฉเจฌเจฐเจจเฉเจเจธ เจฒเจ เจธเจนเจพเจเจ เจธเจพเจซเจเจตเฉเจ
เจฐ เจนเจจ, เจเฉ เจเจฟ เจเฉเจ เจเจเจจเจพเจตเจพเจ เจตเจพเจชเจฐเจจ 'เจคเฉ เจเจฒเฉฑเจธเจเจฐ เจตเจธเจคเฉเจเจ 'เจคเฉ เจฐเฉเจเฉเจจ เจเจพเจฐเจตเจพเจเจเจ เจจเฉเฉฐ เจธเจตเฉเจเจฒเจฟเจค เจเจฐเจจ เจฒเจ เจคเจฟเจเจฐ เจเฉเจคเจพ เจเจฟเจ เจนเฉเฅค เจตเจฟเจ เจเจชเจฐเฉเจเจฐเจพเจ เจฌเจพเจฐเฉ เจ
เจธเฉเจ เจชเจนเจฟเจฒเจพเจ เจนเฉ เจฒเจฟเจเจฟเจ เจนเฉ
เจฎเฉเจ เจเฉเจฌเจฐเจจเฉเจเจธ เจฒเจ เจเฉฑเจ เจเจชเจฐเฉเจเจฐ เจฌเจฃเจพเจเจฃ เจฌเจพเจฐเฉ เจฆเจธเจคเจพเจตเฉเจเจผ เจฒเฉฑเจญเจฃ เจฆเฉเจเจ เจเฉเจธเจผเจฟเจธเจผเจพเจ เจคเฉเจ เจฌเจพเจ
เจฆ เจเฉฑเจ เจ
เจธเจฒ-เจเฉเจตเจจ เจฆเฉ เจเจฆเจพเจนเจฐเจฃ เจฆเฉ เจจเจพเจฒ เจเจธ เจชเฉเจธเจ เจจเฉเฉฐ เจฒเจฟเจเจฃ เจฆเจพ เจซเฉเจธเจฒเจพ เจเฉเจคเจพ, เจเฉ เจเฉเจก เจฆเจพ เจ
เจงเจฟเจเจจ เจเจฐเจจ เจตเจฟเฉฑเจ เจเจฟเจ เจธเฉเฅค
เจเจฟเจธ เจเจฆเจพเจนเจฐเจจ เจฆเจพ เจตเจฐเจฃเจจ เจเฉเจคเจพ เจเจพเจตเฉเจเจพ เจเจน เจเจน เจนเฉ: เจธเจพเจกเฉ เจเฉเจฌเจฐเจจเฉเจเจธ เจเจฒเฉฑเจธเจเจฐ เจตเจฟเฉฑเจ, เจนเจฐเฉเจ 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
เจเฉ เจธเจเฉเจเจฎเฉเจเจ เจจเฉเฉฐ เจเจฒเจพเจเจฃ เจฒเจ เจฒเฉเฉเฉเจเจฆเจพ เจธเฉเฉฑเจเจ
เฉฑเจช เจเจฐเจฆเจพ เจนเฉ เจ
เจคเฉ เจซเจฟเจฐ เจธเจเฉเจเจฎเฉเจเจ เจเจเจธเจผเจจ เจจเฉเฉฐ เจเจพเจฒ เจเจฐเจฆเจพ เจนเฉ:
(เจจเฉเจ เจเจฐเฉเฅค เจ เจจเฉเจตเจพเจฆ: เจเฉฑเจฅเฉ เจ เจคเฉ เจนเฉเจ เจพเจ เจเฉเจก เจตเจฟเฉฑเจ เจเจฟเฉฑเจชเจฃเฉเจเจ เจฆเจพ เจฐเฉเจธเฉ เจตเจฟเฉฑเจ เจ เจจเฉเจตเจพเจฆ เจเฉเจคเจพ เจเจฟเจ เจนเฉเฅค เจเจธ เจคเฉเจ เจเจฒเจพเจตเจพ, เจธเจฟเจฐเจซเจผ เจนเฉเจฌเจฐ เจฒเฉเจเจเจ เจฆเฉ เจ เฉฐเจฆเจฐ เจฌเจฟเจนเจคเจฐ เจชเฉเฉเจนเจจเจฏเฉเจเจคเจพ เจฆเฉ เจเจฆเฉเจธเจผ เจฒเจ [เจเฉ เจตเจฟเฉฑเจ เจธเจฟเจซเจผเจพเจฐเจฟเจธเจผ เจเฉเจคเฉ] เจเฉเจฌเจพเจ เจฆเฉ เจฌเจเจพเจ เจเฉฐเจกเฉเจเจเฉเจธเจผเจจ เจจเฉเฉฐ เจธเจชเฉเจธ เจตเจฟเฉฑเจ เจ เฉเจ เจเฉเจคเจพ เจเจฟเจ เจนเฉเฅค เจนเจฐเฉเจ เจธเฉเจเฉ เจฆเฉ เจฌเจพเจ เจฆ 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