ການຍ້າຍຂອງ Tinder ໄປ Kubernetes

ຂຽນໂດຍ: Chris O'Brien, ຜູ້ຈັດການດ້ານວິສະວະ ກຳ | Chris Thomas, ຜູ້ຈັດການດ້ານວິສະວະ ກຳ | Jinyong Lee, ວິສະວະກອນຊອຟແວອາວຸໂສ | ແກ້ໄຂໂດຍ: Cooper Jackson, ວິສະວະກອນຊອບແວ

ເປັນຫຍັງ

ເກືອບສອງປີທີ່ຜ່ານມາ, Tinder ໄດ້ຕັດສິນໃຈຍ້າຍເວທີຂອງຕົນໄປ Kubernetes. Kubernetes ໄດ້ໃຫ້ພວກເຮົາມີໂອກາດທີ່ຈະຂັບເຄື່ອນ Tinder ວິສະວະ ກຳ ໄປສູ່ການບັນຈຸພາຫະນະແລະການປະຕິບັດງານທີ່ມີປະສິດຕິພາບຕໍ່າໂດຍຜ່ານການປະຕິບັດງານທີ່ບໍ່ປ່ຽນແປງ. ການສ້າງ, ການ ນຳ ໃຊ້, ແລະໂຄງລ່າງພື້ນຖານຈະຖືກ ກຳ ນົດເປັນລະຫັດ.

ພວກເຮົາ ກຳ ລັງຊອກຫາເພື່ອແກ້ໄຂສິ່ງທ້າທາຍຂອງຂະ ໜາດ ແລະສະຖຽນລະພາບ. ໃນເວລາທີ່ການຂະຫຍາຍກາຍເປັນສິ່ງທີ່ ສຳ ຄັນ, ພວກເຮົາມັກຈະປະສົບກັບຄວາມຫຍຸ້ງຍາກໃນຫລາຍໆນາທີຂອງການລໍຖ້າໃຫ້ຕົວຢ່າງ EC2 ໃໝ່ ເຂົ້າມາ online. ແນວຄວາມຄິດຂອງບັນຈຸການຈັດຕາຕະລາງແລະຮັບໃຊ້ການຈະລາຈອນພາຍໃນວິນາທີທີ່ກົງກັນຂ້າມກັບນາທີໄດ້ຖືກດຶງດູດໃຫ້ພວກເຮົາ.

ມັນບໍ່ແມ່ນເລື່ອງງ່າຍ. ໃນລະຫວ່າງການເຄື່ອນຍ້າຍແຮງງານຂອງພວກເຮົາໃນຕົ້ນປີ 2019, ພວກເຮົາໄດ້ບັນລຸມະຫາຊົນທີ່ ສຳ ຄັນພາຍໃນກຸ່ມກຸ່ມ Kubernetes ຂອງພວກເຮົາແລະເລີ່ມປະສົບກັບສິ່ງທ້າທາຍຕ່າງໆເນື່ອງຈາກປະລິມານການຈະລາຈອນ, ຂະ ໜາດ ຂອງກຸ່ມແລະ DNS. ພວກເຮົາແກ້ໄຂບັນດາສິ່ງທ້າທາຍທີ່ ໜ້າ ສົນໃຈໃນການເຄື່ອນຍ້າຍ 200 ບໍລິການແລະແລ່ນກຸ່ມບ້ານ Kubernetes ທີ່ມີຂະ ໜາດ ລວມທັງ ໝົດ 1,000 ຂໍ້, 15,000 ຝັກ, ແລະຕູ້ຄອນເທັນເນີ 48,000 ໜ່ວຍ.

ແນວໃດ

ເລີ່ມຕົ້ນເດືອນມັງກອນ 2018, ພວກເຮົາໄດ້ເຮັດວຽກຂອງພວກເຮົາໂດຍຜ່ານໄລຍະຕ່າງໆຂອງຄວາມພະຍາຍາມອົບພະຍົບ. ພວກເຮົາໄດ້ເລີ່ມຕົ້ນໂດຍການບັນຈຸທຸກການບໍລິການຂອງພວກເຮົາແລະ ນຳ ໃຊ້ເຂົ້າໃນຊຸດຕ່າງໆຂອງ Kubernetes ທີ່ເປັນເຈົ້າພາບ. ເລີ່ມຕົ້ນເດືອນຕຸລາ, ພວກເຮົາໄດ້ເລີ່ມຕົ້ນການຍ້າຍການບໍລິການມໍລະດົກທັງ ໝົດ ຂອງພວກເຮົາໄປທີ່ Kubernetes. ຮອດເດືອນມີນາປີ ໜ້າ, ພວກເຮົາໄດ້ ສຳ ເລັດການຍ້າຍຖິ່ນຖານຂອງພວກເຮົາແລະ Tinder Platform ປະຈຸບັນແລ່ນສະເພາະແຕ່ Kubernetes.

ຮູບພາບການກໍ່ສ້າງ ສຳ ລັບ Kubernetes

ມັນມີຫຼາຍກວ່າ 30 ບ່ອນເກັບມ້ຽນລະຫັດ ສຳ ລັບກ້ອງຈຸລະທັດທີ່ ກຳ ລັງແລ່ນຢູ່ໃນກຸ່ມກຸ່ມ Kubernetes. ລະຫັດໃນຫໍສະມຸດເຫຼົ່ານີ້ແມ່ນຂຽນເປັນພາສາທີ່ແຕກຕ່າງກັນ (ຕົວຢ່າງ: Node.js, Java, Scala, Go) ທີ່ມີສະພາບແວດລ້ອມທີ່ໃຊ້ເວລາຫຼາຍຊົ່ວໂມງ ສຳ ລັບພາສາດຽວກັນ.

ລະບົບການກໍ່ສ້າງໄດ້ຖືກອອກແບບມາເພື່ອປະຕິບັດງານຕາມສະພາບການກໍ່ສ້າງທີ່ສາມາດປັບແຕ່ງໄດ້ຢ່າງສົມບູນ ສຳ ລັບແຕ່ລະ microservice ເຊິ່ງ ທຳ ມະດາປະກອບດ້ວຍ Dockerfile ແລະຊຸດຂອງ ຄຳ ສັ່ງຫອຍ. ໃນຂະນະທີ່ເນື້ອໃນຂອງພວກເຂົາສາມາດປັບແຕ່ງໄດ້ຢ່າງເຕັມສ່ວນ, ສະພາບການກໍ່ສ້າງເຫຼົ່ານີ້ລ້ວນແຕ່ຂຽນໂດຍປະຕິບັດຕາມແບບແຜນມາດຕະຖານ. ການ ກຳ ນົດມາດຕະຖານຂອງສະພາບການກໍ່ສ້າງຊ່ວຍໃຫ້ລະບົບການກໍ່ສ້າງແບບດຽວສາມາດຈັດການກັບລະບົບຈຸລະພາກທັງ ໝົດ.

ຮູບທີ 1– ຂັ້ນຕອນການກໍ່ສ້າງແບບມາດຕະຖານຜ່ານຕູ້ຄອນເທນເນີ

ເພື່ອບັນລຸຄວາມສອດຄ່ອງສູງສຸດລະຫວ່າງສະພາບແວດລ້ອມໃນໄລຍະເວລາແລ່ນ, ຂະບວນການກໍ່ສ້າງແບບດຽວກັນແມ່ນຖືກ ນຳ ໃຊ້ໃນໄລຍະການພັດທະນາແລະທົດສອບ. ສິ່ງນີ້ໄດ້ສ້າງສິ່ງທ້າທາຍທີ່ເປັນເອກະລັກເມື່ອພວກເຮົາຕ້ອງການສ້າງແຜນການເພື່ອຮັບປະກັນສະພາບແວດລ້ອມການກໍ່ສ້າງທີ່ສອດຄ່ອງກັນທົ່ວເວທີ. ດ້ວຍເຫດນັ້ນ, ທຸກໆຂັ້ນຕອນການກໍ່ສ້າງແມ່ນຖືກປະຕິບັດຢູ່ໃນຖັງ“ ຜູ້ສ້າງ” ພິເສດ.

ການປະຕິບັດຕູ້ຄອນເທນເນີ Builder ຕ້ອງການເຕັກນິກ Docker ຂັ້ນສູງ ຈຳ ນວນ ໜຶ່ງ. ຕູ້ຄອນເທນເນີ Builder ນີ້ສືບທອດລະຫັດຜູ້ໃຊ້ແລະຄວາມລັບຂອງຜູ້ໃຊ້ໃນທ້ອງຖິ່ນ (ຕົວຢ່າງ: ລະຫັດ SSH, ໃບຢັ້ງຢືນ AWS, ແລະອື່ນໆ) ຕາມຄວາມຕ້ອງການໃນການເຂົ້າເຖິງຫໍສະມຸດສ່ວນຕົວ Tinder. ມັນຕິດຕັ້ງບັນດາໄດເລກະທໍລີທ້ອງຖິ່ນທີ່ມີລະຫັດແຫຼ່ງຂໍ້ມູນເພື່ອໃຫ້ມີວິທີທາງ ທຳ ມະຊາດໃນການເກັບມ້ຽນຂອງປອມ. ວິທີການນີ້ຊ່ວຍເພີ່ມປະສິດທິພາບ, ເພາະວ່າມັນ ກຳ ຈັດການຄັດລອກປອມທີ່ສ້າງຂຶ້ນລະຫວ່າງຕູ້ຄອນເທນເນີແລະເຄື່ອງຈັກ. ຂອງປອມທີ່ເກັບຮັກສາໄວ້ໄດ້ຖືກ ນຳ ໃຊ້ຄືນ ໃໝ່ ໃນຄັ້ງຕໍ່ໄປໂດຍບໍ່ມີການ ກຳ ນົດເພີ່ມເຕີມ.

ສຳ ລັບການບໍລິການບາງຢ່າງ, ພວກເຮົາ ຈຳ ເປັນຕ້ອງສ້າງພາຊະນະອື່ນພາຍໃນ Builder ເພື່ອໃຫ້ກົງກັບສະພາບແວດລ້ອມທີ່ໃຊ້ເວລາລວບລວມກັບສະພາບແວດລ້ອມທີ່ໃຊ້ເວລາແລ່ນ (ຕົວຢ່າງ: ການຕິດຕັ້ງຫໍສະ ໝຸດ Node.js bcrypt ສ້າງຜະລິດຕະພັນປອມຖານສອງແບບຂອງເວທີ). ຄວາມຕ້ອງການການລວບລວມເວລາອາດຈະແຕກຕ່າງກັນລະຫວ່າງການບໍລິການແລະ Dockerfile ສຸດທ້າຍແມ່ນປະກອບດ້ວຍການບິນ.

ສະຖາປັດຕະຍະ ກຳ ຂອງກຸ່ມ Kubernetes ແລະການຍ້າຍຖິ່ນ

Cluster Sizing

ພວກເຮົາໄດ້ຕັດສິນໃຈໃຊ້ kube-aws ສຳ ລັບການສະ ໜອງ ກຸ່ມອັດຕະໂນມັດໃນກໍລະນີ Amazon EC2. ໃນຕອນເລີ່ມຕົ້ນ, ພວກເຮົາໄດ້ແລ່ນທຸກຢ່າງຢູ່ໃນສະລອຍນ້ ຳ ຂໍ້ ໜຶ່ງ ທົ່ວໄປ. ພວກເຮົາໄດ້ ກຳ ນົດຢ່າງໄວວາຄວາມ ຈຳ ເປັນໃນການແຍກ ຈຳ ນວນວຽກຕ່າງໆອອກເປັນຫລາຍຂະ ໜາດ ແລະປະເພດຕ່າງໆ, ເພື່ອ ນຳ ໃຊ້ຊັບພະຍາກອນທີ່ດີຂື້ນ. ເຫດຜົນແມ່ນວ່າການແລ່ນຝັກທີ່ມີກະທູ້ ໜັກ ໜ້ອຍ ກວ່າກັນຈະເຮັດໃຫ້ພວກເຮົາສາມາດຄາດເດົາໄດ້ຫຼາຍກວ່າການປ່ອຍໃຫ້ພວກມັນຢູ່ຮ່ວມກັນກັບ ຈຳ ນວນເສັ້ນຝັກທີ່ມີເສັ້ນດ່ຽວ.

ພວກເຮົາໄດ້ຕົກລົງ:

  • m5.4x ຂະຫຍາຍເພື່ອຕິດຕາມ (Prometheus)
  • c5.4xlarge ສຳ ລັບວຽກງານຂອງ Node.js (ວຽກງານທີ່ມີສາຍດຽວ)
  • c5.2xlarge ສຳ ລັບ Java ແລະ Go (ການເຮັດວຽກຫຼາຍກະທູ້)
  • c5.4xlarge ສຳ ລັບຍົນຄວບຄຸມ (3 ຂໍ້)

ການອົບພະຍົບ

ໜຶ່ງ ໃນບາດກ້າວກະກຽມ ສຳ ລັບການເຄື່ອນຍ້າຍຈາກພື້ນຖານໂຄງລ່າງມໍລະດົກຂອງພວກເຮົາໄປສູ່ Kubernetes ແມ່ນການປ່ຽນແປງການສື່ສານການບໍລິການທີ່ມີຢູ່ເພື່ອຊີ້ໃຫ້ເຫັນ Elastic Load Balancers (ELBs) ໃໝ່ ທີ່ຖືກສ້າງຂື້ນໃນ subnet ສະເພາະ Virtual Private Cloud (VPC). subnet ນີ້ໄດ້ຖືກໄປຫາ Kubernetes VPC. ນີ້ອະນຸຍາດໃຫ້ພວກເຮົາເຄື່ອນຍ້າຍແບບໂມດູນແບບລະອຽດໂດຍບໍ່ກ່ຽວຂ້ອງກັບການສັ່ງຊື້ສະເພາະ ສຳ ລັບການເພິ່ງພາອາໄສການບໍລິການ.

ຈຸດຈົບເຫຼົ່ານີ້ຖືກສ້າງຂື້ນໂດຍໃຊ້ຊຸດບັນທຶກນ້ ຳ ໜັກ DNS ທີ່ມີ CNAME ຊີ້ໃຫ້ແຕ່ລະ ELB ໃໝ່. ເພື່ອຕັດເຄື່ອງ, ພວກເຮົາໄດ້ເພີ່ມບັນທຶກ ໃໝ່, ຊີ້ໄປທີ່ ELB ບໍລິການ Kubernetes ໃໝ່, ມີນ້ ຳ ໜັກ 0. ພວກເຮົາຕັ້ງເວລາທີ່ຈະ ດຳ ລົງຊີວິດ (TTL) ໃສ່ບັນທຶກທີ່ ກຳ ນົດໄວ້ 0. ນ້ ຳ ໜັກ ເກົ່າແລະ ໃໝ່ ຫຼັງຈາກນັ້ນໄດ້ປັບຕົວຊ້າລົງ ໃນທີ່ສຸດມັນຈະສິ້ນສຸດເຖິງ 100% ໃນເຄື່ອງແມ່ຂ່າຍໃຫມ່. ຫຼັງຈາກການຕັດເຄື່ອງ ສຳ ເລັດແລ້ວ, TTL ໄດ້ຖືກ ກຳ ນົດໃຫ້ເປັນສິ່ງທີ່ສົມເຫດສົມຜົນກວ່າ.

ໂມດູນ Java ຂອງພວກເຮົາໃຫ້ກຽດແກ່ DNS TTL ຕ່ ຳ, ແຕ່ວ່າໂປແກຼມ Node ຂອງພວກເຮົາບໍ່ໄດ້ເຮັດ. ວິສະວະກອນຄົນ ໜຶ່ງ ຂອງພວກເຮົາຂຽນຄືນສ່ວນ ໜຶ່ງ ຂອງລະຫັດສະລອຍນ້ ຳ ເຊື່ອມຕໍ່ເພື່ອຫໍ່ມັນໄວ້ໃນຜູ້ຈັດການທີ່ຈະເຮັດໃຫ້ສະລອຍ ນຳ ້ທຸກໆ 60 ປີ. ສິ່ງນີ້ເຮັດວຽກໄດ້ດີ ສຳ ລັບພວກເຮົາໂດຍບໍ່ມີການຕີລາຄາສູງຕໍ່ການປະຕິບັດ.

ການຮຽນຮູ້

ຂໍ້ ຈຳ ກັດຜ້າເຄືອຂ່າຍ

ໃນຕອນເຊົ້າມືດຂອງວັນທີ 8 ມັງກອນ 2019, ເວທີ Tinder ໄດ້ປະສົບກັບໄຟ ໄໝ້ ຢ່າງຕໍ່ເນື່ອງ. ເພື່ອຕອບສະ ໜອງ ການເພີ່ມຂື້ນຂອງເວທີທີ່ບໍ່ກ່ຽວຂ້ອງໃນຕອນເຊົ້າຂອງເຊົ້າມື້ນັ້ນ, ການນັບ ຈຳ ນວນຝັກແລະຂໍ້ໄດ້ຖືກຂະຫຍາຍລົງເປັນກຸ່ມ. ນີ້ສົ່ງຜົນໃຫ້ ARP ໝົດ ຄວາມ ຈຳ ຂອງ cache.

ມັນມີຄຸນຄ່າ Linux ສາມຢ່າງທີ່ກ່ຽວຂ້ອງກັບ cache ຂອງ ARP:

ການປ່ອຍສິນເຊື່ອ

gc_thresh3 ແມ່ນ ໝວກ ທີ່ແຂງ. ຖ້າທ່ານ ກຳ ລັງເກັບບັນທຶກຂໍ້ມູນເຂົ້າບັນຊີຂອງເພື່ອນບ້ານ, ມັນສະແດງໃຫ້ເຫັນວ່າເຖິງແມ່ນວ່າຫຼັງຈາກການເກັບຂີ້ເຫຍື້ອ (GC) ຂອງ ARP cache, ມັນບໍ່ມີຫ້ອງພຽງພໍທີ່ຈະເກັບເຂົ້າປະເທດເພື່ອນບ້ານ. ໃນກໍລະນີນີ້, ແກ່ນພຽງແຕ່ເອົາຊອງລົງທັງ ໝົດ.

ພວກເຮົາໃຊ້ Flannel ເປັນຜ້າເຄືອຂ່າຍຂອງພວກເຮົາໃນ Kubernetes. ແພັກເກັດຖືກສົ່ງຜ່ານ VXLAN. VXLAN ແມ່ນລະບົບຊັ້ນຂໍ້ມູນຊັ້ນ 2 ໃນເຄືອຂ່າຍຊັ້ນ 3. ມັນໃຊ້ MAC Address-in-User Datagram Protocol (MAC-in-UDP) encapsulation ເພື່ອໃຫ້ມີວິທີການຂະຫຍາຍສ່ວນເຄືອຂ່າຍຊັ້ນ 2. ໂປໂຕຄອນການຂົນສົ່ງຜ່ານເຄືອຂ່າຍສູນຂໍ້ມູນທາງກາຍະພາບແມ່ນ IP ບວກກັບ UDP.

ຮູບພາບ 2–1 ແຜນວາດ Flannel (credit)

ຮູບທີ 2– ຊຸດ VXLAN (credit)

ແຕ່ລະບ່ອນເຮັດວຽກຂອງ Kubernetes ຈັດສັນພື້ນທີ່ທີ່ຢູ່ຂອງຕົນເອງ / 24 ຈາກຊ່ອງທີ່ໃຫຍ່ກວ່າ / 9. ສຳ ລັບແຕ່ລະ node, ຜົນໄດ້ຮັບນີ້ເຂົ້າ 1 ຕາຕະລາງເສັ້ນທາງ, 1 ຕາຕະລາງເຂົ້າ ARP (ໃນການໂຕ້ຕອບ flannel.1), ແລະການເຂົ້າຖານຂໍ້ມູນສົ່ງຕໍ່ 1 ຕໍ່ (ຖານຂໍ້ມູນ FDB). ສິ່ງເຫຼົ່ານີ້ຈະຖືກເພີ່ມເມື່ອ node ພະນັກງານເປີດຕົວຄັ້ງ ທຳ ອິດຫຼືເມື່ອພົບວ່າ node ໃໝ່ ແຕ່ລະອັນ.

ນອກຈາກນັ້ນ, ການສື່ສານແບບ node-to-pod (ຫຼື pod-to-pod) ໃນທີ່ສຸດກໍ່ຈະໄຫຼຜ່ານອິນເຕີເຟດ eth0 (ສະແດງໃນແຜນວາດ Flannel ຂ້າງເທິງ). ນີ້ຈະສົ່ງຜົນໃຫ້ມີການປ້ອນຂໍ້ມູນເພີ່ມເຕີມໃນຕາຕະລາງ ARP ສຳ ລັບແຕ່ລະແຫລ່ງຂໍ້ມູນແລະຈຸດ ໝາຍ ປາຍທາງທີ່ສອດຄ້ອງກັນ.

ໃນສະພາບແວດລ້ອມຂອງພວກເຮົາ, ການສື່ສານແບບນີ້ແມ່ນ ທຳ ມະດາ. ສຳ ລັບວັດຖຸການບໍລິການ Kubernetes ຂອງພວກເຮົາ, ELB ຖືກສ້າງຂື້ນແລະ Kubernetes ລົງທະບຽນທຸກໆລະບົບທີ່ມີ ELB. ELB ແມ່ນບໍ່ຮູ້ຈັກແລະ node ທີ່ຖືກຄັດເລືອກອາດຈະບໍ່ແມ່ນຈຸດ ໝາຍ ປາຍທາງສຸດທ້າຍຂອງຊຸດ. ນີ້ແມ່ນຍ້ອນວ່າເມື່ອ node ໄດ້ຮັບ packet ຈາກ ELB, ມັນຈະປະເມີນກົດລະບຽບ iptables ຂອງມັນ ສຳ ລັບການບໍລິການແລະສຸ່ມເລືອກ pod ໃນ node ອື່ນ.

ໃນຊ່ວງເວລາທີ່ມີໄຟລາມ, ມີກຸ່ມ ຈຳ ນວນທັງ ໝົດ 605 ຂໍ້ຢູ່ໃນກຸ່ມ. ສຳ ລັບເຫດຜົນທີ່ໄດ້ກ່າວມາຂ້າງເທິງ, ນີ້ພຽງພໍທີ່ຈະ ກຳ ຈັດຄ່າ gc_thresh3 ໃນຕອນຕົ້ນ. ເມື່ອສິ່ງນີ້ເກີດຂື້ນ, ບໍ່ພຽງແຕ່ແພັກເກັດຖືກລຸດລົງເທົ່ານັ້ນ, ແຕ່ວ່າ Flannel / 24s ທັງ ໝົດ ຂອງທີ່ຢູ່ເສີຍໆກໍ່ຫາຍໄປຈາກຕາຕະລາງ ARP. Node ເພື່ອຝັກການສື່ສານແລະການຊອກຫາ DNS ລົ້ມເຫລວ. (DNS ແມ່ນໂຮດຢູ່ພາຍໃນກຸ່ມ, ດັ່ງທີ່ຈະຖືກອະທິບາຍໃນລາຍລະອຽດທີ່ຍິ່ງໃຫຍ່ກວ່າພາຍຫລັງໃນບົດຄວາມນີ້.)

ເພື່ອແກ້ໄຂ, ຄຸນຄ່າ gc_thresh1, gc_thresh2, ແລະ gc_thresh3 ຖືກຍົກສູງຂຶ້ນແລະ Flannel ຕ້ອງໄດ້ເລີ່ມຕົ້ນ ໃໝ່ ເພື່ອລົງທະບຽນເຄືອຂ່າຍທີ່ຂາດໄປ.

ບໍ່ຄາດຝັນແລ່ນ DNS At Scale

ເພື່ອຮອງຮັບການຍ້າຍຖິ່ນຖານຂອງພວກເຮົາ, ພວກເຮົາໄດ້ໃຊ້ DNS ຢ່າງຫຼວງຫຼາຍເພື່ອ ອຳ ນວຍຄວາມສະດວກໃຫ້ແກ່ການຈະລາຈອນແລະການຕັດເພີ່ມຂື້ນຈາກມໍລະດົກໄປຍັງ Kubernetes ສຳ ລັບການບໍລິການຂອງພວກເຮົາ. ພວກເຮົາ ກຳ ນົດຄ່າ TTL ທີ່ຂ້ອນຂ້າງຕໍ່າຢູ່ໃນເສັ້ນທາງ Record3 ທີ່ມີສ່ວນກ່ຽວຂ້ອງ. ເມື່ອພວກເຮົາ ດຳ ເນີນໂຄງສ້າງພື້ນຖານມໍລະດົກຂອງພວກເຮົາໃນກໍລະນີ EC2, ການຕັ້ງຄ່າແກ້ໄຂຂອງພວກເຮົາຊີ້ໃຫ້ເຫັນເຖິງ DNS ຂອງ Amazon. ພວກເຮົາໄດ້ເອົາສິ່ງນີ້ ສຳ ລັບການອະນຸມັດແລະຄ່າໃຊ້ຈ່າຍຂອງ TTL ທີ່ຂ້ອນຂ້າງຕໍ່າ ສຳ ລັບການບໍລິການຂອງພວກເຮົາແລະການບໍລິການຂອງ Amazon (ຕົວຢ່າງ DynamoDB) ສ່ວນໃຫຍ່ແມ່ນບໍ່ໄດ້ສັງເກດເຫັນ.

ໃນຂະນະທີ່ພວກເຮົາເຂົ້າໄປໃນບໍລິການເພີ່ມເຕີມແລະນັບມື້ນັບຫຼາຍຂື້ນຕໍ່ Kubernetes, ພວກເຮົາໄດ້ພົບເຫັນຕົວເອງທີ່ເຮັດວຽກບໍລິການ DNS ທີ່ຕອບ ຄຳ ຖາມ 250,000 ຕໍ່ວິນາທີ. ພວກເຮົາໄດ້ປະເຊີນກັບເວລາຊອກຫາແບບ DNS ທີ່ມີຜົນກະທົບແລະມີຜົນກະທົບພາຍໃນແອັບພລິເຄຊັນຂອງພວກເຮົາ. ນີ້ໄດ້ເກີດຂື້ນເຖິງວ່າຈະມີຄວາມພະຍາຍາມໃນການດັດແປງທີ່ສົມບູນແບບແລະຜູ້ໃຫ້ບໍລິການ DNS ປ່ຽນໄປສູ່ການ ນຳ ໃຊ້ CoreDNS ເຊິ່ງໃນເວລາດຽວກັນສູງສຸດ 1,000 ເມັດໂດຍໃຊ້ 120 cores.

ໃນຂະນະທີ່ ກຳ ລັງຄົ້ນຄວ້າສາເຫດແລະວິທີແກ້ໄຂອື່ນໆທີ່ເປັນໄປໄດ້, ພວກເຮົາໄດ້ພົບເຫັນບົດຂຽນ ໜຶ່ງ ທີ່ອະທິບາຍເຖິງສະພາບການແຂ່ງຂັນທີ່ມີຜົນກະທົບຕໍ່ລະບົບການກັ່ນຕອງຂອງແພັກເກັດ Linux. ເວລາ ໝົດ ກຳ ນົດຂອງ DNS ທີ່ພວກເຮົາ ກຳ ລັງເຫັນພ້ອມກັບໂຕເລກທີ່ເພີ່ມຂື້ນໃນການໂຕ້ຕອບ Flannel ທີ່ສອດຄ່ອງກັບການຄົ້ນພົບຂອງບົດຂຽນ.

ບັນຫາດັ່ງກ່າວເກີດຂື້ນໃນລະຫວ່າງການແປສັບທີ່ຢູ່ແລະແຫຼ່ງຂໍ້ມູນເຄືອຂ່າຍປາຍທາງ (SNAT ແລະ DNAT) ແລະການຕິດຕໍ່ເຂົ້າໄປໃນຕາຕະລາງປະຊຸມ. ບັນຫາ ໜຶ່ງ ທີ່ໄດ້ປຶກສາຫາລືພາຍໃນແລະສະ ເໜີ ໂດຍຊຸມຊົນແມ່ນການຍ້າຍ DNS ເຂົ້າໄປໃນຂໍ້ ກຳ ມະກອນ. ໃນ​ກໍ​ລະ​ນີ​ນີ້:

  • SNAT ແມ່ນບໍ່ ຈຳ ເປັນ, ເພາະວ່າການຈະລາຈອນແມ່ນຢູ່ໃນທ້ອງຖິ່ນ. ມັນບໍ່ ຈຳ ເປັນຕ້ອງຖືກສົ່ງຜ່ານອິນເຕີເຟດ eth0.
  • DNAT ແມ່ນບໍ່ ຈຳ ເປັນເພາະ IP ຂອງຈຸດ ໝາຍ ປາຍທາງແມ່ນຢູ່ໃນທ້ອງຖິ່ນຂອງ node ແລະບໍ່ແມ່ນ pod ທີ່ຖືກຄັດເລືອກແບບສຸ່ມຕາມກົດ iptables.

ພວກເຮົາໄດ້ຕັດສິນໃຈກ້າວໄປຂ້າງ ໜ້າ ດ້ວຍວິທີການນີ້. CoreDNS ໄດ້ຖືກ ນຳ ໃຊ້ເປັນ DaemonSet ໃນ Kubernetes ແລະພວກເຮົາໄດ້ໃສ່ເຊີຟເວີ DNS ໃນທ້ອງຖິ່ນຂອງ node ເຂົ້າໄປໃນແຕ່ລະເວັບໄຊທ໌ຂອງແຕ່ລະ pod ໂດຍການຕັ້ງຄ່າ ຄຳ ສັ່ງ kubelet - cluster-dns. ການແກ້ໄຂບັນຫາແມ່ນມີປະສິດທິຜົນ ສຳ ລັບການ ໝົດ ເວລາຂອງ DNS.

ເຖິງຢ່າງໃດກໍ່ຕາມ, ພວກເຮົາຍັງເຫັນແພັກທີ່ຖືກຫຼຸດລົງແລະເຄື່ອງ ໝາຍ ການ ນຳ ໃຊ້ຂອງ insert_failed ໃນການໂຕ້ຕອບ Flannel. ນີ້ຈະຄົງຢູ່ເຖິງແມ່ນວ່າຫຼັງຈາກການເຮັດວຽກຂ້າງເທິງນີ້ເພາະວ່າພວກເຮົາພຽງແຕ່ຫລີກລ້ຽງ SNAT ແລະ / ຫຼື DNAT ສໍາລັບການຈະລາຈອນ DNS. ສະພາບການແຂ່ງຂັນຍັງຈະເກີດຂື້ນ ສຳ ລັບການຈະລາຈອນປະເພດອື່ນໆ. ໂຊກດີ, ແພັກເກັດຂອງພວກເຮົາສ່ວນຫຼາຍແມ່ນ TCP ແລະເມື່ອສະພາບການເກີດຂື້ນ, ແພັກເກັດຈະຖືກສົ່ງກັບຄືນປະສົບຜົນ ສຳ ເລັດ. ການແກ້ໄຂໄລຍະຍາວ ສຳ ລັບການຈາລະຈອນທຸກປະເພດແມ່ນສິ່ງທີ່ພວກເຮົາ ກຳ ລັງສົນທະນາຢູ່.

ການໃຊ້ຕົວແທນເພື່ອບັນລຸການດຸ່ນດ່ຽງການໂຫຼດທີ່ດີຂື້ນ

ໃນຂະນະທີ່ພວກເຮົາເຄື່ອນຍ້າຍບໍລິການ backend ຂອງພວກເຮົາໄປ Kubernetes, ພວກເຮົາໄດ້ເລີ່ມຕົ້ນທີ່ຈະປະສົບກັບຄວາມຫຍຸ້ງຍາກທີ່ບໍ່ສົມດຸນກັນໃນທົ່ວຝັກ. ພວກເຮົາໄດ້ຄົ້ນພົບວ່າຍ້ອນການເຊື່ອມຕໍ່ HTTP Keepalive, ການເຊື່ອມຕໍ່ ELB ຕິດກັບຝັກທີ່ກຽມພ້ອມ ທຳ ອິດຂອງການປະຕິບັດການມ້ວນແຕ່ລະຄັ້ງ, ສະນັ້ນການຈະລາຈອນສ່ວນໃຫຍ່ໄຫຼຜ່ານສ່ວນຮ້ອຍນ້ອຍໆຂອງຝັກທີ່ມີ. ໜຶ່ງ ໃນບັນດາການຫຼຸດຜ່ອນຜົນກະທົບ ທຳ ອິດທີ່ພວກເຮົາພະຍາຍາມໃຊ້ແມ່ນ MaxSurge 100% ສຳ ລັບການ ນຳ ໃຊ້ ໃໝ່ ສຳ ລັບຜູ້ກະ ທຳ ຜິດທີ່ຮ້າຍແຮງທີ່ສຸດ. ນີ້ແມ່ນປະສິດທິຜົນທີ່ບໍ່ມີປະສິດຕິພາບແລະບໍ່ມີຄວາມຍືນຍົງໃນໄລຍະຍາວທີ່ມີການ ນຳ ໃຊ້ຂະ ໜາດ ໃຫຍ່ ຈຳ ນວນ ໜຶ່ງ.

ການຫຼຸດຜ່ອນອີກອັນ ໜຶ່ງ ທີ່ພວກເຮົາໄດ້ ນຳ ໃຊ້ແມ່ນການສ້າງການຮຽກຮ້ອງຊັບພະຍາກອນກ່ຽວກັບການບໍລິການທີ່ ສຳ ຄັນເພື່ອໃຫ້ຝັກ colocated ຈະມີຫົວໃຫຍ່ພ້ອມກັບຝັກອື່ນໆ. ສິ່ງນີ້ຍັງຈະບໍ່ສາມາດໃຊ້ໄດ້ໃນໄລຍະຍາວເນື່ອງຈາກສິ່ງເສດເຫຼືອຂອງຊັບພະຍາກອນແລະການ ນຳ ໃຊ້ Node ຂອງພວກເຮົາແມ່ນເສັ້ນດ່ຽວແລະດັ່ງນັ້ນມັນຈຶ່ງຖືກຈັດເປັນ 1 ຫຼັກ. ວິທີແກ້ໄຂທີ່ຈະແຈ້ງເທົ່ານັ້ນແມ່ນການ ນຳ ໃຊ້ການດຸ່ນດ່ຽງການໂຫຼດທີ່ດີຂື້ນ.

ພວກເຮົາໄດ້ຊອກຫາພາຍໃນເພື່ອປະເມີນ Envoy. ສິ່ງນີ້ເຮັດໃຫ້ພວກເຮົາມີໂອກາດທີ່ຈະ ນຳ ໃຊ້ມັນໃນແບບ ຈຳ ກັດແລະເກັບກ່ຽວຜົນປະໂຫຍດທັນທີ. Envoy ແມ່ນແຫຼ່ງເປີດ, ໂປແກຼມໂປແກຼມ Layer 7 ທີ່ມີປະສິດຕິພາບສູງທີ່ຖືກອອກແບບມາ ສຳ ລັບສະຖາປັດຕະຍະ ກຳ ທີ່ໃຫ້ບໍລິການຂະ ໜາດ ໃຫຍ່. ມັນສາມາດປະຕິບັດເຕັກນິກການດຸ່ນດ່ຽງການໂຫຼດທີ່ກ້າວຫນ້າ, ລວມທັງການຍຶດອັດຕະໂນມັດ, ການຢຸດວົງຈອນ, ແລະການ ຈຳ ກັດອັດຕາທົ່ວໂລກ.

