ááŸááºáá»ááºá áá¬áá¬ááŒááº: á¡á±á¬áºááá±áá¬áá»á¬ážááẠKubernetes á¡ááœáẠá¡áááºáá±á¬á·ááºáá²áá»á¬ážááŒá
áºááŒá®áž á¡áá»áá¯á·áá±á¬ááŒá
áºáááºáá»á¬áž ááŒá
áºáá±á«áºáá¬ááá·áºá¡áá« á¡á
á¯ááá¯ááºá¡áá¬ááá¹áá¯áá»á¬ážáá±á«áºááœáẠáá¯á¶ááŸááºáá¯ááºáá±á¬ááºáá»ááºáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááẠáá®ááá¯ááºážáá¯ááºáá¬ážáááºá á¡á±á¬áºááá±áá¬ááœá±á¡ááŒá±á¬ááºáž áá±ážáá¬ážááŒá®ážáá¬áž
áá¯ááºááá¯áá±á·áá¬ááŒá®áž 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
áááºážááᯠáááºááá¯ááºááá¯áẠááŒá¯áá¯ááºááá¯ááºáá±á¬áºáááºáž áá¬ááááºážáá±áá¬áá»á¬áž á¡ááŸááºá¡áá¬ážááᯠááŒááºáá»á±á¬áºááŒá®ážáá±á¬áẠáááºážááẠáá»ááºážá
áá¬áá±á¬ááºážááá·áº á¡áá¯ááºááŒá
áºáá¬áááºá á€áá±áá¬ááœáẠKubernetes á¡á±á¬áºááá±áá¬áá»á¬ážááẠá¡áááºááŒá±áá¬áá¬âáá°ááá¯á·ááẠááá·áºá¡á¬áž á¡áááºážá¡ááŒá
áºááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážá¡áá±á«áº á¡ááŒá±áá¶á Kubernetes á¡áááºážá¡ááŒá
áºáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬ááºáááºáá®ážááá¯ááºá
á±áááºááŒá
áºáááºá áá«ááá¯á·ááá
á¹á
ááŸá¬ áá«ááá¯á·áááºáá®ážáá»ááºáááºá RoleBinding
áááºáá®ážáá±á
áẠNamespace
.
ááááŠážá
áœá¬ function ááá¯áááºááŸááºááŒáá«á
áá¯á· 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
á¡ááá®áá±ážááŸááºážááá¯áááááºáá® gooutines á¡á¬ážáá¯á¶ážááᯠáááºáááºá áœá¬áááºááá·áºáááºá - áááºáá®ážááŒááºážááŒáá·áº áá»áœááºá¯ááºááá¯á·ááẠá¡á
á¯á¡áá±ážááá¯á· áááºáá±á¬ááºááœáá·áºááᯠáá±ážáá«áááºá
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
(áááºááŸáºáá
áºáá¯á¡áá¯á¶ážááŒá¯ááŒááºáž) ááẠnamespaces á¡ááŒá±á¬ááºážá¡áá²á¡ááœáẠáááá±á¬ááºá
áœá¬ á
á±á¬áá·áºáá»áŸá±á¬áºááá¯ááºáááºááŒá
áºáááºá (áá±á¬ááºážáá«ážááœáẠááááºážáá±ážáá°áá»á¬ážá¡ááŒá±á¬ááºáž áááºáááºáááºááŸá¯áá«áááºáEventHandler
ááááºážáá±ážáá°áᶠá ááá¯á·ááŸáᬠnamespace áá±á«ááºážááá·áºáá±á¬á¡áá« (Namespace
) function áá¯áá±á«áºáááºá 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
. áá±á¬ááºáá¯á¶ážááœááºá áááºáá®ážááŸá¯á¡á±á¬ááºááŒááºáááºááŒá
áºá
á±á
áá±á¬ááºáá¯á¶ážáááºááŸááºáááá·áº function á 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
gooutine ááá¯ááœáá·áºááŒá®áž áá±á«áºááá¯ááá¯ááºáá«á namespaceInformer
á á¡áááºá áááºááŸááºáá²á·áá¬á áááºááá·áºá¡áá»ááºááŒááŸá¯áá±á¬ááºááŸááá±á¬á¡áá«, áááºážáááºáá¯ááºáá±á¬ááºáá»ááºááá¯á¡áá¯á¶ážáááºáááá·áºáááº, á¡áááá±ážáá«á WaitGroup
áá¯ááºáá±á¬ááºááŒááºážáááŒá¯áá±á¬á·áá²á á€áá¯ááºáá±á¬ááºáá»ááºááẠááœááºáá«áááºá
Kubernetes á¡á
á¯á¡áá±ážááœáẠá€áá¯ááºááŒááºáá»ááºááᯠáááºáá±á¬ááºááŒááºážááŸáá·áº áá¯ááºáá±á¬ááºááŒááºážááá¯ááºáᬠá¡áá»ááºá¡áááºááᯠááœáẠááœá±á·ááá¯ááºáá«áááºá
áá«áá² áááºáá®ážáá±ážáá²á· á¡á±á¬áºááá±áá¬á¡ááœááºáá«á RoleBinding
áááºáá±á¬á·áá² Namespace
Kubernetes á¡á
á¯á¡áá±ážááœááºá á¡áááºááá·áºááŒá
áºáá«ááŒá®á
source: www.habr.com