āĻĢā§āĻ°ā§‡āĻŽāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻāĻŦāĻ‚ SDK āĻ›āĻžāĻĄāĻŧāĻž āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡ Kubernetes āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ°

āĻĢā§āĻ°ā§‡āĻŽāĻ“āĻ¯āĻŧāĻžāĻ°ā§āĻ• āĻāĻŦāĻ‚ SDK āĻ›āĻžāĻĄāĻŧāĻž āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡ Kubernetes āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ°

Go āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ā§‡ āĻĒā§āĻ°ā§‹āĻ—ā§āĻ°āĻžāĻŽāĻŋāĻ‚ āĻ­āĻžāĻˇāĻžāĻ° āĻ‰āĻĒāĻ° āĻāĻ•āĻšā§‡āĻŸāĻŋāĻ¯āĻŧāĻž āĻ…āĻ§āĻŋāĻ•āĻžāĻ° āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻž āĻ˛ā§‹āĻ•ā§‡āĻ°āĻž āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻŦāĻŋāĻŦā§ƒāĻ¤āĻŋ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻŦā§‡āĻ›ā§‡ āĻ¨ā§‡āĻ¯āĻŧāĨ¤ āĻāĻ° āĻœāĻ¨ā§āĻ¯ āĻ‰āĻĻā§āĻĻā§‡āĻļā§āĻ¯āĻŽā§‚āĻ˛āĻ• āĻ•āĻžāĻ°āĻŖ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡, āĻ¯ā§‡āĻŽāĻ¨:

  1. Go-āĻ¤ā§‡ āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ°āĻĻā§‡āĻ° āĻŦāĻŋāĻ•āĻžāĻļā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻļāĻ•ā§āĻ¤āĻŋāĻļāĻžāĻ˛ā§€ āĻ•āĻžāĻ āĻžāĻŽā§‹ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ - āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ° SDK.
  2. Docker āĻāĻŦāĻ‚ Kubernetes āĻāĻ° āĻŽāĻ¤ āĻ—ā§‡āĻŽ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻ•āĻžāĻ°ā§€ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋ Go-āĻ¤ā§‡ āĻ˛ā§‡āĻ–āĻž āĻ†āĻ›ā§‡āĨ¤ Go-āĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ° āĻ˛ā§‡āĻ–āĻž āĻŽāĻžāĻ¨ā§‡ āĻ‡āĻ•ā§‹āĻ¸āĻŋāĻ¸ā§āĻŸā§‡āĻŽā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻāĻ•āĻ‡ āĻ­āĻžāĻˇāĻžāĻ¯āĻŧ āĻ•āĻĨāĻž āĻŦāĻ˛āĻžāĨ¤
  3. Go āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡āĻ° āĻ‰āĻšā§āĻš āĻ•āĻ°ā§āĻŽāĻ•ā§āĻˇāĻŽāĻ¤āĻž āĻāĻŦāĻ‚ āĻŦāĻžāĻ•ā§āĻ¸ā§‡āĻ° āĻŦāĻžāĻ‡āĻ°ā§‡ āĻāĻ•āĻ¯ā§‹āĻ—ā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¸āĻšāĻœ āĻŸā§āĻ˛āĨ¤

NB: āĻŦāĻžāĻ‡ āĻĻā§āĻ¯ āĻ“āĻ¯āĻŧā§‡, āĻ—ā§‹-āĻ¤ā§‡ āĻ†āĻĒāĻ¨āĻžāĻ° āĻ¨āĻŋāĻœā§‡āĻ° āĻŦāĻ•ā§āĻ¤āĻŦā§āĻ¯ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ˛āĻŋāĻ–āĻŦā§‡āĻ¨, āĻ†āĻŽāĻ°āĻž āĻ‡āĻ¤āĻŋāĻŽāĻ§ā§āĻ¯ā§‡ āĻŦāĻ°ā§āĻŖāĻŋāĻ¤ āĻŦāĻŋāĻĻā§‡āĻļā§€ āĻ˛ā§‡āĻ–āĻ• āĻĻā§āĻŦāĻžāĻ°āĻž āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ…āĻ¨ā§āĻŦāĻžāĻĻ āĻāĻ•.

āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¸āĻŽāĻ¯āĻŧā§‡āĻ° āĻ…āĻ­āĻžāĻŦā§‡ āĻŦāĻž āĻ¸āĻšāĻœāĻ­āĻžāĻŦā§‡ āĻŦāĻ˛āĻ¤ā§‡ āĻ—ā§‡āĻ˛ā§‡, āĻ…āĻ¨ā§āĻĒā§āĻ°ā§‡āĻ°āĻŖāĻžāĻ° āĻ•āĻžāĻ°āĻŖā§‡ āĻ¯āĻĻāĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻ—ā§‹ āĻļā§‡āĻ–āĻž āĻĨā§‡āĻ•ā§‡ āĻŦāĻŋāĻ°āĻ¤ āĻĨāĻžāĻ•ā§‡āĻ¨? āĻ¨āĻŋāĻŦāĻ¨ā§āĻ§āĻŸāĻŋ āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻ•āĻ°ā§‡ āĻ¯ā§‡ āĻ†āĻĒāĻ¨āĻŋ āĻ•ā§€āĻ­āĻžāĻŦā§‡ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻœāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻ­āĻžāĻˇāĻžāĻ—ā§āĻ˛āĻŋāĻ° āĻāĻ•āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ˛ āĻŦāĻŋāĻŦā§ƒāĻ¤āĻŋ āĻ˛āĻŋāĻ–āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĻ¨ āĻ¯āĻž āĻĒā§āĻ°āĻžāĻ¯āĻŧ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ DevOps āĻĒā§āĻ°āĻ•ā§ŒāĻļāĻ˛ā§€ āĻœāĻžāĻ¨ā§‡āĻ¨ - āĻĒāĻžāĻ‡āĻĨāĻ¨.

āĻŽāĻŋāĻŸ: āĻ•āĻĒāĻŋāĻ¯āĻŧāĻžāĻ° - āĻ•āĻĒāĻŋ āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ°!

āĻāĻ•āĻŸāĻŋ āĻ‰āĻĻāĻžāĻšāĻ°āĻŖ āĻšāĻŋāĻ¸āĻžāĻŦā§‡, āĻāĻ•āĻŸāĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ āĻŦāĻŋāĻŦā§ƒāĻ¤āĻŋ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻžāĻ° āĻ•āĻĨāĻž āĻŦāĻŋāĻŦā§‡āĻšāĻ¨āĻž āĻ•āĻ°ā§āĻ¨ āĻ¯āĻž āĻāĻ•āĻŸāĻŋ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻŽā§āĻ¯āĻžāĻĒ āĻ…āĻ¨ā§āĻ˛āĻŋāĻĒāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻ–āĻ¨ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻ¨āĻžāĻŽāĻ¸ā§āĻĨāĻžāĻ¨ āĻ‰āĻĒāĻ¸ā§āĻĨāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻŦāĻž āĻ¯āĻ–āĻ¨ āĻĻā§āĻŸāĻŋ āĻ¸āĻ¤ā§āĻ¤āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻāĻ•āĻŸāĻŋ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻšāĻ¯āĻŧ: āĻ•āĻ¨āĻĢāĻŋāĻ—āĻŽā§āĻ¯āĻžāĻĒ āĻāĻŦāĻ‚ āĻ¸āĻŋāĻ•ā§āĻ°ā§‡āĻŸā§ˇ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻŋāĻ• āĻĻā§ƒāĻˇā§āĻŸāĻŋāĻ•ā§‹āĻŖ āĻĨā§‡āĻ•ā§‡, āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ° āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ā§‡āĻ° āĻŦāĻžāĻ˛ā§āĻ• āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ (āĻ•āĻ¨āĻĢāĻŋāĻ—āĻŽā§āĻ¯āĻžāĻĒ āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°ā§‡) āĻŦāĻž āĻ—ā§‹āĻĒāĻ¨ āĻĄā§‡āĻŸāĻž āĻ†āĻĒāĻĄā§‡āĻŸ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĻāĻ°āĻ•āĻžāĻ°ā§€ āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ - āĻ‰āĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§‚āĻĒ, āĻĄāĻ•āĻžāĻ° āĻ°ā§‡āĻœāĻŋāĻ¸ā§āĻŸā§āĻ°āĻŋāĻ° āĻ¸āĻžāĻĨā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§€ (āĻ¨ā§‡āĻŽāĻ¸ā§āĻĒā§‡āĻ¸ā§‡ āĻ¸āĻŋāĻ•ā§āĻ°ā§‡āĻŸ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ)āĨ¤

āĻāĻŦāĻ‚ āĻ¤āĻžāĻ‡, āĻāĻ•āĻŸāĻŋ āĻ­āĻžāĻ˛ āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ° āĻ•āĻŋ āĻĨāĻžāĻ•āĻž āĻ‰āĻšāĻŋāĻ¤:

  1. āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ°ā§‡āĻ° āĻ¸āĻžāĻĨā§‡ āĻŽāĻŋāĻĨāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻŦāĻžāĻšāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ•āĻžāĻ¸ā§āĻŸāĻŽ āĻ¸āĻŽā§āĻĒāĻĻ āĻ¸āĻ‚āĻœā§āĻžāĻž (āĻāĻ–āĻ¨ āĻĨā§‡āĻ•ā§‡ CRD āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡)āĨ¤
  2. āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ° āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻž āĻ¯ā§‡āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡. āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻ°āĻž āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ āĻĒāĻ¤āĻžāĻ•āĻž āĻāĻŦāĻ‚ āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦāĨ¤
  3. āĻĄāĻ•āĻžāĻ° āĻ•āĻ¨ā§āĻŸā§‡āĻ‡āĻ¨āĻžāĻ° āĻāĻŦāĻ‚ āĻšā§‡āĻ˛āĻŽ āĻšāĻžāĻ°ā§āĻŸā§‡āĻ° āĻŦāĻŋāĻ˛ā§āĻĄāĻŸāĻŋ āĻāĻŽāĻ¨āĻ­āĻžāĻŦā§‡ āĻĄāĻŋāĻœāĻžāĻ‡āĻ¨ āĻ•āĻ°āĻž āĻšāĻ¯āĻŧā§‡āĻ›ā§‡ āĻ¯āĻžāĻ¤ā§‡ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻ°āĻž āĻ¸āĻšāĻœā§‡āĻ‡ (āĻ†āĻ•ā§āĻˇāĻ°āĻŋāĻ• āĻ…āĻ°ā§āĻĨā§‡ āĻāĻ•āĻŸāĻŋ āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻĻāĻŋāĻ¯āĻŧā§‡) āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ°āĻŸāĻŋāĻ•ā§‡ āĻ¤āĻžāĻĻā§‡āĻ° āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻ•ā§āĻ˛āĻžāĻ¸ā§āĻŸāĻžāĻ°ā§‡ āĻ‡āĻ¨āĻ¸ā§āĻŸāĻ˛ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡āĨ¤

CRD

āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻ•ā§‹āĻ¨ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻāĻŦāĻ‚ āĻ•ā§‹āĻĨāĻžāĻ¯āĻŧ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¤āĻž āĻœāĻžāĻ¨āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻ¤āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻ¸ā§‡āĻŸ āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻāĻ•āĻŸāĻŋ āĻāĻ•āĻ• CRD āĻ…āĻŦāĻœā§‡āĻ•ā§āĻŸ āĻšāĻŋāĻ¸āĻžāĻŦā§‡ āĻ‰āĻĒāĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻ•āĻ°āĻž āĻšāĻŦā§‡āĨ¤ āĻāĻ‡ CRD āĻ•āĻŋ āĻ•ā§āĻˇā§‡āĻ¤ā§āĻ° āĻĨāĻžāĻ•āĻž āĻ‰āĻšāĻŋāĻ¤?

  1. āĻ¸āĻŽā§āĻĒāĻĻā§‡āĻ° āĻ§āĻ°āĻ¨, āĻ¯āĻž āĻ†āĻŽāĻ°āĻž āĻ–ā§āĻāĻœāĻŦ (āĻ•āĻ¨āĻĢāĻŋāĻ—āĻŽā§āĻ¯āĻžāĻĒ āĻŦāĻž āĻ¸āĻŋāĻ•ā§āĻ°ā§‡āĻŸ)āĨ¤
  2. āĻ¨āĻžāĻŽāĻ¸ā§āĻĨāĻžāĻ¨ā§‡āĻ° āĻ¤āĻžāĻ˛āĻŋāĻ•āĻž, āĻ¯āĻžāĻ° āĻŽāĻ§ā§āĻ¯ā§‡ āĻ¸āĻŽā§āĻĒāĻĻ āĻĨāĻžāĻ•āĻž āĻ‰āĻšāĻŋāĻ¤āĨ¤
  3. āĻ¨āĻŋāĻ°ā§āĻŦāĻžāĻšāĻ•, āĻ¯āĻžāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž āĻ†āĻŽāĻ°āĻž āĻ¨āĻžāĻŽāĻ¸ā§āĻĨāĻžāĻ¨ā§‡ āĻ¸āĻ‚āĻ¸ā§āĻĨāĻžāĻ¨āĻ—ā§āĻ˛āĻŋ āĻ…āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻ•āĻ°āĻŦāĨ¤