ການຕັ້ງຄ່າທີ່ພວກເຮົາໄດ້ສ້າງຂື້ນມາແມ່ນຕ້ອງມີລົດ Envoy ຢູ່ຂ້າງຂ້າງຂອງແຕ່ລະບ່ອນທີ່ມີເສັ້ນທາງ ໜຶ່ງ ເສັ້ນແລະເປັນກຸ່ມທີ່ຈະໄປທີ່ທ່າເຮືອບັນຈຸທ້ອງຖິ່ນ. ເພື່ອຫຼຸດຜ່ອນກະແສຟອງທີ່ມີທ່າແຮງແລະເພື່ອຮັກສາລະເບີດຂະ ໜາດ ນ້ອຍ, ພວກເຮົາໄດ້ ນຳ ໃຊ້ເຮືອບັນທຸກໃບ ໜ້າ ທີ່ເປັນຕົວແທນ, ຜູ້ປະຕິບັດ ໜ້າ ທີ່ຢູ່ແຕ່ລະເຂດທີ່ມີຄວາມພ້ອມ (AZ) ສຳ ລັບແຕ່ລະບໍລິການ. ສິ່ງເຫລົ່ານີ້ຕີກົນໄກການຄົ້ນພົບການບໍລິການຂະ ໜາດ ນ້ອຍ ໜຶ່ງ ວິສະວະກອນຂອງພວກເຮົາເອົາໃຈໃສ່ເຊິ່ງພຽງແຕ່ສົ່ງຄືນລາຍຊື່ຂອງຝັກໃນແຕ່ລະ AZ ສຳ ລັບການບໍລິການທີ່ໃຫ້.

ຈາກນັ້ນທູດພິເສດດ້ານການບໍລິການໄດ້ ນຳ ໃຊ້ກົນໄກການຄົ້ນພົບການບໍລິການນີ້ດ້ວຍກຸ່ມ ໜຶ່ງ ເສັ້ນທາງແລະເສັ້ນທາງ. ພວກເຮົາໄດ້ ກຳ ນົດເວລາພັກຜ່ອນທີ່ສົມເຫດສົມຜົນ, ເພີ່ມ ກຳ ລັງການຕັ້ງຄ່າຂອງວົງຈອນປິດທັງ ໝົດ, ແລະຫຼັງຈາກນັ້ນ ນຳ ໃຊ້ການຕັ້ງຄ່າທົດລອງ ໃໝ່ ໜ້ອຍ ທີ່ສຸດເພື່ອຊ່ວຍໃນການລົ້ມເຫລວແລະການ ນຳ ໃຊ້ທີ່ລຽບງ່າຍ. ພວກເຮົາໄດ້ບໍລິການ Envoy ທາງ ໜ້າ ແຕ່ລະດ້ານນີ້ດ້ວຍ TCP ELB. ເຖິງແມ່ນວ່າການເບິ່ງແຍງຈາກຊັ້ນຕົວແທນດ້ານ ໜ້າ ຫຼັກຂອງພວກເຮົາໄດ້ຖືກຕິດຢູ່ໃນບັນດາຝັກ Envoy ທີ່ແນ່ນອນ, ພວກມັນສາມາດຈັດການກັບການໂຫຼດໄດ້ດີຂື້ນແລະຖືກປັບແຕ່ງໃຫ້ມີຄວາມສົມດຸນໂດຍຜ່ານ ໜ້ອຍ ທີ່ສຸດກັບ backend.

ສຳ ລັບການປະຕິບັດການ, ພວກເຮົາໄດ້ໃຊ້ສຽງ preStop ທັງໃບ ຄຳ ຮ້ອງແລະກ້ອງຂ້າງ. hook ນີ້ເອີ້ນວ່າການກວດສຸຂະພາບຂອງລົດທີ່ລົ້ມເຫຼວໃນຈຸດສຸດທ້າຍຂອງ admin, ພ້ອມກັບການນອນຫຼັບນ້ອຍ, ເພື່ອໃຫ້ບາງເວລາທີ່ຈະອະນຸຍາດໃຫ້ເຊື່ອມຕໍ່ກັບ inflight ເຮັດ ສຳ ເລັດແລະລະບາຍ.

ເຫດຜົນ ໜຶ່ງ ທີ່ພວກເຮົາສາມາດຍ້າຍໄດ້ຢ່າງໄວວາແມ່ນຍ້ອນການວັດແທກທີ່ອຸດົມສົມບູນພວກເຮົາສາມາດເຊື່ອມໂຍງເຂົ້າກັບການຕັ້ງຄ່າ Prometheus ທຳ ມະດາຂອງພວກເຮົາໄດ້ງ່າຍ. ນີ້ອະນຸຍາດໃຫ້ພວກເຮົາເຫັນສິ່ງທີ່ ກຳ ລັງເກີດຂື້ນໃນຂະນະທີ່ພວກເຮົາໄດ້ປັບປຸງການຕັ້ງຄ່າການຕັ້ງຄ່າແລະຕັດການຈະລາຈອນໄປທົ່ວ.

ຜົນໄດ້ຮັບແມ່ນທັນທີແລະເຫັນໄດ້ຊັດເຈນ. ພວກເຮົາເລີ່ມຕົ້ນດ້ວຍການບໍລິການທີ່ບໍ່ສົມດຸນທີ່ສຸດແລະໃນຈຸດນີ້ມັນເຮັດວຽກຢູ່ຕໍ່ ໜ້າ ສິບສອງບໍລິການທີ່ ສຳ ຄັນທີ່ສຸດໃນກຸ່ມບ້ານຂອງພວກເຮົາ. ໃນປີນີ້ພວກເຮົາວາງແຜນທີ່ຈະກ້າວໄປສູ່ຕາ ໜ່າງ ການບໍລິການເຕັມຮູບແບບ, ໂດຍມີການຄົ້ນພົບການບໍລິການທີ່ກ້າວ ໜ້າ ກວ່າເກົ່າ, ການແຍກວົງຈອນ, ການກວດພົບນອກ, ການ ຈຳ ກັດອັດຕາແລະການຕິດຕາມ.

ຮູບພາບ 3gence1 ການເຊື່ອມໂຍງ CPU ຂອງການບໍລິການ ໜຶ່ງ ລະຫວ່າງການຕັດຕໍ່ໄປຫາທູດ

ຜົນສຸດທ້າຍ

ຜ່ານການຮຽນຮູ້ແລະການຄົ້ນຄ້ວາເພີ່ມເຕີມເຫຼົ່ານີ້, ພວກເຮົາໄດ້ພັດທະນາທີມງານພື້ນຖານໂຄງລ່າງພາຍໃນບ້ານທີ່ມີຄວາມຄຸ້ນເຄີຍດີກ່ຽວກັບວິທີການອອກແບບ, ນຳ ໃຊ້ແລະປະຕິບັດງານກຸ່ມບ້ານ Kubernetes ຂະ ໜາດ ໃຫຍ່. ອົງການວິສະວະ ກຳ ທັງ ໝົດ ຂອງ Tinder ປະຈຸບັນມີຄວາມຮູ້ແລະປະສົບການກ່ຽວກັບວິທີບັນຈຸແລະ ນຳ ໃຊ້ໃບສະ ໝັກ ຂອງພວກເຂົາໃນ Kubernetes.

