Ogow. turjumiHawl-wadeenadu waa software kaaliyaha ah ee Kubernetes oo loogu talagalay in lagu habeeyo ficilada joogtada ah ee walxaha kooxda marka dhacdooyinka qaarkood dhacaan. Horay ayaan wax uga qornay hawl-wadeennada gudaha , kaas oo ka hadlay fikradaha aasaasiga ah iyo mabaadi'da hawlgalka. Laakiin iyada oo maaddadaas ay ka badan tahay aragtida ka shaqeynta qaybaha diyaarsan ee Kubernetes, tarjumaadda la soo jeediyay ee maqaalkan cusub waa aragtida horumarinta / DevOps injineer, oo la yaabay hirgelinta hawlwadeenka cusub.

Waxaan go'aansaday inaan ku qoro qoraalkan tusaale ahaan adduunka dhabta ah ka dib markii aan isku dayay inaan helo dukumeenti ku saabsan abuurista hawlwadeenka Kubernetes, taas oo keentay in aan barto koodka.
Tusaalaha lagu sifayn doono waa kan: Kubernetes kutladayada, mid walba Namespace waxay ka dhigan tahay jawiga sandbox-ka kooxda, waxaana rabnay inaan xaddidno gelitaankooda si ay kooxuhu ugu ciyaaraan kaliya sanduuqyada ciidooda.
Natiijada la rabo waxaa lagu gaari karaa iyadoo loo xilsaarayo isticmaalaha koox leh RoleBinding si gaar ah Namespace ΠΈ ClusterRole leh xuquuqda tafatirka. Matalaadda YAML waxay u ekaan doontaa sidan:
---
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
(gudaha )
Si loo abuuro sida RoleBinding Tan waxaad ku samayn kartaa gacanta, laakiin ka dib markaad ka gudubto 100ka calaamadda magac, waxay noqotaa mid caajis ah. Tani waa halka hawl wadeenada Kubernetes ay ku anfacaanβwaxay kuu oggolaanayaan inaad si toos ah u abuurto ilaha Kubernetes iyadoo lagu salaynayo isbeddelada kheyraadka. Xaaladeena, waxaan rabnaa inaan abuurno RoleBinding marka la abuurayo Namespace.
Marka hore aan qeexno shaqada main, kaas oo fulinaya habaynta loo baahan yahay si uu u socodsiiyo hawlwadeenka ka dibna u yeedha hawlwadeenka ficilkiisa:
(Ogow. turjumiHalkan ka dib, faallooyinka koodka ayaa loo tarjumay Ruush. Intaa waxaa dheer, soo gelisyada waxaa loo beddelay meelo bannaan halkii laga isticmaali lahaa tabs [lagu taliyay in Go] oo keliya ujeeddada hagaajinta akhrinta gudaha qaabka Habr. Liis kasta oo la socdaa waa xidhiidhiya koodka asalka ah ee GitHub, halkaas oo faallooyinka Ingiriisiga lagu xafido.
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() // ΠΠΆΠΈΠ΄Π°Π΅ΠΌ, ΡΡΠΎ Π²ΡΠ΅ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ
}
(gudaha )
Waxaan samaynaa kuwan soo socda:
- Waxaan u habeyneynaa maamule calaamadaha nidaamka qalliinka ee gaarka ah si ay u keento joojinta quruxda badan ee hawlwadeenka.
- Waxaan isticmaalnaa
WaitGroupin si xarrago leh loo joojiyo dhammaan gorutines ka hor inta uusan codsiga joojin. - Waxaan bixinaa gelitaanka kooxda anagoo abuurayna
clientset. - Daahfurka
NamespaceController, kaas oo dhammaan caqli-galkeennu ku jiri doono.
Hadda waxaynu u baahannahay sal u ah caqli-gal, xaaladdeenna waa tii la sheegay 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
}
(gudaha )
Halkan waanu dejinay SharedIndexInformer, kaas oo si hufan (adoo isticmaalaya khasnadda) sugi doona isbeddelada meelaha magacyada (ka akhri wax badan oo ku saabsan xog-ogayaasha maqaalka ""- qiyaastii turjumaada)Intaa ka dib waan isku xireynaa EventHandler wargeliyaha, si marka lagu daro meel magac ah (Namespace) shaqada waxaa loo yaqaan createRoleBinding.
Tallaabada xigta waa in la qeexo shaqadan 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))
}
}
(gudaha )
Waxaan u helnaa goobta magaceed sida obj oo u beddelo shay Namespace. Kadibna waxaan go'aamineynaa RoleBinding, oo ku salaysan faylka YAML ee lagu sheegay bilowga, iyadoo la adeegsanayo shayga la bixiyay Namespace iyo abuurista RoleBindingUgu dambayntii, waxaynu galnay in abuurku guulaystay iyo in kale.
Shaqada ugu dambeysa ee u baahan in la qeexo waa 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
}
(gudaha )
Halkaan ka hadal WaitGroup, in aan bilowno gorutine ka dibna wac namespaceInformer, oo hore loo qeexay. Marka calaamada joogsiga la helo, waxay joojin doontaa shaqada, warbixinta WaitGroup, kaas oo aan hadda soconayn, shaqadanina way dhammaan doontaa.
Macluumaadka ku saabsan dhisida iyo socodsiinta hawlwadeenkan kutlada Kubernetes waxa laga heli karaa at .
On hawlwadeenkan, kaas oo abuura RoleBinding muuqaalka kore Namespace Kubernetes cluster, diyaar ah.
Source: www.habr.com
