рдПрдХ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЯреЗрдВрдкрд▓реЗрдЯрд┐рдВрдЧ рдЯреВрд▓ рд▓рд┐рдЦрдирд╛


рдпрджрд┐ рдЖрдк рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдХрдИ рдореМрдЬреВрджрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкреИрдХреЗрдЬ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рд╣реЗрд▓реНрдо рдпрд╛ рдХреЙрдиреНрд╕рдиреЗрдЯ , рдпрд╛ рд╕рд┐рд░реНрдл рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ (рдЬрд┐рдиреНрдЬрд╛ 2, рдЧреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЖрджрд┐) рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдмрдирддреЗ рд╣реИрдВред рдЙрди рд╕рднреА рдХреА рдЕрдкрдиреА рдХрдорд┐рдпрд╛рдВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдлрд╛рдпрджреЗ рднреА рд╣реИрдВ рдФрд░ рд╣рдо рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреВрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╕рд░реНрд╡реЛрддреНрддрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВрдЧреЗред


рддреЛ, рд╣реЗрд▓реНрдо рдХреНрдпреЛрдВ рдирд╣реАрдВ?


рд╣реЗрд▓реНрдо рдХреА рдЖрд▓реЛрдЪрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рд▓реЗрдЦ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдирдореЗрдВ рд╕реЗ рдХреЗрд╡рд▓ рдПрдХ: рд╣реЗрд▓реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рдмрд╛рд░ рд╕реЛрдЪреЗрдВ )ред рд╣реЗрд▓реНрдо рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореИрдирд┐рдлреЗрд╕реНрдЯреНрд╕ ( рдЬрд╕рди ) рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ ред рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЕрд╕рд▓реА рдирд░рдХ рддрдм рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЙрд╕реЗ рдПрдХ yaml рдкреНрд░рдХрдЯ рдХреЗ рд▓рд┐рдП рдЗрдВрдбреЗрдВрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХрднреА-рдХрднреА рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ (рдпрд╣ рдореЗрд░реЗ рдЪрд╛рд░реНрдЯ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ):


 spec: jobTemplate: spec: template: spec: containers: - name: my-awesome-container resources: {{ toYaml .Values.resources | indent 14 }} 


рд▓реЗрдХрд┐рди рд╣реЗрд▓реНрдо рдЖрдЬ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреА рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рд╣реИред рд╣реЗрд▓реНрдо рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рдмрдбрд╝реЗ рд╕рдореБрджрд╛рдп рдФрд░ рдЪрд╛рд░реНрдЯ рдХреЗ рд╕рд╛рде рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдФрд░ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╣реЗрд▓реНрдо рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд╣реЗрд▓реНрдо рд╣рдм рдХреА рдШреЛрд╖рдгрд╛ рдХреА рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣реЗрд▓реНрдо рдЖрдЬ рдбреЙрдХрдЯрд░ рдХреА рддрд░рд╣ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рдореБрджрд╛рдп рдФрд░ рд╕рдорд░реНрдерди рд╣реИред


рд╣реЗрд▓реНрдо 3 рд░рд┐рд▓реАрдЬ рдХреЗ рд╕рд╛рде рдЖрдиреЗ рд╡рд╛рд▓реЗ рдмрджрд▓рд╛рд╡ рд╣реЛ рд░рд╣реЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рдХреЛ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХрдм рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣реЗрд▓реНрдо рд▓рд╛рдн:


  • рдмрдбрд╝реЗ рд╕рдореБрджрд╛рдп рдФрд░ рдХрдИ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдЪрд╛рд░реНрдЯ
  • (рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд) рдорд╛рдирд╡-рдЕрдиреБрдХреВрд▓ рд╡рд╛рдХреНрдп-рд╡рд┐рдиреНрдпрд╛рд╕ред рдХрдо рд╕реЗ рдХрдо рдпрд╣ yaml + go рдЯреЗрдореНрдкрд▓реЗрдЯ;)

рдХрдорд┐рдпрд╛рдВ:


  • рддрд╛рд░ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛
  • рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдСрдкрд░реЗрдЯрд░реЛрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛

рдареАрдХ рд╣реИ, рддреЛ рд╢рд╛рдпрдж Ksonnet?


