27 Tweets 4 reads Jun 29, 2021
الكام يوم اللي فاتوا بنقل ال infrastructure بتاعتنا لبروجكت جديدة من Azure App Service لـ K8s، دي ثريد هرغي فيها شوية عن features كتيرة عجبتني عن K8s و Azure Kubernetes Service بالأخص.
مبدأيًا بما اننا كنا شغالين على Azure App Service ف كل Service كانت containrized.
و بما ان كل حاجة على Github في Monorepo، كتبت Github Action في الأول بيشوف اي project اللي اتغير و بي build ال project ده.
بعد ما build ال image بـ scan ال image
عشان اشوف لو في اي dependency ليها ثغرة معروفة، و ده اللي خلاني انقل كل الimages لـ alpine linux عشان اقلل ال dependencies على قد ما اقدر، يعني مثلًا مش هحتاج curl او gcc في ال image بتاعتي.
مشكلة ال App Service كانت في حاجات كتيرة، منها ال internal
HTTP/2 communication مكنتش supported، ال Reverse Proxy بتاع ال App Service شغال على IIS و فيه المشكلة دي و Issue من 2019 تقريبًا و لسه متقفلتش لحد النهردة.
انا كنت محتاج HTTP/2 عشان فيه كذا Grpc Service و محتاجين HTTP/2.
احنا كنا من الأول عارفين اننا هننقل على K8s بس ال App Service كان حل مؤقت و كانت برضه attractive انها شغالة من غير configurations كتيرة،
مجرد بتقولها هتشتغلي على ال image كذا من ال container repo كذا و خلاص على كده و كل اللي كان بيحصل في ال Github workflow كان بيغير بس اسم ال image tag فيها و بيrestart ال service دي و الباقي كان one time configuration بس.
بعد لف كتير في ال documentations عشان افهم K8s شغالة ازاي، كنت حابب افهم AKS هتفدني بايه.
مبدأيًا كل ال master nodes managed من Microsoft و انا مبشفهاش و ده شيء مريحني، ان كل تركيزي هيبقى على ازاي هشغل ال application بتاعي مش ازاي هشغل K8s نفسها، غير كده ال integrations مع ال Azure services.
كتبت لكل Service عندنا K8s Service و في الاول استعملت نفس ال attributes اللي كان في docker compose بتاع كل service عندنا لل container specs، يعني مثلًا نفس ال env variables اللي هحتاجها، و ال secrets في الاول عدلتها انها تستعمل K8s secrets و بعد كده نقلتها ل Azure Keyvault.
دلوقت كل Service موجودة بذاتها و كل واحدة نوعها ClusterIP و مش هتتشاف من برة.
اول حاجة قولت اجرب install ingress nginx ب helm و اظبطه بنفسي
بما ان مكنش فيها غير namespace واحدة بس (default)
فال configuration مكنتش كتيرة، مجرد ان خليته بيredirect لل entrypoint service بتعتي على port 80
بعد كده شلت nginx ingress و استعملت ال Service اللي موجودة جاهزة من Azure اسمها Application Gateway.
ال Application Gateway لوحده بيوفرلك Load Balancer
و بيورفلك Web Application Firewall ممكن تستعملها بكل بساطة ان بتـ activate ال feature دي و تحدد لو عايز ال WAF يـ log بس لو فيه request شاكك فيها او يـ drop ال request.
الجميل في AKS ان فيه Application Gateway Ingress Controller Add-on
فمسحت ال ingress controller اللي عملته و شغلت ال add-on بـ command واحدة بس و installed automatically في ال cluster.
ال Application Gateway by default بيسمع على كل ال namespaces اللي عندك عالcluster، فلو فرضًا مقسم ال namespaces staging, dev, prod او مثلًا كل customer عندك على namespace مختلفة، هتكتب ال Ingress Config لكل namespace
و المفروض يبقى عندك مثلًا subdomains مختلفة، يعني مثلا staging.example.com ال config موجود جوة ال staging namespace
فجوة ال ingress config ال namespace دي لما بتشوف ال host staging.example.com بت redirect على ال service.
ده لينك بيشرح الموضوع ازاي ال Tenant Seperation هيشتغل و ايه اللي المفروض ناخد بالنا منه docs.microsoft.com
بعد كده خلينا ال Loadbalancer بيـ listen على 443 و بي redirect عليه، و بيستعمل ال certificate اللي جاية في الاساس من Keyvault.
فيه ميزة تانية في AKS ان ال Cluster لما بيت create بيcreate هو VNet، انت ممكن تختار existing vnet موجودة و دي كانت ميزة مهمة عشان لو
فيه vnet مثلًا و تحتها كذا subnet فممكن ندي لل cluster subnet يشتغل عليها (لحد دلوقت مش عارف ده حل كويس ولا لأ).
دلوقت اي request بتيجي من برة هتروح على ال application gateway هتكون ssl بعد كده هيحصل SSL Termination و ال internal communication هيكون plain HTTP.
قعدت شوية بدور على حل اني اوصل لـ Mutual TLS ما بين ال services internally. ابسط حل كان استخدام Service Mesh زي linkerd او istio
بعد كده بدأت احط ال Network Policies و ال Resource Limiation per Namespace و ال Health/Rediness Probes لكل Service.
كده ال basic configuration لل cluster كانت جاهزة فكتبنا Terraform Template بي deploy ال cluster بال config اللي محتاجنها.
ممكن برضه بعد كده اعمل ثريد تانية نرغي فيها شوية عن ال Logging و ال Monitoring و ال Cluster Security ب tools زي Kube-bench

Loading suggestions...