Go āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§ āĻĒā§āĻ°ā§āĻā§āĻ°āĻžāĻŽāĻŋāĻ āĻāĻžāĻˇāĻžāĻ° āĻāĻĒāĻ° āĻāĻāĻā§āĻāĻŋāĻ¯āĻŧāĻž āĻ
āĻ§āĻŋāĻāĻžāĻ° āĻ°āĻ¯āĻŧā§āĻā§ āĻ¯āĻž āĻ˛ā§āĻā§āĻ°āĻž āĻā§āĻŦāĻžāĻ°āĻ¨ā§āĻāĻ¸ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦāĻŋāĻŦā§āĻ¤āĻŋ āĻ˛āĻŋāĻāĻ¤ā§ āĻŦā§āĻā§ āĻ¨ā§āĻ¯āĻŧāĨ¤ āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĻā§āĻĻā§āĻļā§āĻ¯āĻŽā§āĻ˛āĻ āĻāĻžāĻ°āĻŖ āĻ°āĻ¯āĻŧā§āĻā§, āĻ¯ā§āĻŽāĻ¨:
- Go-āĻ¤ā§ āĻ
āĻĒāĻžāĻ°ā§āĻāĻ°āĻĻā§āĻ° āĻŦāĻŋāĻāĻžāĻļā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻļāĻā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§ āĻāĻžāĻ āĻžāĻŽā§ āĻ°āĻ¯āĻŧā§āĻā§ -
āĻ āĻĒāĻžāĻ°ā§āĻāĻ° SDK . - Docker āĻāĻŦāĻ Kubernetes āĻāĻ° āĻŽāĻ¤ āĻā§āĻŽ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻāĻžāĻ°ā§ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻā§āĻ˛āĻŋ Go-āĻ¤ā§ āĻ˛ā§āĻāĻž āĻāĻā§āĨ¤ Go-āĻ¤ā§ āĻāĻĒāĻ¨āĻžāĻ° āĻ āĻĒāĻžāĻ°ā§āĻāĻ° āĻ˛ā§āĻāĻž āĻŽāĻžāĻ¨ā§ āĻāĻā§āĻ¸āĻŋāĻ¸ā§āĻā§āĻŽā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻ āĻāĻžāĻˇāĻžāĻ¯āĻŧ āĻāĻĨāĻž āĻŦāĻ˛āĻžāĨ¤
- Go āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ā§āĻ° āĻāĻā§āĻ āĻāĻ°ā§āĻŽāĻā§āĻˇāĻŽāĻ¤āĻž āĻāĻŦāĻ āĻŦāĻžāĻā§āĻ¸ā§āĻ° āĻŦāĻžāĻāĻ°ā§ āĻāĻāĻ¯ā§āĻā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻšāĻ āĻā§āĻ˛āĨ¤
NB: āĻŦāĻžāĻ āĻĻā§āĻ¯ āĻāĻ¯āĻŧā§, āĻā§-āĻ¤ā§ āĻāĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻā§āĻ° āĻŦāĻā§āĻ¤āĻŦā§āĻ¯ āĻā§āĻāĻžāĻŦā§ āĻ˛āĻŋāĻāĻŦā§āĻ¨, āĻāĻŽāĻ°āĻž
āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻ
āĻāĻžāĻŦā§ āĻŦāĻž āĻ¸āĻšāĻāĻāĻžāĻŦā§ āĻŦāĻ˛āĻ¤ā§ āĻā§āĻ˛ā§, āĻ
āĻ¨ā§āĻĒā§āĻ°ā§āĻ°āĻŖāĻžāĻ° āĻāĻžāĻ°āĻŖā§ āĻ¯āĻĻāĻŋ āĻāĻĒāĻ¨āĻŋ āĻā§ āĻļā§āĻāĻž āĻĨā§āĻā§ āĻŦāĻŋāĻ°āĻ¤ āĻĨāĻžāĻā§āĻ¨? āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻāĻŋ āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§ āĻ¯ā§ āĻāĻĒāĻ¨āĻŋ āĻā§āĻāĻžāĻŦā§ āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻāĻžāĻˇāĻžāĻā§āĻ˛āĻŋāĻ° āĻāĻāĻāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻāĻāĻāĻŋ āĻāĻžāĻ˛ āĻŦāĻŋāĻŦā§āĻ¤āĻŋ āĻ˛āĻŋāĻāĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨ āĻ¯āĻž āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ DevOps āĻĒā§āĻ°āĻā§āĻļāĻ˛ā§ āĻāĻžāĻ¨ā§āĻ¨ - āĻĒāĻžāĻāĻĨāĻ¨.
āĻŽāĻŋāĻ: āĻāĻĒāĻŋāĻ¯āĻŧāĻžāĻ° - āĻāĻĒāĻŋ āĻ āĻĒāĻžāĻ°ā§āĻāĻ°!
āĻāĻāĻāĻŋ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸āĻžāĻŦā§, āĻāĻāĻāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŦāĻŋāĻŦā§āĻ¤āĻŋ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĻ° āĻāĻĨāĻž āĻŦāĻŋāĻŦā§āĻāĻ¨āĻž āĻāĻ°ā§āĻ¨ āĻ¯āĻž āĻāĻāĻāĻŋ āĻāĻ¨āĻĢāĻŋāĻāĻŽā§āĻ¯āĻžāĻĒ āĻ āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻĄāĻŋāĻāĻžāĻāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ āĻ¯āĻāĻ¨ āĻāĻāĻāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ¨āĻžāĻŽāĻ¸ā§āĻĨāĻžāĻ¨ āĻāĻĒāĻ¸ā§āĻĨāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻŦāĻž āĻ¯āĻāĻ¨ āĻĻā§āĻāĻŋ āĻ¸āĻ¤ā§āĻ¤āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻāĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻšāĻ¯āĻŧ: āĻāĻ¨āĻĢāĻŋāĻāĻŽā§āĻ¯āĻžāĻĒ āĻāĻŦāĻ āĻ¸āĻŋāĻā§āĻ°ā§āĻā§ˇ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ āĻĻā§āĻˇā§āĻāĻŋāĻā§āĻŖ āĻĨā§āĻā§, āĻ āĻĒāĻžāĻ°ā§āĻāĻ° āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ°ā§āĻļāĻ¨ā§āĻ° āĻŦāĻžāĻ˛ā§āĻ āĻāĻĒāĻĄā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ (āĻāĻ¨āĻĢāĻŋāĻāĻŽā§āĻ¯āĻžāĻĒ āĻāĻĒāĻĄā§āĻ āĻāĻ°ā§) āĻŦāĻž āĻā§āĻĒāĻ¨ āĻĄā§āĻāĻž āĻāĻĒāĻĄā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻĻāĻ°āĻāĻžāĻ°ā§ āĻšāĻ¤ā§ āĻĒāĻžāĻ°ā§ - āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻĄāĻāĻžāĻ° āĻ°ā§āĻāĻŋāĻ¸ā§āĻā§āĻ°āĻŋāĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻā§ (āĻ¨ā§āĻŽāĻ¸ā§āĻĒā§āĻ¸ā§ āĻ¸āĻŋāĻā§āĻ°ā§āĻ āĻ¯ā§āĻ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ)āĨ¤
āĻāĻŦāĻ āĻ¤āĻžāĻ, āĻāĻāĻāĻŋ āĻāĻžāĻ˛ āĻ āĻĒāĻžāĻ°ā§āĻāĻ° āĻāĻŋ āĻĨāĻžāĻāĻž āĻāĻāĻŋāĻ¤:
- āĻ
āĻĒāĻžāĻ°ā§āĻāĻ°ā§āĻ° āĻ¸āĻžāĻĨā§ āĻŽāĻŋāĻĨāĻ¸ā§āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§ āĻŦāĻžāĻšāĻŋāĻ¤ āĻšāĻ¯āĻŧ
āĻāĻžāĻ¸ā§āĻāĻŽ āĻ¸āĻŽā§āĻĒāĻĻ āĻ¸āĻāĻā§āĻāĻž (āĻāĻāĻ¨ āĻĨā§āĻā§ CRD āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻāĻ˛ā§āĻ˛ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§)āĨ¤ - āĻ āĻĒāĻžāĻ°ā§āĻāĻ° āĻāĻ¨āĻĢāĻŋāĻāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§. āĻāĻāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻ°āĻž āĻāĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻāĻ¨ āĻĒāĻ¤āĻžāĻāĻž āĻāĻŦāĻ āĻĒāĻ°āĻŋāĻŦā§āĻļ āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŦāĨ¤
- āĻĄāĻāĻžāĻ° āĻāĻ¨ā§āĻā§āĻāĻ¨āĻžāĻ° āĻāĻŦāĻ āĻšā§āĻ˛āĻŽ āĻāĻžāĻ°ā§āĻā§āĻ° āĻŦāĻŋāĻ˛ā§āĻĄāĻāĻŋ āĻāĻŽāĻ¨āĻāĻžāĻŦā§ āĻĄāĻŋāĻāĻžāĻāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ āĻ¯āĻžāĻ¤ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§āĻ°āĻž āĻ¸āĻšāĻā§āĻ (āĻāĻā§āĻˇāĻ°āĻŋāĻ āĻ āĻ°ā§āĻĨā§ āĻāĻāĻāĻŋ āĻāĻŽāĻžāĻ¨ā§āĻĄ āĻĻāĻŋāĻ¯āĻŧā§) āĻ āĻĒāĻžāĻ°ā§āĻāĻ°āĻāĻŋāĻā§ āĻ¤āĻžāĻĻā§āĻ° āĻā§āĻŦāĻžāĻ°āĻ¨ā§āĻāĻ¸ āĻā§āĻ˛āĻžāĻ¸ā§āĻāĻžāĻ°ā§ āĻāĻ¨āĻ¸ā§āĻāĻ˛ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
CRD
āĻ āĻĒāĻžāĻ°ā§āĻāĻ°ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻā§āĻ¨ āĻ¸āĻāĻ¸ā§āĻĨāĻžāĻ¨āĻā§āĻ˛āĻŋ āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻāĻŦāĻ āĻā§āĻĨāĻžāĻ¯āĻŧ āĻĻā§āĻāĻ¤ā§ āĻšāĻŦā§ āĻ¤āĻž āĻāĻžāĻ¨āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻžāĻĻā§āĻ° āĻ¤āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¸ā§āĻ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻāĻāĻāĻŋ āĻāĻāĻ CRD āĻ āĻŦāĻā§āĻā§āĻ āĻšāĻŋāĻ¸āĻžāĻŦā§ āĻāĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻž āĻšāĻŦā§āĨ¤ āĻāĻ 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
āĻ˛ā§āĻŦā§āĻ˛ āĻ¸āĻš āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻ¨āĻĢāĻŋāĻāĻŽā§āĻ¯āĻžāĻĒ copyrator: "true"
:
apiVersion: flant.com/v1
kind: CopyratorRule
metadata:
name: main-rule
labels:
module: copyrator
ruleType: configmap
selector:
copyrator: "true"
namespace: default
āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤! āĻāĻāĻ¨ āĻāĻŽāĻžāĻĻā§āĻ° āĻā§āĻ¨āĻāĻžāĻŦā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻ¤āĻĨā§āĻ¯ āĻĒā§āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻāĻŽāĻžāĻā§ āĻāĻāĻ¨āĻ āĻāĻāĻāĻŋ āĻ°āĻŋāĻāĻžāĻ°ā§āĻā§āĻļāĻ¨ āĻāĻ°āĻ¤ā§ āĻĻāĻŋāĻ¨ āĻ¯ā§ āĻāĻŽāĻ°āĻž āĻ¨āĻŋāĻā§āĻ°āĻžāĻ āĻā§āĻ˛āĻžāĻ¸ā§āĻāĻžāĻ° API āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§ āĻ
āĻ¨ā§āĻ°ā§āĻ§ āĻ˛āĻŋāĻāĻŦ āĻ¨āĻžāĨ¤ āĻāĻāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻ°āĻž āĻāĻāĻāĻŋ āĻ°ā§āĻĄāĻŋāĻŽā§āĻĄ āĻĒāĻžāĻāĻĨāĻ¨ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŦ
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()
āĻ āĻ¨ā§āĻ¯āĻĻāĻŋāĻā§, Kubernetes-āĻ āĻāĻ¨āĻāĻžāĻ¯āĻŧāĻ°āĻ¨āĻŽā§āĻ¨ā§āĻ āĻā§āĻ°āĻŋāĻ¯āĻŧā§āĻŦāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§, āĻāĻĒāĻ¨āĻŋ āĻ¸āĻšāĻā§āĻ āĻāĻ¨ā§āĻā§āĻāĻ¨āĻžāĻ°ā§āĻ° āĻāĻŋāĻ¤āĻ°ā§ āĻĒāĻĄ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻĒāĻ°āĻŋāĻˇā§āĻŦāĻž āĻ¤āĻĨā§āĻ¯ āĻ¸ā§āĻĨāĻžāĻ¨āĻžāĻ¨ā§āĻ¤āĻ° āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤ āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻŽāĻ°āĻž āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻ¨āĻŋāĻ°ā§āĻŽāĻžāĻŖā§āĻ° āĻ¸āĻžāĻĨā§ āĻ¯ā§ āĻ¨āĻžāĻŽāĻ¸ā§āĻĨāĻžāĻ¨ā§ āĻĒāĻĄ āĻāĻ˛āĻā§ āĻ¸ā§ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻ¤āĻĨā§āĻ¯ āĻĒā§āĻ¤ā§ āĻĒāĻžāĻ°āĻŋ:
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',
}
āĻāĻ° āĻĒāĻ°ā§, āĻāĻĒāĻ¨āĻžāĻā§ API āĻ¸āĻžāĻ°ā§āĻāĻžāĻ° āĻĨā§āĻā§ āĻāĻā§āĻ¨ā§āĻāĻā§āĻ˛āĻŋ āĻā§āĻ°āĻšāĻŖ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻāĻ¸ā§āĻ¨ āĻāĻāĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§āĻĒ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻāĻ°āĻŋ:
def handle(specs):
kubernetes.config.load_incluster_config()
v1 = kubernetes.client.CoreV1Api()
# ĐĐžĐģŅŅĐ°ĐĩĐŧ ĐŧĐĩŅОд Đ´ĐģŅ ŅĐģĐĩĐļĐĩĐŊиŅ Са ОйŅĐĩĐēŅĐ°Đŧи
method = getattr(v1, LIST_TYPES_MAP[specs['ruleType']])
func = partial(method, specs['namespace'])
w = kubernetes.watch.Watch()
for event in w.stream(func, _request_timeout=60):
handle_event(v1, specs, event)
āĻāĻā§āĻ¨ā§āĻāĻāĻŋ āĻĒāĻžāĻāĻ¯āĻŧāĻžāĻ° āĻĒāĻ°ā§, āĻāĻŽāĻ°āĻž āĻāĻāĻŋ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ°āĻŖā§āĻ° āĻŽā§āĻ˛ āĻ¯ā§āĻā§āĻ¤āĻŋāĻ¤ā§ āĻāĻ˛ā§ āĻ¯āĻžāĻ:
# ĐĸиĐŋŅ ŅОйŅŅиК, ĐŊĐ° ĐēĐžŅĐžŅŅĐĩ ĐąŅĐ´ĐĩĐŧ ŅĐĩĐ°ĐŗиŅОваŅŅ
ALLOWED_EVENT_TYPES = {'ADDED', 'UPDATED'}
def handle_event(v1, specs, event):
if event['type'] not in ALLOWED_EVENT_TYPES:
return
object_ = event['object']
labels = object_['metadata'].get('labels', {})
# ĐŅĐĩĐŧ ŅОвĐŋĐ°Đ´ĐĩĐŊиŅ ĐŋĐž selector'Ņ
for key, value in specs['selector'].items():
if labels.get(key) != value:
return
# ĐĐžĐģŅŅĐ°ĐĩĐŧ Đ°ĐēŅивĐŊŅĐĩ namespace'Ņ
namespaces = map(
lambda x: x.metadata.name,
filter(
lambda x: x.status.phase == 'Active',
v1.list_namespace().items
)
)
for namespace in namespaces:
# ĐŅиŅĐ°ĐĩĐŧ ĐŧĐĩŅĐ°Đ´Đ°ĐŊĐŊŅĐĩ, ŅŅŅĐ°ĐŊавĐģиваĐĩĐŧ namespace
object_['metadata'] = {
'labels': object_['metadata']['labels'],
'namespace': namespace,
'name': object_['metadata']['name'],
}
# ĐŅСŅваĐĩĐŧ ĐŧĐĩŅОд ŅОСдаĐŊиŅ/ОйĐŊОвĐģĐĩĐŊиŅ ОйŅĐĩĐēŅĐ°
methodcaller(
CREATE_TYPES_MAP[specs['ruleType']],
namespace,
object_
)(v1)
āĻŽā§āĻ˛ āĻ¯ā§āĻā§āĻ¤āĻŋ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤! āĻāĻāĻ¨ āĻāĻŽāĻžāĻĻā§āĻ° āĻāĻ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻāĻāĻāĻŋ āĻĒāĻžāĻāĻĨāĻ¨ āĻĒā§āĻ¯āĻžāĻā§āĻā§ āĻĒā§āĻ¯āĻžāĻā§āĻ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤ āĻāĻŽāĻ°āĻž āĻĢāĻžāĻāĻ˛ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻāĻ°āĻŋ 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='[email protected]',
include_package_data=True,
install_requires=[
'kubernetes==9.0.0',
],
entry_points={
'console_scripts': [
'{0} = {0}.cli:main'.format(_NAME),
]
}
)
NB: āĻĒāĻžāĻāĻĨāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ kubernetes āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻ°āĻ¯āĻŧā§āĻā§āĨ¤ āĻā§āĻ˛āĻžāĻ¯āĻŧā§āĻ¨ā§āĻ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖ āĻāĻŦāĻ Kubernetes āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖāĻā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻ¸āĻžāĻŽāĻā§āĻāĻ¸ā§āĻ¯ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻā§ āĻāĻ°āĻ āĻ¤āĻĨā§āĻ¯ āĻĒāĻžāĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§
āĻāĻāĻ¨ āĻāĻŽāĻžāĻĻā§āĻ° āĻĒā§āĻ°āĻāĻ˛ā§āĻĒ āĻāĻ āĻŽāĻ¤ āĻĻā§āĻāĻžāĻ¯āĻŧ:
copyrator
âââ copyrator
â âââ cli.py # ĐĐžĐŗиĐēĐ° ŅайОŅŅ Ņ ĐēĐžĐŧĐ°ĐŊĐ´ĐŊОК ŅŅŅĐžĐēОК
â âââ constant.py # ĐĐžĐŊŅŅĐ°ĐŊŅŅ, ĐēĐžŅĐžŅŅĐĩ ĐŧŅ ĐŋŅивОдиĐģи вŅŅĐĩ
â âââ load_crd.py # ĐĐžĐŗиĐēĐ° СаĐŗŅŅСĐēи CRD
â âââ operator.py # ĐŅĐŊОвĐŊĐ°Ņ ĐģĐžĐŗиĐēĐ° ŅайОŅŅ ĐžĐŋĐĩŅĐ°ŅĐžŅĐ°
âââ setup.py # ĐŅĐžŅĐŧĐģĐĩĐŊиĐĩ ĐŋĐ°ĐēĐĩŅĐ°
āĻĄāĻāĻžāĻ° āĻāĻŦāĻ āĻšā§āĻ˛āĻŽ
āĻĄāĻāĻžāĻ°āĻĢāĻžāĻāĻ˛āĻāĻŋ āĻ āĻŦāĻŋāĻļā§āĻŦāĻžāĻ¸ā§āĻ¯āĻāĻžāĻŦā§ āĻ¸āĻšāĻ āĻšāĻŦā§: āĻŦā§āĻ¸ āĻĒāĻžāĻāĻĨāĻ¨-āĻāĻ˛ā§āĻĒāĻžāĻāĻ¨ āĻāĻŽā§āĻ āĻ¨āĻŋāĻ¨ āĻāĻŦāĻ āĻāĻŽāĻžāĻĻā§āĻ° āĻĒā§āĻ¯āĻžāĻā§āĻ āĻāĻ¨āĻ¸ā§āĻāĻ˛ āĻāĻ°ā§āĻ¨āĨ¤ āĻāĻ° āĻ āĻĒā§āĻāĻŋāĻŽāĻžāĻāĻā§āĻļāĻžāĻ¨āĻāĻŋ āĻāĻ°āĻ āĻāĻžāĻ˛ āĻ¸āĻŽāĻ¯āĻŧ āĻĒāĻ°ā§āĻ¯āĻ¨ā§āĻ¤ āĻ¸ā§āĻĨāĻāĻŋāĻ¤ āĻāĻ°āĻž āĻ¯āĻžāĻ:
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 }}
āĻĢāĻ˛āĻžāĻĢāĻ˛
āĻāĻāĻžāĻŦā§āĻ, āĻāĻ¯āĻŧ, āĻ¤āĻŋāĻ°āĻ¸ā§āĻāĻžāĻ° āĻŦāĻž Go āĻļā§āĻāĻž āĻāĻžāĻĄāĻŧāĻžāĻ, āĻāĻŽāĻ°āĻž āĻĒāĻžāĻāĻĨāĻ¨ā§ Kubernetes-āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŽāĻžāĻĻā§āĻ° āĻ¨āĻŋāĻāĻ¸ā§āĻŦ āĻ āĻĒāĻžāĻ°ā§āĻāĻ° āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻ¯āĻŧā§āĻāĻŋāĨ¤ āĻ āĻŦāĻļā§āĻ¯āĻ, āĻāĻāĻŋāĻ° āĻāĻāĻ¨āĻ āĻŦāĻžāĻĄāĻŧāĻ¤ā§ āĻāĻžāĻ¯āĻŧāĻāĻž āĻ°āĻ¯āĻŧā§āĻā§: āĻāĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§ āĻāĻāĻŋ āĻāĻāĻžāĻ§āĻŋāĻ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻĒā§āĻ°āĻā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻāĻ°āĻ¤ā§ āĻ¸āĻā§āĻˇāĻŽ āĻšāĻŦā§, āĻāĻāĻžāĻ§āĻŋāĻ āĻĨā§āĻ°ā§āĻĄā§ āĻāĻžāĻ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŦā§, āĻ¸ā§āĻŦāĻžāĻ§ā§āĻ¨āĻāĻžāĻŦā§ āĻāĻ° CRD-āĻ¤ā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻā§āĻ˛āĻŋ āĻ¨āĻŋāĻ°ā§āĻā§āĻˇāĻŖ āĻāĻ°āĻ¤ā§ āĻĒāĻžāĻ°āĻŦā§...
āĻāĻĒāĻ¨āĻžāĻā§ āĻā§āĻĄāĻāĻŋ āĻāĻ¨āĻŋāĻˇā§āĻ āĻāĻžāĻŦā§ āĻĻā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻŽāĻ°āĻž āĻāĻāĻŋ āĻ°ā§āĻā§āĻāĻŋ
PS āĻāĻŦāĻ āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻā§āĻŦāĻžāĻ°āĻ¨ā§āĻāĻ¸ āĻāĻā§āĻ¨ā§āĻāĻā§āĻ˛āĻŋ āĻŽā§āĻāĻžāĻŦā§āĻ˛āĻž āĻāĻ°āĻ¤ā§ āĻā§āĻŦ āĻ
āĻ˛āĻ¸ āĻšāĻ¨ āĻŦāĻž āĻāĻĒāĻ¨āĻŋ āĻŦā§āĻ¯āĻžāĻļ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°ā§ āĻāĻ°āĻ āĻ
āĻā§āĻ¯āĻ¸ā§āĻ¤ āĻšāĻ¨, āĻāĻŽāĻžāĻĻā§āĻ° āĻ¸āĻšāĻāĻ°ā§āĻŽā§āĻ°āĻž āĻĢāĻ°ā§āĻŽāĻāĻŋāĻ¤ā§ āĻāĻāĻāĻŋ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻāĻ°ā§āĻā§āĻ¨
PPS
āĻāĻŽāĻžāĻĻā§āĻ° āĻŦā§āĻ˛āĻā§āĻ āĻĒāĻĄāĻŧā§āĻ¨:
- ÂĢ
āĻāĻāĻāĻŋ Kubernetes āĻā§āĻ˛āĻžāĻ¸ā§āĻāĻžāĻ° āĻĒā§āĻ°āĻ¸ā§āĻ¤ā§āĻ¤ āĻāĻ°āĻž āĻāĻŋ āĻ¸āĻšāĻ āĻāĻŦāĻ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻāĻ¨āĻ? āĻ ā§āĻ¯āĻžāĻĄāĻ āĻ¨-āĻ āĻĒāĻžāĻ°ā§āĻāĻ° āĻā§āĻˇāĻŖāĻž āĻāĻ°āĻž āĻšāĻā§āĻā§ "; - ÂĢ
āĻļā§āĻ˛-āĻ āĻĒāĻžāĻ°ā§āĻāĻ° āĻĒā§āĻ°āĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻž āĻšāĻā§āĻā§: Kubernetes-āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻĒāĻžāĻ°ā§āĻāĻ° āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻāĻ°āĻ āĻ¸āĻšāĻ āĻšāĻ¯āĻŧā§āĻā§ "; - ÂĢ
Kubernetes āĻ¸āĻŽā§āĻĒā§āĻ°āĻ¸āĻžāĻ°āĻŖ āĻāĻŦāĻ āĻĒāĻ°āĻŋāĻĒā§āĻ°āĻ (āĻāĻāĻžāĻ°āĻāĻŋāĻ āĻāĻŦāĻ āĻāĻŋāĻĄāĻŋāĻ āĻ°āĻŋāĻĒā§āĻ°ā§āĻ) "; - ÂĢ
āĻāĻŽāĻ°āĻž āĻā§āĻ˛āĻ-āĻ Kubernetes-āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ āĻĒāĻžāĻ°ā§āĻāĻ° āĻ˛āĻŋāĻāĻŋ "; - ÂĢ
āĻā§āĻŦāĻžāĻ°āĻ¨ā§āĻāĻ¸ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ āĻĒāĻžāĻ°ā§āĻāĻ°: āĻ°āĻžāĻˇā§āĻā§āĻ°ā§āĻ¯āĻŧ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨āĻā§āĻ˛āĻŋ āĻā§āĻāĻžāĻŦā§ āĻāĻžāĻ˛āĻžāĻ¤ā§ āĻšāĻ¯āĻŧ Âģ.
āĻāĻ¤ā§āĻ¸: www.habr.com