рдпрджрд┐ рдЖрдк рд╣реЗрд▓реНрд╕ рдХреА рддреБрд▓рдирд╛ Ksonnet рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдЙрддреНрддрд░рд╛рд░реНрджреНрдз рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рд╣реИ, рдЕрд░реНрдерд╛рддреН рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред Ksonnet JSON рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ Jsonnet рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдЯреВрд▓ рд╣реИред Ksonnet рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдФрд░ рдЕрдЪреНрдЫреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ Kubernetes-API-рд╕рдВрдЧрдд Jsonnet рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рднреА OOP рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ Kubernetes рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 local k = import "k.libsonnet"; local deployment = k.apps.v1beta1.deployment; local appDeployment = deployment .new( params.name, params.replicas, container .new(params.name, params.image) .withPorts(containerPort.new(targetPort)), labels); 

рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд▓рдЧрддрд╛ рд╣реИ, рд╣реИ рдирд╛?
рдЬрдм рдЖрдк рдПрдкреАрдЖрдИ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ yaml / json рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЖрдпрд╛рддрд┐рдд рд╕рд┐рд░реНрдл yaml рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рддреЛ рдпрд╣ рдереЛрдбрд╝рд╛ рдХрдо рд╕рд╛рдл-рд╕реБрдерд░рд╛ рд╣реЛрддрд╛ рд╣реИ:


 { global: {}, components: { "deployment-nginx-deployment-dkecx"+: { spec+: { replicas: 10, template+: { spec+: { containers+: [ { name: "nginx", image: "nginx:latest", ports: [ { containerPort: 80, }, ], }, ], }, }, }, }, }, } 

рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдпрд╣ рдХреБрдЫ рд╣реИ рдФрд░ рдпрд╣ рд╣реЗрд▓реНрдо рдореЗрдВ рддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред Ksonnet рдХрд╛ рдиреБрдХрд╕рд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдореЗрдВ Helm рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯреЗ рд╕рдореБрджрд╛рдп рдФрд░ рдХрдо рдкреИрдХреЗрдЬ рд╣реЛрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдк рдЕрдкрдиреЗ Ksonnet рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ Helm рдЪрд╛рд░реНрдЯ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЙрдирдХреЗ рд╕рд╛рде jsonnet- рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ json рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ)ред рдФрд░ рдПрдХ рдЫреЛрдЯреЗ рд╕рдореБрджрд╛рдп рдФрд░ рдпреЛрдЧрджрд╛рди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдХреБрдЫ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ рдЬрдм рдЖрдк рдЕрдкрдирд╛ рдЪрд╛рд░реНрдЯ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдЬреЛ рдореИрдВрдиреЗ рд╕реНрд╡рдпрдВ рдЕрдиреБрднрд╡ рдХрд┐рдпрд╛ рд╣реИ: рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣реЗрд▓реНрдо рдореЗрдВ рдЖрдк рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реЗ рдПрдХ рд╡рд┐рдиреНрдпрд╛рд╕ ConfigMap рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рдХрдИ рд╡рд┐рдиреНрдпрд╛рд╕ рдлрд╛рдЗрд▓ рд╣реЛрддреА рд╣реИрдВ:


 apiVersion: v1 kind: ConfigMap metadata: name: conf data: {{- (.Files.Glob "foo/*").AsConfig | nindent 2 }} 

рдЖрдк рдореЗрд░реА рд╣рддрд╛рд╢рд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ Ksonnet рдореЗрдВ рдРрд╕реА рдХреЛрдИ рд╕реБрд╡рд┐рдзрд╛ рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╣реИрдВред рд▓реЗрдХрд┐рди рдореБрджреНрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрдм рдЖрдк рдЦрд╝реБрд╢реА рд╕реЗ рдЕрдкрдирд╛ рдЪрд╛рд░реНрдЯ рд▓рд┐рдЦ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЕрдЪрд╛рдирдХ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдХрдореА рдЖрдкрдХреЛ рдЖрдзреЗ рд░рд╛рд╕реНрддреЗ рдкрд░ рд░реЛрдХ рджреЗрддреА рд╣реИред
рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, Ksonnet рдХреЗ рд▓рд╛рдн:


  • рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛
  • рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдПрдкреАрдЖрдИ-рд╕рдВрдЧрдд рдЬреЛрдВрд╕рдиреЗрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА
  • рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рдЖрдпрд╛рдд рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ

рдХрдорд┐рдпрд╛рдВ:


  • рдЫреЛрдЯреЗ рд╕рдореБрджрд╛рдп рдФрд░ Ksonnet- рджреЗрд╢реА рдкреИрдХреЗрдЬреЛрдВ рдХреА рдХрдо рд╕рдВрдЦреНрдпрд╛
  • рдХреБрдЫ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЕрднрд╛рд╡ рдЖрдк рд╣реЗрд▓реНрдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
  • рдирдпрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ => рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рдордп => рдмрдврд╝рд╛ рд╣реБрдЖ рдмрд╕-рдХрд╛рд░рдХ
  • рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрднреА-рдХрднреА рдмрджрд╕реВрд░рдд рдФрд░ рдХрдо рдорд╛рдирд╡-рдкрдардиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдЬрдм рдЕрднрд╛рд╡ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдХрдЖрд░реНрд╕ рдмрдирд╛рддреЗ рд╣реИрдВ)

рдЖрдЗрдП рдПрдХ рдЖрджрд░реНрд╢ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ рдЯреВрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ


рдпрд╣рд╛рдБ "рдЖрджрд░реНрд╢" рдЕрд╕реНрдерд╛рдпреА рдЙрдкрдХрд░рдг рдХреЗ рдХреБрдЫ рдорд╛рдирджрдВрдб рд╣реИрдВ:


  • рдпрд╣ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рддрд╛рд░ рдирд╣реАрдВ
  • рдЗрд╕рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдПрдкреАрдЖрдИ-рд╕рдВрдЧрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП
  • рдЗрд╕рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рднреНрдп рд╕реЗрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдпрд╣ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ json рдФрд░ yaml рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдпрд╣ рдорд╛рдирд╡ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдпрд╣ рд╕рд░рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдЗрд╕рдореЗрдВ рдореМрдЬреВрджрд╛ рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП (рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╣реИ рдФрд░ рд╣рдо рд╣реЗрд▓реНрдо рд╕рдореБрджрд╛рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ)

рдЕрднреА рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╣реА рдХрд╛рдлреА рд╣реИред рдореИрдВ рдЕрдкрдиреЗ рд╕рд┐рд░ рдореЗрдВ рдЗрд╕ рд╕реВрдЪреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ рдФрд░ рдЕрдкрдиреЗ рдЖрдк рд╕реЗ рд╕реЛрдЪрд╛: рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВ рдкрд╛рдпрдерди рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА? рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рд╣рдорд╛рд░реЗ рдорд╛рдирджрдВрдбреЛрдВ рдореЗрдВ рдлрд┐рдЯ рдмреИрдарддрд╛ рд╣реИ:


  • рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ, рддрд╛рд░ рдирд╣реАрдВ ред рд╣рд╛рдВ, рд╣рдо рдЙрд╕рдХреЗ рд▓рд┐рдП dict рдФрд░ list рдкреНрд░рдХрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдПрдкреАрдЖрдИ-рд╕рдВрдЧрдд рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИ ред рд╣рд╛рдБ, from kubernetes import client
  • рддрд╛рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕рднреНрдп рд╕реЗрдЯ рд╣реИ ред рдЦреВрдм!
  • Json рдФрд░ yaml рд╕реНрд╡рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ ред рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗред
  • рдорд╛рдирд╡ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╣реИред рдХреЛрдИ рдЧрдВрджрдЧреА рдирд╣реАрдВред
  • рд╕рд░рд▓ред рд╣рд╛рдВред
  • рдореМрдЬреВрджрд╛ рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ ред рдХрд┐, рд╣рдо рдЦреБрдж рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред

рдареАрдХ рд╣реИ, рд╣реЛрдирд╣рд╛рд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдореИрдВрдиреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкрд╛рдпрдерди рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд░рд▓ рдЯреЗрдВрдкрд▓реЗрдЯрд┐рдВрдЧ рдЯреВрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕рд╕реЗ рдХреНрдпрд╛ рд╣реБрдЖред


рдХрд░рд╡рд▓реЗ рд╕реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ


рдЗрд╕ рдЙрдкрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рд╡рд┐рд╢реЗрд╖ рдпрд╛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдЬреЛ рдореБрдЭреЗ рдХреБрдмреЗрд░рдиреЗрдЯ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рджреЗрддрд╛ рд╣реИ) рд▓рд┐рдпрд╛ рдФрд░ рдореМрдЬреВрджрд╛ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд▓рд┐рдЦреА (рддрд╛рдХрд┐ рдХреЛрдИ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЪрд╛рд░реНрдЯ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХреЗ)ред рддреЛ, рдЪрд▓реЛ рдПрдХ рджреМрд░рд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ рдЙрдкрдХрд░рдг рдЬреАрдердм рд░реЗрдкреЛ рдореЗрдВ рд╕реБрд▓рдн рд╣реИ рдФрд░ рдЖрдк рд╡рд╣рд╛рдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред


рдбреЙрдХрд░ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд


рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реИ рдЗрд╕ рдбреЙрдХрдЯрд░ рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:


 $ docker run greegorey/karavel -h usage: karavelcli.py [-h] subcommand ... optional arguments: -h, --help show this help message and exit list of subcommands: subcommand template generates manifests from template ensure ensure helm dependencies 

рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдк рдЪрд╛рд░реНрдЯ рдЪрд╛рд░реНрдЯ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдЪрд╛рд░реНрдЯ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдорд╛рдЙрдВрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 $ cd example $ docker run -v $PWD:/chart greegorey/karavel template . 

рддреЛ, рдЪрд▓реЛ рдЪрд╛рд░реНрдЯ рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдПрдХ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред рдпрд╣ рд╣реЗрд▓реНрдо рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд╕рдорд╛рди рд╣реИ:


 $ cd example $ tree . . тФЬтФАтФА dependencies тФЬтФАтФА prod.yaml тФЬтФАтФА requirements.yaml тФЬтФАтФА templates тФВ  тФЬтФАтФА custom-resource.py тФВ  тФЬтФАтФА deployment.py тФВ  тФФтФАтФА service-helm.py тФФтФАтФА values.yaml 2 directories, 6 files 

рд╣реЗрд▓реНрдо рдХреА рддрд░рд╣, рдЗрд╕рдореЗрдВ requirements.yaml ред рдПрдХ рд╣реА рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рд╢реНрдпрд╛рдо рдлрд╝рд╛рдЗрд▓:


 dependencies: - name: mysql version: 0.13.1 repository: https://kubernetes-charts.storage.googleapis.com/ 

рдпрд╣рд╛рдВ рдЖрдк рдЕрдкрдиреЗ рд╣реЗрд▓реНрдо рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдЪрд╛рд░реНрдЯ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдирд┐рд░реНрднрд░рддрд╛рдПрдБ dependencies рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд░ рдЬрд╛рддреА рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ ensure рдХрд░рдиреЗ рдпрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ensure рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ ensure :


 $ karavel ensure . 

рдЙрд╕рдХреЗ рдмрд╛рдж рдЖрдкрдХреА dependencies рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:


 $ tree dependencies dependencies тФФтФАтФА mysql-0.13.1 тФФтФАтФА mysql тФЬтФАтФА Chart.yaml тФЬтФАтФА README.md тФЬтФАтФА templates тФВ  тФЬтФАтФА NOTES.txt тФВ  тФЬтФАтФА _helpers.tpl тФВ  тФЬтФАтФА configurationFiles-configmap.yaml тФВ  тФЬтФАтФА deployment.yaml тФВ  тФЬтФАтФА initializationFiles-configmap.yaml тФВ  тФЬтФАтФА pvc.yaml тФВ  тФЬтФАтФА secrets.yaml тФВ  тФЬтФАтФА svc.yaml тФВ  тФФтФАтФА tests тФВ  тФЬтФАтФА test-configmap.yaml тФВ  тФФтФАтФА test.yaml тФФтФАтФА values.yaml 4 directories, 13 files 

рдЕрдм рд╣рдордиреЗ рдЕрдкрдиреА рдирд┐рд░реНрднрд░рддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЖрдЗрдП рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдкрд░ рдПрдХ рдирдЬрд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдПрдХ рд╕рд░рд▓ nginx рдкрд░рд┐рдирд┐рдпреЛрдЬрди рдмрдирд╛рддреЗ рд╣реИрдВ:


 from kubernetes import client from karavel.helpers import Values def template(): values = Values().values # Configure Pod template container container = client.V1Container( name='nginx', image='{}:{}'.format(values.nginx.image.repository, values.nginx.image.tag), ports=[client.V1ContainerPort(container_port=80)]) # Create and configurate a spec section template = client.V1PodTemplateSpec( metadata=client.V1ObjectMeta(labels={'app': 'nginx'}), spec=client.V1PodSpec(containers=[container])) # Create the specification of deployment spec = client.ExtensionsV1beta1DeploymentSpec( replicas=3, template=template) # Instantiate the deployment object deployment = client.ExtensionsV1beta1Deployment( api_version='extensions/v1beta1', kind='Deployment', metadata=client.V1ObjectMeta(name='nginx-deployment'), spec=spec) return deployment # [deployment], (deployment, deployment) are valid 

