Fanamarihana. transl.: Ny operatera dia rindrambaiko fanampiny ho an'ny Kubernetes, natao ho azy ny fanatanterahana ny hetsika mahazatra amin'ny zavatra cluster rehefa misy hetsika sasany. Efa nanoratra momba ny opΓ©rateur in
Nanapa-kevitra ny hanoratra ity lahatsoratra ity miaraka amin'ny ohatra tena izy aho taorian'ny fiezahako hitady antontan-taratasy momba ny famoronana mpandraharaha ho an'ny Kubernetes, izay nandalo fianarana ny kaody.
Ny ohatra holazaina dia izao: ao amin'ny cluster Kubernetes, tsirairay avy Namespace
dia maneho ny tontolon'ny sandbox an'ny ekipa iray, ary tianay hamerana ny fidirana amin'izy ireo mba tsy ahafahan'ny ekipa milalao afa-tsy ao anaty boaty fasika.
Azonao atao ny manatratra izay tadiavinao amin'ny alalan'ny fanendrena mpampiasa vondrona manana RoleBinding
manokana Namespace
ΠΈ ClusterRole
miaraka amin'ny zon'ny fanovana. Ny fanehoana YAML dia ho toy izao:
---
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
Mamorona iray RoleBinding
Azonao atao ny manao izany amin'ny tanana, fa rehefa avy niampita ny mari-pamantarana anarana an-jatony dia lasa asa mandreraka. Eto no misy ny mpandraharaha Kubernetes - mamela anao hanao automatique ny famoronana loharano Kubernetes mifototra amin'ny fiovan'ny loharanon-karena. Amin'ny tranga misy antsika dia te hamorona isika RoleBinding
rehefa mamorona Namespace
.
Voalohany indrindra, andeha hofaritana ny asa main
izay manao ny fanamboarana ilaina mba hampandehanana ny fanambarana ary avy eo miantso ny hetsika fanambarana:
(Fanamarihana. transl.: eto sy eo ambany ny fanehoan-kevitra ao amin'ny kaody dia adika amin'ny teny Rosiana. Ho fanampin'izay, nahitsy amin'ny habaka fa tsy amin'ny kiheba [nasosoka ao amin'ny Go] fotsiny ny indentation mba hahamora kokoa ny famakiana ao anatin'ny layout Habr. Aorian'ny lisitra tsirairay dia misy rohy mankany amin'ny tany am-boalohany ao amin'ny GitHub, izay misy ny fanehoan-kevitra sy tabilao amin'ny teny anglisy.)
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() // ΠΠΆΠΈΠ΄Π°Π΅ΠΌ, ΡΡΠΎ Π²ΡΠ΅ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΎ
}
Manao izao manaraka izao izahay:
- Manefa mpandrindra izahay ho an'ny famantarana rafitra miasa manokana mba hampitsaharana tsara ny mpandraharaha.
- Ampiasainay
WaitGroup
hampiato tsara ny goroutine rehetra alohan'ny hamaranana ny fampiharana. - Manome fidirana amin'ny cluster izahay amin'ny famoronana
clientset
. - fandefasana
NamespaceController
, izay hitoeran'ny lojikantsika rehetra.
Ankehitriny dia mila fototra ho an'ny lojika isika, ary amin'ny tranga misy antsika dia io ilay voalaza 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
}
(
Eto izahay dia manamboatra SharedIndexInformer
, izay hiandry (mampiasa cache) amin'ny fomba mahomby ny fanovana amin'ny toeran'ny anarana (vakio bebe kokoa momba ny mpanome vaovao ao amin'ny lahatsoratra "EventHandler
amin'ny mpampita vaovao, ka rehefa manampy toerana misy anarana (Namespace
) atao hoe function createRoleBinding
.
Ny dingana manaraka dia ny famaritana io asa io 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))
}
}
(
Mahazo ny namespace toy ny obj
ary avadika ho zavatra Namespace
. Dia faritanay RoleBinding
, mifototra amin'ny rakitra YAML voalaza tany am-piandohana, mampiasa ilay zavatra nomena Namespace
ary mamorona RoleBinding
. Farany, misoratra anarana izahay raha nahomby ny famoronana.
Ny asa farany hofaritana dia 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
}
(
Eto isika dia miresaka WaitGroup
fa manomboka ny goroutine ary miantso avy eo namespaceInformer
, izay efa voafaritra teo aloha. Rehefa tonga ny famantarana fiatoana dia hamarana ny asa, mampahafantatra WaitGroup
, izay tsy vita intsony, ary hivoaka ity asa ity.
Ny fampahalalana momba ny fananganana sy ny fampandehanana ity fanambarana ity amin'ny cluster Kubernetes dia azo jerena ao
Izany dia ho an'ny mpandraharaha izay mamorona RoleBinding
rahoviana Namespace
ao amin'ny cluster Kubernetes, vonona.
Source: www.habr.com