Rịba ama. ntụgharị asụsụ.: Ndị na-arụ ọrụ bụ ngwa enyemaka Kubernetes, emebere ka akpaaka mmezu nke omume na-emekarị na ụyọkọ ihe mgbe ụfọdụ ihe mere. Anyị edeelarị gbasara ndị na-arụ ọrụ na
Ekpebiri m iji ihe atụ nke ndụ dee post a mgbe m gbalịrị ịchọta akwụkwọ na ịmepụta onye na-arụ ọrụ maka Kubernetes, bụ nke gafere site n'ịmụ koodu ahụ.
Ihe atụ nke a ga-akọwa bụ nke a: na ụyọkọ Kubernetes anyị, nke ọ bụla Namespace
na-anọchi anya gburugburu ebe igbe ájá dị otu, ma anyị chọrọ igbochi ohere ịnweta ha ka ndị otu nwee ike igwu egwu naanị n'igbe aja nke ha.
Ị nwere ike nweta ihe ịchọrọ site n'inye onye ọrụ otu nwere RoleBinding
kpọmkwem Namespace
и ClusterRole
na ikike ndezi. Nnọchite anya YAML ga-adị ka nke a:
---
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
(
Mepụta otu RoleBinding
Ị nwere ike iji aka mee ya, ma mgbe ị gafechara akara narị aha, ọ na-aghọ ọrụ na-agwụ ike. Nke a bụ ebe ndị ọrụ Kubernetes na-abịa aka-ha na-enye gị ohere ịmepụta akụrụngwa Kubernetes dabere na mgbanwe na akụrụngwa. N'ọnọdụ anyị, anyị chọrọ ịmepụta RoleBinding
mgbe eke Namespace
.
Nke mbụ, ka anyị kọwaa ọrụ ahụ main
nke na-eme ntọala achọrọ iji mee nkwupụta wee kpọọ ọrụ nkwupụta:
(Rịba ama. ntụgharị asụsụ.: ebe a na n'okpuru okwu ndị dị na koodu ka a sụgharịrị n'asụsụ Russian. Na mgbakwunye, emezigharị nbanye ahụ gaa na oghere kama ịbụ taabụ [akwadoro na Go] naanị maka ebumnuche ọgụgụ ka mma n'ime nhazi Habr. Mgbe ndepụta nke ọ bụla gasịrị, enwere njikọ na nke mbụ na GitHub, ebe echekwara okwu na taabụ Bekee.)
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() // Ожидаем, что все остановлено
}
Anyị na-eme ihe ndị a:
- Anyị na-ahazi onye njikwa maka akara sistemụ arụmọrụ akọwapụtara iji mee ka njedebe mara mma nke onye ọrụ.
- Anyị na-eji
WaitGroup
iji amara kwụsị goroutines niile tupu ị kwụsị ngwa ahụ. - Anyị na-enye ohere ịnweta ụyọkọ site na ịmepụta
clientset
. - Mwepụta
NamespaceController
, nke anyị niile mgbagha ga-adị.
Ugbu a, anyị chọrọ ntọala maka mgbagha, na n'ọnọdụ anyị nke a bụ nke a kpọtụrụ aha 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
}
Ebe a anyị na-ahazi SharedIndexInformer
, nke ga-arụ ọrụ nke ọma (iji cache) chere maka mgbanwe na oghere aha (gụkwuo maka ndị na-enye ozi n'isiokwu ahụ "EventHandler
nye onye na-agwa ya, nke mere na mgbe ị na-agbakwunye oghere aha (Namespace
) a na-akpọ ọrụ createRoleBinding
.
Nzọụkwụ ọzọ bụ ịkọwa ọrụ a 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))
}
}
Anyị na-enweta aha oghere dị ka obj
ma tụgharịa ya ka ọ bụrụ ihe Namespace
. Mgbe ahụ, anyị na-akọwa RoleBinding
, dabere na faịlụ YAML a kpọtụrụ aha na mbido, na-eji ihe enyere Namespace
na-eke RoleBinding
. N'ikpeazụ, anyị na-edebanye ma ihe okike ahụ ọ gara nke ọma.
Ọrụ ikpeazụ a ga-akọwapụta bụ 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
}
Lee, anyị na-ekwu okwu WaitGroup
ka anyị malite goroutine wee kpọọ namespaceInformer
, nke akọwara na mbụ. Mgbe mgbaàmà nkwụsị ahụ rutere, ọ ga-akwụsị ọrụ ahụ, gwa ya WaitGroup
, nke anaghịzi eme ya, ọrụ a ga-apụkwa.
Enwere ike ịhụ ozi gbasara iwulite na ịme nkwupụta a na ụyọkọ Kubernetes
Nke ahụ bụ maka onye ọrụ na-emepụta RoleBinding
mgbe ole Namespace
na ụyọkọ Kubernetes, dị njikere.
isi: www.habr.com