ກ່ຽວກັບໂຄງລ່າງພື້ນຖານຂອງມໍລະດົກຂອງພວກເຮົາ, ເມື່ອຕ້ອງການລະດັບເພີ່ມເຕີມ, ພວກເຮົາມັກຈະປະສົບກັບຄວາມຫຍຸ້ງຍາກໃນຫລາຍໆນາທີຂອງການລໍຖ້າໃຫ້ຕົວຢ່າງ EC2 ໃໝ່ ເຂົ້າມາ online. ບັນຈຸຕູ້ຄອນເທນເນີ ກຳ ນົດເວລາແລະໃຫ້ບໍລິການຈາລະຈອນພາຍໃນວິນາທີທຽບກັບນາທີ. ການວາງແຜນບັນຈຸຫຼາຍຊະນິດໃນຕົວຢ່າງ EC2 ດຽວກໍ່ຊ່ວຍປັບປຸງຄວາມ ໜາ ແໜ້ນ ຂອງແນວນອນ. ດ້ວຍເຫດນີ້, ພວກເຮົາຄາດຄະເນການປະຫຍັດຄ່າໃຊ້ຈ່າຍຢ່າງຫຼວງຫຼາຍໃນ EC2 ໃນປີ 2019 ທຽບໃສ່ປີທີ່ຜ່ານມາ.

ມັນໃຊ້ເວລາເກືອບສອງປີ, ແຕ່ພວກເຮົາໄດ້ ສຳ ເລັດການຍ້າຍຖິ່ນຖານຂອງພວກເຮົາໃນເດືອນມີນາ 2019. Tinder Platform ດຳ ເນີນການສະເພາະໃນກຸ່ມ Kubernetes ປະກອບມີ 200 ບໍລິການ, 1,000 ຂໍ້, 15,000 ຝັກ, ແລະ 48.000 ຖັງແລ່ນ. ພື້ນຖານໂຄງລ່າງບໍ່ແມ່ນວຽກທີ່ສະຫງວນໄວ້ໃຫ້ກັບທີມງານປະຕິບັດງານຂອງພວກເຮົາ. ແທນທີ່ຈະ, ວິສະວະກອນໃນທົ່ວອົງກອນມີສ່ວນຮ່ວມໃນຄວາມຮັບຜິດຊອບນີ້ແລະມີການຄວບຄຸມວິທີການສະ ໝັກ ຂອງພວກເຂົາຖືກສ້າງຂຶ້ນແລະ ນຳ ໃຊ້ກັບທຸກຢ່າງເປັນລະຫັດ.

ເບິ່ງຕື່ມອີກ

ທ່ານຈະເຮັດແນວໃດເພື່ອຢຸດຜູ້ໃດຜູ້ ໜຶ່ງ ຈາກການກ່າວເຖິງທ່ານໃນ Instagram?ແຟນໄດ້ຮັບການຕີໂດຍ Guy ໃນ Snapchat ຂອງນາງ. ນາງໄດ້ຊະນະ \ u2019 ທີ່ຈະລຶບລາວຫລືບອກໃຫ້ລາວສະ ໜັບ ສະ ໜູນ ໂດຍການຮ້ອງຂໍຂອງຂ້ອຍດັ່ງນັ້ນຂ້ອຍຈຶ່ງໄດ້ສົ່ງຂໍ້ຄວາມສ່ວນຕົວໃຫ້ລາວໃນ Instagram ແລະບອກລາວໃຫ້ຕັດຂາດການຕິດຕໍ່ທັງ ໝົດ ຈາກນາງ. ດຽວນີ້ນາງ \ u2019 ເປັນບ້າແລະ ກຳ ລັງເອີ້ນຂ້ອຍວ່າບ້າ. ໃຜ \ u2019s ຖືກຕ້ອງ?ທ່ານ ກຳ ລັງຄຽດແຄ້ນບໍ່ກ່ຽວກັບ SnapChat ຂອງທ່ານ? ເປັນຫຍັງທ່ານຕ້ອງການໃຫ້ພວກເຂົາກ້າວຕໍ່ໄປ?ຂ້ອຍສາມາດໃຊ້ Instagram BioLink ເພື່ອຫາເງິນໄດ້ແນວໃດ?ເປັນຫຍັງ \ u2019t ຂ້ອຍສາມາດໂພດ \ u201cswipe ໄດ້ \ u201d ເລື່ອງ Instagram?ມີທາງອອກບໍທີ່ຈະປິດສຽງຂໍ້ຄວາມຈາກການດາວໂຫລດໂດຍອັດຕະໂນມັດໃນ WhatsApp? ຖ້າແມ່ນ, ມີຂັ້ນຕອນແນວໃດທີ່ຈະເຮັດແນວນັ້ນ?ຂ້ອຍຄວນເອົາອະດີດຂອງຂ້ອຍເປັນຜູ້ຕິດຕາມຈາກ Instagram ບໍ? ຂ້າພະເຈົ້າພຽງແຕ່ຄົ້ນພົບວ່າມັນເປັນໄປໄດ້. ເລື່ອງສັ້ນຍາວ: ມັນແມ່ນການແຕກແຍກເຢັນແລະພວກເຮົາບໍ່ໄດ້ເວົ້າມາຕັ້ງແຕ່ (ເກືອບ 3 ປີ). ຜູ້ໃດຈະເຮັດໃຫ້ເຈັບຫຼາຍກວ່າເກົ່າ: ລາວຖືກປັບປຸງ ໃໝ່ ໃນຊີວິດຂອງຂ້ອຍຫລືຖືກຕັດຂາດ?ຂ້ອຍຈະປິດສຽງຂອງຜູ້ໃດຜູ້ ໜຶ່ງ ທີ່ຢູ່ໃນ Android ໄດ້ແນວໃດ?