рдЗрд╕рд▓рд┐рдП, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╡реИрдз рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ template() рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рдПрдХрд▓ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдпрд╛ рдЙрдирдХреА list / tuple рджреЗрддрд╛ рд╣реИред рдЖрдк рдкрд╛рдпрдерди рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рд╡рд╕реНрддреБрдУрдВ рдХреА рд╕реВрдЪреА рдпрд╣рд╛рдВ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдХреЛрдб рд╕рд╛рдл, рд╕рд░рд▓, рдкрдардиреАрдп рд╣реИред рдЖрдк рдЖрд╢реНрдЪрд░реНрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ values.nginx.image.repository рдХрд╣рд╛рдВ рд╕реЗ рд╣реИред values.nginx.image.repository рдЖрддреА рд╣реИ? рдпрд╣ рдЙрд╕ рдорд╛рди рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЪрд╛рд░реНрдЯ рдХреЛ karavel template -f one.yaml --values two.yaml рдХрд░рддреЗ рд╕рдордп рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдареАрдХ рдЙрд╕реА рддрд░рд╣ рдЬреИрд╕реЗ рд╣реЗрд▓реНрдо рдореЗрдВ: karavel template -f one.yaml --values two.yaml ред рд╣рдо рдмрд╛рдж рдореЗрдВ рдЙрди рдкрд░ рдПрдХ рдирдЬрд░ рдбрд╛рд▓реЗрдВрдЧреЗред


рдареАрдХ рд╣реИ, рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


рдЕрдм, рд╣рдордиреЗ рдЕрдкрдиреА рддреИрдирд╛рддреА рдмрдирд╛рдИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдпрд╛ рдЪрд╛рд░реНрдЯ рдХреЗ рдПрдХ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЖрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЖрдЗрдП templates/service-helm.py рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:


 from kubernetes import client from karavel.helm import HelmChart from karavel.helpers import Values def template(): values = Values().values # Initialize the chart (== helm template --values) chart = HelmChart(name='mysql', version='0.13.1', values=values.mysql.helm) # Get the desired object from chart service = chart.get(name='svc', obj_class=client.V1Service) # Create custom objects to add custom_ports = [ client.V1ServicePort( name='my-custom-port', protocol=values.mysql.protocol, port=values.mysql.port, target_port=39000, ) ] # Add custom objects to the service service.spec['ports'] = custom_ports # Change Helm-generated label service.metadata['labels']['release'] += '-suffix' # Delete Helm-generated label `heritage: Tiller` del service.metadata['labels']['heritage'] return service # [service], (service, service) are valid 

рд╕рд░рд▓, рд╣реБрд╣? рдЗрд╕ рдкрдВрдХреНрддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: service = chart.get(name='svc', obj_class=client.V1Service) - рд╣рдордиреЗ рдХрдХреНрд╖рд╛ V1Service рдкреНрд░рдкрддреНрд░ Helm yaml рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдпрд╛ред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ / рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рд╕рд┐рд░реНрдл dict рдХрд╛рдо рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред


рдпрджрд┐ рдореИрдВ рдХрд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?


рдЦреИрд░, рдЗрд╕рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд╕реА рдмрд╛рдд рд╣реИред Kubernetes API /openapi/v2 json рдкрд░рд┐рднрд╛рд╖рд╛ рдореЗрдВ CRD рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ /openapi/v2 рдХреНрд▓рд╛рдЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрд╕ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдирд┐рд░реНрдорд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЖрдк рдЕрднреА рднреА рдЖрд╕рд╛рдиреА рд╕реЗ dict рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣:


 from kubernetes import client def template(): resource = { 'apiVersion': 'stable.example.com/v1', 'kind': 'Whale', 'metadata': client.V1ObjectMeta( name='my-object', ), 'spec': { 'image': 'my-whale-image:0.0.1', 'tail': 1, 'fins': 4, } } return resource # [resource], (resource, resource) are valid 

рдЕрднреА рднреА рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд╣реИ рдирд╛?


рдХреНрдпрд╛ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рджреЗрд╡ / рдареЗрд╕?


рд╣рд╛рдБ, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
рдЖрдЗрдП values.yaml рдХреЛ values.yaml рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ:


 nginx: image: repository: nginx tag: 1.15-alpine mysql: port: 3307 protocol: TCP helm: releaseName: my-release namespace: prod imageTag: '5.7.14' service: type: NodePort 

