
рдЧреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдПрдХ рдПрдХрд╛рдзрд┐рдХрд╛рд░рд╡рд╛рджреА рд╣реИ рдЬрд┐рд╕реЗ рд▓реЛрдЧ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдмрдпрд╛рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреБрдирддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╣реИрдВ:
- рдЧреЛ - рдСрдкрд░реЗрдЯрд░ рдПрд╕рдбреАрдХреЗ рдкрд░ рд╡рд┐рдХрд╛рд╕рд╢реАрд▓ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд░реВрдкрд░реЗрдЦрд╛ рд╣реИред
- рдЧреЛ рдиреЗ рдбреЙрдХрдЯрд░ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЬреИрд╕реЗ рдЙрд▓рдЯреЗ-рд╕реАрдзреЗ рдЖрд╡реЗрджрди рд▓рд┐рдЦреЗ рд╣реИрдВред рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЧреЛ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП - рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рднрд╛рд╖рд╛ рдмреЛрд▓реЗрдВред
- Go рдкрд░ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рдЙрдкрдХрд░рдгред
рдПрдирдмреА : рд╡реИрд╕реЗ, рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рдмрддрд╛рдпрд╛ рдХрд┐ рд╡рд┐рджреЗрд╢реА рд▓реЗрдЦрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╣рдорд╛рд░реЗ рдЕрдиреБрд╡рд╛рджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдЕрдкрдиреЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЧреЛ рдкрд░ рдХреИрд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛рдПредрд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╕реАрдЦрдиреЗ рдореЗрдВ рд╕рдордп рдХреА рдХрдореА рдпрд╛, рддреБрдЪреНрдЫ, рдкреНрд░реЗрд░рдгрд╛ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛рдП? рд▓реЗрдЦ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдареЛрд╕ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдХреИрд╕реЗ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рд▓рдЧрднрдЧ рд╣рд░ DevOps рдЗрдВрдЬреАрдирд┐рдпрд░ рдЬрд╛рдирддрд╛ рд╣реИ -
рдкрд╛рдпрдерди ред
рдорд┐рд▓рд┐рдП: рдХреЙрдкреАрд░рд╛рдЗрдЯрд░ - рдХреЙрдкреА рдСрдкрд░реЗрдЯрд░!
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдиреЗрдорд╕реНрдкреЗрд╕ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдкрд░, рдпрд╛ рдЬрдм рджреЛ рд╕рдВрд╕реНрдерд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╡рд┐рдХрд╛рд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ: рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдФрд░ рд╕реАрдХреНрд░реЗрдЯред рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ, рдСрдкрд░реЗрдЯрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдЕрдкрдбреЗрдЯ (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдХреЗ) рдпрд╛ рдЧреБрдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЙрдХрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд╛рдмрд┐рдпрд╛рдБ (рдЬрдм рдирд╛рдо рдореЗрдВ рдЧреБрдкреНрдд рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ)ред
рддреЛ
рдПрдХ рдЕрдЪреНрдЫреЗ рдСрдкрд░реЗрдЯрд░ рдХреЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП :
- рдСрдкрд░реЗрдЯрд░ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд╕реНрдЯрдо рд░рд┐рд╕реЛрд░реНрд╕ рдбреЗрдлрд┐рдиреЗрд╢рди (рдЗрд╕рдХреЗ рдмрд╛рдж - рд╕реАрдЖрд░рдбреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреА рдЬрд╛рддреА рд╣реИред
- рдСрдкрд░реЗрдЯрд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЭрдВрдбреЗ рдФрд░ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
- рдбреЙрдХрд░ рдХрдВрдЯреЗрдирд░ рдФрд░ рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рдХреА рдЕрд╕реЗрдВрдмрд▓реА рдХрд╛ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрд╕рд╛рдиреА рд╕реЗ (рдПрдХ рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде) рдЕрдкрдиреЗ рдХреБрдмреЗрд░рдиреЗрдЯ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХреЗрдВред
CRD
рдСрдкрд░реЗрдЯрд░ рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрд╕рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реЗ рд╕рдВрд╕рд╛рдзрди рдФрд░ рдХрд╣рд╛рдБ рджреЗрдЦрдиреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЙрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирд┐рдпрдо рдХреЛ рдПрдХ рдПрдХрд▓ рд╕реАрдЖрд░рдбреА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджрд░реНрд╢рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рд╕реАрдЖрд░рдбреА рдХреЗ рдкрд╛рд╕ рдХреНрдпрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП?
- рд╣рдо рдЬрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрд╕рд╛рдзрди рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ (рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдпрд╛ рд╕реАрдХреНрд░реЗрдЯ)ред
- рдирд╛рдорд╕реНрдерд╛рди рдХреА рдПрдХ рд╕реВрдЪреА рдЬрд╣рд╛рдВ рд╕рдВрд╕рд╛рдзрди рд╕реНрдерд┐рдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
- рдЪрдпрдирдХрд░реНрддрд╛ , рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╣рдо рдирд╛рдо рд╕реНрдерд╛рди рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░реЗрдВрдЧреЗред
рд╣рдо CRD рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ:
apiVersion: apiextensions.k8s.io/v1beta1 kind: CustomResourceDefinition metadata: name: copyrator.flant.com spec: group: flant.com versions: - name: v1 served: true storage: true scope: Namespaced names: plural: copyrators singular: copyrator kind: CopyratorRule shortNames: - copyr validation: openAPIV3Schema: type: object properties: ruleType: type: string namespaces: type: array items: type: string selector: type: string
рдФрд░ рддреБрд░рдВрдд рдПрдХ
рд╕рд░рд▓ рдирд┐рдпрдо рдмрдирд╛рдПрдВ - рдирд╛рдо рдХреЗ рд╕рд╛рде рдирд╛рдо рдореЗрдВ рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ
default
рд╕рднреА рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗ
default
рдирд╛рдо рдХреЗ рд╕рд╛рде рд▓реЗрдмрд▓ рдЬреИрд╕реЗ
copyrator: "true"
:
apiVersion: flant.com/v1 kind: CopyratorRule metadata: name: main-rule labels: module: copyrator ruleType: configmap selector: copyrator: "true" namespace: default
рд╣реЛ рдЧрдпрд╛! рдЕрдм рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рд╣рдорд╛рд░реЗ рд╢рд╛рд╕рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореБрдЭреЗ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдо рдХреНрд▓рд╕реНрдЯрд░ рд╕рд░реНрд╡рд░ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рд▓рд┐рдЦреЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рддреИрдпрд╛рд░ рдкрд╛рдпрдерди рд▓рд╛рдЗрдмреНрд░реЗрд░реА
рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ:
import kubernetes from contextlib import suppress CRD_GROUP = 'flant.com' CRD_VERSION = 'v1' CRD_PLURAL = 'copyrators' def load_crd(namespace, name): client = kubernetes.client.ApiClient() custom_api = kubernetes.client.CustomObjectsApi(client) with suppress(kubernetes.client.api_client.ApiException): crd = custom_api.get_namespaced_custom_object( CRD_GROUP, CRD_VERSION, namespace, CRD_PLURAL, name, ) return {x: crd[x] for x in ('ruleType', 'selector', 'namespace')}
рдЗрд╕ рдХреЛрдб рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд┐рд▓рддреЗ рд╣реИрдВ:
{'ruleType': 'configmap', 'selector': {'copyrator': 'true'}, 'namespace': ['default']}
рдЙрддреНрдХреГрд╖реНрдЯ: рд╣рдо рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рд╣рдордиреЗ рд╡рд╣ рдХрд┐рдпрд╛ рдЬрд┐рд╕реЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдорд╛рд░реНрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдпрд╛ рдЭрдВрдбреЗ? рд╣рдо рд╕рдм рдХреБрдЫ рд▓реЗрддреЗ рд╣реИрдВ!
рд╣рдо рдСрдкрд░реЗрдЯрд░ рдХреЗ рдореБрдЦреНрдп рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдмреБрдирд┐рдпрд╛рджреА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИрдВ:
- рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
- рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рдЖрдкрдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд╕рдорд░реНрдерди рдФрд░ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде, рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдкрдврд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдкрд╛рдпрдерди рдорд╛рдирдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдПрдХ
argparser
рдореЙрдбреНрдпреВрд▓ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рдЙрджрд╛рд╣рд░рдг
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдпрд╣рд╛рдБ рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рдЭрдВрдбреЗ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:
parser = ArgumentParser( description='Copyrator - copy operator.', prog='copyrator' ) parser.add_argument( '--namespace', type=str, default=getenv('NAMESPACE', 'default'), help='Operator Namespace' ) parser.add_argument( '--rule-name', type=str, default=getenv('RULE_NAME', 'main-rule'), help='CRD Name' ) args = parser.parse_args()
рджреВрд╕рд░реА рдУрд░, рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдВ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдкреЙрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЗрд╡рд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА рдЖрд╕рд╛рдиреА рд╕реЗ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЙрди рдирд╛рдореЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдлрд▓реА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рд╛рде рдЪрд▓ рд░рд╣реА рд╣реИ:
env: - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
рд╕рдВрдЪрд╛рд▓рдХ рддрд░реНрдХ
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░рдореИрдк рдФрд░ рд╕реАрдХреНрд░реЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рддрдм рд╣рдо рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рди рддрд░реАрдХреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдФрд░ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
LIST_TYPES_MAP = { 'configmap': 'list_namespaced_config_map', 'secret': 'list_namespaced_secret', } CREATE_TYPES_MAP = { 'configmap': 'create_namespaced_config_map', 'secret': 'create_namespaced_secret', }
рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдПрдкреАрдЖрдИ рд╕рд░реНрд╡рд░ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо рдЗрд╕реЗ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
def handle(specs): kubernetes.config.load_incluster_config() v1 = kubernetes.client.CoreV1Api()
рдШрдЯрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдореБрдЦреНрдп рддрд░реНрдХ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВ:
рдмреБрдирд┐рдпрд╛рджреА рддрд░реНрдХ рддреИрдпрд╛рд░ рд╣реИ! рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рд╕рдм рдПрдХ рдЕрдЬрдЧрд░ рдкреИрдХреЗрдЬ рдореЗрдВ рдкреИрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо
setup.py
рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╡рд╣рд╛рдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрдЯрд╛-рдЬрд╛рдирдХрд╛рд░реА рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
from sys import version_info from setuptools import find_packages, setup if version_info[:2] < (3, 5): raise RuntimeError( 'Unsupported python version %s.' % '.'.join(version_info) ) _NAME = 'copyrator' setup( name=_NAME, version='0.0.1', packages=find_packages(), classifiers=[ 'Development Status :: 3 - Alpha', 'Programming Language :: Python', 'Programming Language :: Python :: 3', 'Programming Language :: Python :: 3.5', 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', ], author='Flant', author_email='maksim.nabokikh@flant.com', include_package_data=True, install_requires=[ 'kubernetes==9.0.0', ], entry_points={ 'console_scripts': [ '{0} = {0}.cli:main'.format(_NAME), ] } )
NB : рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛ рдЕрдкрдирд╛ рд╕рдВрд╕реНрдХрд░рдг рд╣реИред рдЖрдк рд╕рдВрдЧрддрддрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЧрддрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВредрдЕрдм рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
copyrator тФЬтФАтФА copyrator тФВ тФЬтФАтФА cli.py # тФВ тФЬтФАтФА constant.py # , тФВ тФЬтФАтФА load_crd.py # CRD тФВ тФФтФАтФА operator.py # тФФтФАтФА setup.py #
рдбреЙрдХрд░ рдФрд░ рд╣реЗрд▓реНрдо
Dockerfile рдЕрдкрдорд╛рдирдЬрдирдХ рд░реВрдк рд╕реЗ рд╕рд░рд▓ рд╣реЛрдЧрд╛: рдореВрд▓ рдЕрдЬрдЧрд░-рдЕрд▓реНрдкрд╛рдЗрди рдЫрд╡рд┐ рд▓реЗрдВ рдФрд░ рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВред рд╣рдо рдмреЗрд╣рддрд░ рд╕рдордп рддрдХ рдЗрд╕рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░ рджреЗрдВрдЧреЗ:
FROM python:3.7.3-alpine3.9 ADD . /app RUN pip3 install /app ENTRYPOINT ["copyrator"]
рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рддреИрдирд╛рддреА рднреА рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ:
apiVersion: apps/v1 kind: Deployment metadata: name: {{ .Chart.Name }} spec: selector: matchLabels: name: {{ .Chart.Name }} template: metadata: labels: name: {{ .Chart.Name }} spec: containers: - name: {{ .Chart.Name }} image: privaterepo.yourcompany.com/copyrator:latest imagePullPolicy: Always args: ["--rule-type", "main-rule"] env: - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace serviceAccountName: {{ .Chart.Name }}-acc
рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХреЛ рдЖрд╡рд╢реНрдпрдХ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЗ рд╕рд╛рде рдСрдкрд░реЗрдЯрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рднреВрдорд┐рдХрд╛ рдмрдирд╛рдиреА рд╣реЛрдЧреА:
apiVersion: v1 kind: ServiceAccount metadata: name: {{ .Chart.Name }}-acc --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRole metadata: name: {{ .Chart.Name }} rules: - apiGroups: [""] resources: ["namespaces"] verbs: ["get", "watch", "list"] - apiGroups: [""] resources: ["secrets", "configmaps"] verbs: ["*"] --- apiVersion: rbac.authorization.k8s.io/v1beta1 kind: ClusterRoleBinding metadata: name: {{ .Chart.Name }} roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: {{ .Chart.Name }} subjects: - kind: ServiceAccount name: {{ .Chart.Name }}-acc
рдкрд░рд┐рдгрд╛рдо
рдЗрд╕рд▓рд┐рдП, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдбрд░, рдлрдЯрдХрд╛рд░ рдФрд░ рд╕реАрдЦрдиреЗ рдХреЗ, рд╣рдо рдкрд╛рдпрдерди рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдСрдкрд░реЗрдЯрд░ рдХреЛ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдмреЗрд╢рдХ, рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЕрднреА рднреА рдмрдврд╝рдиреЗ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╣реИ: рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рд╡рд╣ рдХрдИ рдирд┐рдпрдореЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ, рдХрдИ рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛, рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд╕реАрдЖрд░рдбреА рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдЧрд╛ ...
рдХреЛрдб рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдЗрд╕реЗ рдПрдХ
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рднрдВрдбрд╛рд░ рдореЗрдВ рд░рдЦрд╛ред рдпрджрд┐ рдЖрдк рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдкрдирд╛ рдзреНрдпрд╛рди рджреЛ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреЛ рддреИрдирд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (
рдкрд╣рд▓рд╛ рдФрд░
рджреВрд╕рд░рд╛ )ред
PS рдФрд░ рдпрджрд┐ рдЖрдк рдХреБрдмреЗрд░рдиреЗрдЯ рдХреА рдШрдЯрдирд╛рдУрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реИрдВ рдпрд╛ рдпрджрд┐ рдЖрдк рдмреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╣рдЬ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдиреЗ
рд╢реЗрд▓-рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рддреИрдпрд╛рд░ рд╕рдорд╛рдзрд╛рди рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ (рд╣рдордиреЗ рдЕрдкреНрд░реИрд▓ рдореЗрдВ рдЗрд╕рдХреА
рдШреЛрд╖рдгрд╛ рдХреА рдереА )ред
рдкреА рдкреА рдПрд╕
рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдореЗрдВ рднреА рдкрдврд╝реЗрдВ: