
рдпрджрд┐ рдЖрдк рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдХрдИ рдореМрдЬреВрджрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ рдЯреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдкреИрдХреЗрдЬ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдЬреИрд╕реЗ рдХрд┐ рд╣реЗрд▓реНрдо рдпрд╛ рдХреЙрдиреНрд╕рдиреЗрдЯ , рдпрд╛ рд╕рд┐рд░реНрдл рдЯреЗрдореНрдкреНрд▓реЗрдЯрд┐рдВрдЧ рд▓реИрдВрдЧреНрд╡реЗрдЬ (рдЬрд┐рдиреНрдЬрд╛ 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
рдЗрд╕рд▓рд┐рдП, рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЗ рд╡реИрдз рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ 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
рд╕рд░рд▓, рд╣реБрд╣? рдЗрд╕ рдкрдВрдХреНрддрд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдВ: 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
рдЕрднреА рднреА рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд╣реИ рдирд╛?
рдХреНрдпрд╛ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╛рди рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рджреЗрд╡ / рдареЗрд╕?
рд╣рд╛рдБ, рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!
рдЖрдЗрдП 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 рдХреЗ рд░рд┐рд▓реАрдЬ рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ;)
рдирд┐рд╖реНрдХрд░реНрд╖
рдореИрдВрдиреЗ рдЖрдкрдХреЛ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдкрд╛рдпрдерди-рдЖрдзрд╛рд░рд┐рдд рдЯреЗрдВрдкрд▓реЗрдЯрд┐рдВрдЧ рдЯреВрд▓ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдмреЗрд░рдиреЗрдЯреНрд╕-рдПрдкреАрдЖрдИ-рд╕рдВрдЧрдд рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдФрд░ рд╣реЗрд▓рдо рдЪрд╛рд░реНрдЯ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд╣реИред рдХрд┐рд╕реА рднреА рдЯрд┐рдкреНрдкрдгреА рдФрд░ рд╕рдореБрджрд╛рдп рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ, рдФрд░ рдлрд┐рд░ рд╕реЗ рд░реЗрдкреЛ рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред
рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдФрд░ рдЖрдкрдХрд╛ рджрд┐рди рд╢реБрдн рд╣реЛ!
рд╕рдВрджрд░реНрдн