α
αααΆαα ααααααα ααααα·ααααα·ααααΊααΆαααααα·ααΈαααα½ααααααΆαα 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
ααΎααααΈαααααα 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
}
(
αα
ααΈαααααΎαααααααα
ααΆαααααααα SharedIndexInformer
αααααΉαααΆαααααα·αααα·ααΆα (αααααααΎααααΆαααααααΆαα) αααα
αΆαααΆαααααΆααααααΌααα
αααα»α 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))
}
}
(
ααΎαααα½αααΆαα
ααααααααααααΆ 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