mysql рдЕрдВрджрд░ helm рдХреБрдВрдЬреА рдХреЛ рдиреЛрдЯ рдХрд░реЗрдВ: рд╣рдордиреЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдерд╛ рдЬрдм helm рдЪрд╛рд░реНрдЯ chart = HelmChart(name='mysql', version='0.13.1', values=values.mysql.helm) . chart = HelmChart(name='mysql', version='0.13.1', values=values.mysql.helm) рд▓рд┐рдП рдорд╛рди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реБрдПред рдХреБрдЫ рд╣реЗрд▓реНрдо рдЪрд╛рд░реНрдЯ рдХреЛ releaseName рд▓рд┐рдП рдЖрд╡реЗрджрди рдирд╛рдордХрд░рдг рдФрд░ namespace рд▓рд┐рдП releaseName рдЖрд╡рд╢реНрдпрдХрддрд╛ releaseName ред рдЗрди рджреЛ рдорд╛рдиреЛрдВ рдХреЛ helm template рдореЗрдВ - --namespace рдФрд░ NAME рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ Helm рдХреЛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред


рдЕрдм, рдЖрдк prod env рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдорд╛рд░реЗ рд╕рднреА рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 $ karavel template -f values.yaml -f prod.yaml . --- # Source: templates/custom-resource.py apiVersion: stable.example.com/v1 kind: Whale metadata: name: my-object spec: fins: 4 image: my-whale-image:0.0.1 tail: 1 --- # Source: templates/deployment.py apiVersion: extensions/v1beta1 kind: Deployment metadata: name: nginx-deployment spec: replicas: 3 template: metadata: labels: app: nginx spec: containers: - image: nginx:1.14-alpine name: nginx ports: - containerPort: 80 --- # Source: templates/service-helm.py apiVersion: v1 kind: Service metadata: annotations: null labels: app: prod-release-mysql chart: mysql-0.13.1 release: prod-release-suffix name: prod-release-mysql spec: ports: - name: my-custom-port port: 3308 protocol: TCP targetPort: 39000 selector: app: prod-release-mysql type: NodePort 

рдЙрд╕рдХреЗ рдмрд╛рдж рдЖрдк рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдХреНрд▓рд╕реНрдЯрд░ рдореЗрдВ kubeclt apply рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдХреВрд▓! рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдФрд░ base64 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


import base64


рд░рд╣рд╕реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рддрд┐рдЬреЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?


import hvac


рдЙрд░реЛрдЬ рд▓рд╛рдирд╛?


import importlib


рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реИрд╢ рдХрд╛рд░реНрдп?


import Crypto


рдЖрдкрдХреЛ рдорд┐рд▓ рдЧрдпрд╛ред рдЕрдЬрдЧрд░ рдХреЗ рд╕рд╛рде рдЖрдк рдЕрдкрдиреЗ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдореЗрдирд┐рдлреЗрд╕реНрдЯреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдХреНрдпрд╛ рдпрд╣ NIH рд╕рд┐рдВрдбреНрд░реЛрдо рд╣реИ?


рдирд╣реАрдВ :)
рдореИрдВ рд╣реВрдВ рдЦреБрд╢реА рд╕реЗ рдореЗрд░реА рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╣реЗрд▓реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореБрдЭреЗ рдпрд╛рдж рдЖрддреА рд╣реИрдВред рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдХреБрдЫ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ Ksonnet рдХрд╛ рднреА рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ред
рдореИрдВ рдЗрд╕ рдЯреВрд▓ рдХреЛ рдПрдХ рдкреНрд░реВрдл-рдСрдл-рдХреЙрдиреНрд╕реЗрдкреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЛрдЪрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд╕реНрдерд╛рдпреА рдЙрдкрдХрд░рдг рд╣реЗрд▓реНрдо рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рдпрдерди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдЕрдЧрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдЙрдкрдХрд░рдг рдореЗрдВ рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд░реБрдЪрд┐ / рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рд╣рдо рдЗрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛ рд╣рдо рд╣реЗрд▓реНрдо 3 рдХреЗ рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;)


рдирд┐рд╖реНрдХрд░реНрд╖


рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди-рдЖрдзрд╛рд░рд┐рдд рдЯреЗрдВрдкрд▓реЗрдЯрд┐рдВрдЧ рдЯреВрд▓ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдПрдкреАрдЖрдИ-рд╕рдВрдЧрдд рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдФрд░ рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИред рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдФрд░ рд╕рдореБрджрд╛рдп рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реЗ рд░реЗрдкреЛ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред


рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ!


рд╕рдВрджрд░реНрдн


Source: https://habr.com/ru/post/hi437682/


All Articles