āĻ†āĻ¸ā§āĻ¨ 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 āĻ¸āĻžāĻ°ā§āĻ­āĻžāĻ°ā§‡ āĻ…āĻ¨ā§āĻ°ā§‹āĻ§ āĻ˛āĻŋāĻ–āĻŦ āĻ¨āĻžāĨ¤ āĻāĻŸāĻŋ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻ†āĻŽāĻ°āĻž āĻāĻ•āĻŸāĻŋ āĻ°ā§‡āĻĄāĻŋāĻŽā§‡āĻĄ āĻĒāĻžāĻ‡āĻĨāĻ¨ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻŦ kubernetes-āĻ•ā§āĻ˛āĻžāĻ¯āĻŧā§‡āĻ¨ā§āĻŸ:

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']}

āĻĻā§āĻ°ā§āĻĻāĻžāĻ¨ā§āĻ¤: āĻ†āĻŽāĻ°āĻž āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ°ā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ•āĻŸāĻŋ āĻ¨āĻŋāĻ¯āĻŧāĻŽ āĻĒā§‡āĻ¤ā§‡ āĻĒā§‡āĻ°ā§‡āĻ›āĻŋāĨ¤ āĻāĻŦāĻ‚ āĻ¸āĻŦāĻšā§‡āĻ¯āĻŧā§‡ āĻ—ā§āĻ°ā§āĻ¤ā§āĻŦāĻĒā§‚āĻ°ā§āĻŖ, āĻ†āĻŽāĻ°āĻž āĻ•ā§āĻŦāĻžāĻ°āĻ¨ā§‡āĻŸāĻ¸ āĻ‰āĻĒāĻžāĻ¯āĻŧ āĻŦāĻ˛ā§‡āĻ›āĻŋāĨ¤

āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻļā§€āĻ˛ āĻŦāĻž āĻĒāĻ¤āĻžāĻ•āĻž? āĻ†āĻŽāĻ°āĻž āĻ¸āĻŦ āĻ¨āĻŋāĻ¤ā§‡!

āĻŽā§‚āĻ˛ āĻ…āĻĒāĻžāĻ°ā§‡āĻŸāĻ° āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ°ā§‡āĻļāĻ¨ā§‡ āĻ¯āĻžāĻ“āĻ¯āĻŧāĻž āĻ¯āĻžāĻ•āĨ¤ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻ•āĻ¨āĻĢāĻŋāĻ—āĻžāĻ° āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻĻā§āĻŸāĻŋ āĻŽā§ŒāĻ˛āĻŋāĻ• āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻ†āĻ›ā§‡:

  1. āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨;
  2. āĻĒāĻ°āĻŋāĻŦā§‡āĻļ āĻ­ā§‡āĻ°āĻŋāĻ¯āĻŧā§‡āĻŦāĻ˛ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§āĻ¨āĨ¤

āĻ•āĻŽāĻžāĻ¨ā§āĻĄ āĻ˛āĻžāĻ‡āĻ¨ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāĻ—ā§āĻ˛āĻŋ āĻ†āĻĒāĻ¨āĻžāĻ•ā§‡ āĻĄā§‡āĻŸāĻž āĻŸāĻžāĻ‡āĻĒ āĻ¸āĻŽāĻ°ā§āĻĨāĻ¨ āĻāĻŦāĻ‚ āĻŦā§ˆāĻ§āĻ¤āĻž āĻ¸āĻš āĻ†āĻ°āĻ“ āĻ¨āĻŽāĻ¨ā§€āĻ¯āĻŧāĻ­āĻžāĻŦā§‡ āĻ¸ā§‡āĻŸāĻŋāĻ‚āĻ¸ āĻĒāĻĄāĻŧāĻ¤ā§‡ āĻĻā§‡āĻ¯āĻŧāĨ¤ āĻĒāĻžāĻ‡āĻĨāĻ¨ā§‡āĻ° āĻ¸ā§āĻŸā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ āĻ˛āĻžāĻ‡āĻŦā§āĻ°ā§‡āĻ°āĻŋāĻ¤ā§‡ āĻāĻ•āĻŸāĻŋ āĻŽāĻĄāĻŋāĻ‰āĻ˛ āĻ°āĻ¯āĻŧā§‡āĻ›ā§‡ 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

āĻ†āĻŽāĻžāĻĻā§‡āĻ° āĻŦā§āĻ˛āĻ—ā§‡āĻ“ āĻĒāĻĄāĻŧā§āĻ¨:

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