استفاده از route در پلتفرم ابری آروان
در این مقاله به بررسی مفهوم و شیوهی استفاده از route در پلتفرم ابری آروان و همچنین اجزای سازنده یک route و چگونگی تعریف هریک از آنها پرداخته میشود.
پیشنیازهای استفاده از route در پلتفرم ابری آروان
تنها پیش نیاز استفاه از این سیستم، داشتن حساب کاربری ابر آروان و دسترسی به پلتفرم ابری آروان است. بنابراین به سایت ابر آروان به نشانی arvancloud.com بروید و یک حساب کاربری بسازید یا اگر از پیش حساب کاربری دارید، وارد آن شوید. سپس به بخش پروفایل بروید و در سربرگ API KEYS برای خود یک API KEY جدید بسازید و آن را در جایی ذخیره کنید.
برای انجام مراحل این مقاله نیاز است از command line ابر آروان استفاده کنید. پس از دانلود خط فرمان (در صورت نیاز آن را در PATH خود قرار دهید) با کمک دستور زیر در آن لاگین کنید.
arvan login
سپس API KEY که از سایت دریافت کردید در اینجا کپی کنید.
route چیست؟
route یکی از اجزای اصلی و پرکاربرد در پلتفرم ابری آروان است که به کاربر امکان ارسال درخواست به podهای خود را، از خارج از پلتفرم ابری آروان میدهد.
پس از توسعهی برنامه و ساخت deployment و ایجاد service در پلتفرم ابری آروان، نیاز است تا از خارج از پلتفرم ابری، درخواستها به برنامه ارسال شوند. route این ارتباط را میان دنیای خارج و پلتفرم ابری، با کمک نام دامنه، ایجاد میکند.
route تنها درخواستهای http و https را میپذیرد. این درخواستها از دامنه به route میرسند، سپس route این درخواست ها را به serviceای که مشخص شده ارسال میکند. همچنین شما میتوانید با ارایهی گواهینامهی TLS به route، ترافیکهای https را بهوسیلهی آن مدیریت و این بار را از برنامه خود حذف، و منابع کمتری مصرف کنید.
ساخت route
برای ساخت route، باید اطلاعات مورد نیاز را در قالب yaml در یک فایل وارد و سپس با command line آن را به پلتفرم ابری آروان ارایه کنید. در ادامه نمونهای ساده از یک route برای یک سرویس nginx (که در مقالات پیشین، deployment و service برای آن ایجاد شد) آورده شده و هریک از بخشهای آن توضیح داده شده است.
apiVersion: v1
kind: Route
metadata:
name: nginx-route
spec:
host: nginx-example-project.apps.ir-thr-mn1.arvan.run
to:
kind: Service
name: nginx-service
tls:
termination: edge
insecureEdgeTerminationPolicy: Allow
port:
targetPort: http
نکته: توجه کنید که indentation در فایلهای YAML مهم است و کوچکترین جابهجایی میتواند سبب برگرداندن خطا و یا تنظیمات ناخواسته شود.
در ادامه فیلدهای مربوطه توضیح داده میشود.
- kind: مشخصکنندهی نوع ماهیت است. این فیلد میتواند مقادیری مانند: Pod، Route، Service، StatefulSet و ... داشته باشد. در این نمونه، هدف تعریف route است بنابراین، مقدار آن route مشخص شده است.
- name: مشخصکنندهی نام route است.
- host: مشخصکنندهی دامنهای است که از آن میتوان از خارج از پلتفرم ابری آروان درخواستها را به route ارسال کرد.
- to: مشخصکنندهی موجودیتی است که باید درخواستها به سمت آن هدایت شود. در این نمونه درخواستها به service مربوط به nginx که در مقالات قبل ساخته شده ارسال میشود.
- tls: در این بخش اطلاعات لازم برای tls termination قرار میگیرد.
- tls.termination: این فیلد مشخص میکند که شیوهی termination به چه شکل باشد. مقادیر مجاز برای این فیلد edge، passthrough و reencrypt هستند که در بخشهای بعدی توضیح داده شدهاند.
- tls.insecureEdgeTerminationPolicy: بهشکل پیشفرض اجازهی عبور ترافیک ناامن (http) داده نمیشود. با قرار دادن spec.tls.insecureEdgeTerminationPolicy برابر با Allow، ترافیکهای ناامن نیز اجازهی عبور از route را خواهند داشت. مقادیر دیگر این فیلد برابر با none (جهت عدم اجازه عبور ترافیک http) و redirect ( جهت redirect کردن ترافیک http به https ) است.
- port.targetPort: توجه داشته باشید که route میتواند ترافیک را تنها به یک port تعریف شده در service ارسال کند. به طور پیشفرض، route ترافیک را به port ای ارسال میکند که در تعریف service زودتر تعریف شده باشد. اگر نیازمند ارسال ترافیک به port خاصی از سرویس باشید، از این فیلد برای اختصاص port برای ارسال ترافیک میتوانید استفاده کنید.
خطوط بالا را در یک فایل به نام nginx-route.yaml وارد و ذخیره کنید. سپس در command line با دستور زیر، route خود را به پلتفرم ابری آروان ارایه کنید.
arvan paas apply -f nginx-route.yaml
با دستور زیر میتوانید از وضعیت route خود و اجرای آن روی پلتفرم ابری آروان آگاه شوید.
arvan paas get route
خروجی مشابه زیر خواهد بود:
$ arvan paas get route
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
nginx-route nginx-example-project.apps.ir-thr-mn1.arvan.run nginx-service <all> edge/Allow None
در خروجی بالا، NAME مشخصکنندهی نام route و HOST/PORT مشخصکنندهی دامنه route است. PATH مشخصکنندهی مسیری است که ترافیک سمت آن هدایت میشود (این موضوع در این مقاله پوشش داده نشده و در مقالات آینده به آن خواهیم پرداخت). SERVICES مشخصکنندهی نام serviceای است که ترافیک به آن ارسال میشود. PORT مشخصکنندهی پورت مربوط به SERVICEای است که ترافیک به آن هدایت میشود. TERMINATION مشخصکنندهی نوع terminationای است که در route مشخص شده است. در مورد WILDCARD در مقالات آینده صحبت خواهد شد.
نام دامنهی route
همانطور که گفته شد، route به وسیلهی نام دامنه، امکان ارتباط با podها را از خارج از کلاستر فراهم میکند. در حال حاضر تنها میتوان از دامنههای پیشفرض پلتفرم ابری آروان استفاده کرد. شیوهی تعریف این دامنهها به شکل زیر است.
[app name]-[project name].apps.ir-thr-mn1.arvan.run
نخست، در قسمت اول نام دلخواه خود (برای مثال نام برنامه) را قرار دهید و پس از آن با یک "-" فاصله نام پروژه خود را قرار دهید. توجه کنید که نام پروژه اجباری است.
به زودی امکانی اضافه خواهد شد که بتوانید از دامنههای خود در پلتفرم ابری آروان استفاده کنید.
TLS termination
چنانچه گفته شد، فیلد spec.tls.termination میتواند سه مقدار reencrypt، passthrough و edge را داشته باشد. در ادامه هر یک توضیح داده خواهد شد.
edge
اگر از دامنهی پیشفرض پلتفرم ابری آروان استفاده میکنید، از این نوع استفاده کنید. در این حالت، مدیریت ترافیک encrypt شده بهوسیلهی tls، در سمت route و بهوسیلهی پلتفرم ابری آروان انجام میشود و از route تا pod شما، ترافیک به شکل http ارسال میشود. در این حالت بار ناشی از https از روی podهای شما برداشته و منابع کمتری استفاده میشود.
اگر از دامنهی پلتفرم ابری آروان استفاده میکنید نیازی به ارایهی certificate به route نیست. همچنین، شما میتوانید از دامنهی خود استفاده کنید. و همچنان از مزیت edge termination نیز بهرهمند شوید. (از آنجا که در این حالت نیز دامنه شما از cdn آروان استفاده می کند، همچنان نیازی به ارایه certificate نیست.)
در حالت کلی کافیست certificate، ca certificate و private key را به route ارایه کنید . همانند نمونهی زیر:
apiVersion: v1
kind: Route
metadata:
name: route-edge-secured
spec:
host: www.example.com
to:
kind: Service
name: service-name
tls:
termination: edge
key: |-
-----BEGIN PRIVATE KEY-----
[...]
-----END PRIVATE KEY-----
certificate: |-
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
caCertificate: |-
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
reencrypt
در این حالت ابتدا یکبار در route، عمل tls termination انجام میشود و سپس ترافیک مجدد بهوسیلهی route، در اصطلاح encrypt شده و به service و پس از آن به podها ارسال میشود و pod باید دوباره عمل termination را اجرا کند. در چنین حالتی، ترافیک حتا درون پلتفرم ابری آروان نیز بهشکل رمز شده است. در این شرایط باید ca certificate برای وب سرور داخلی (درون pod مقصد) نیز به route ارایه شود. سایر مقادیر مانند حالت edge است. همانند نمونهی زیر:
apiVersion: v1
kind: Route
metadata:
name: route-pt-secured
spec:
host: www.example.com
to:
kind: Service
name: service-name
tls:
termination: reencrypt
key: [as in edge termination]
certificate: [as in edge termination]
caCertificate: [as in edge termination]
destinationCACertificate: |-
-----BEGIN CERTIFICATE-----
[...]
-----END CERTIFICATE-----
passthrough
در این حالت ترافیک مستقیم به سمت service و پس از آن به pod مقصد ارسال میشود و route هیچگونه عمل termination را روی ترافیک انجام نمیدهد. در این حالت ترافیک بهشکل encrypt شده به برنامه شما ارسال میشود و مراحل رمزگشایی ترافیک https باید بهوسیلهی برنامهی شما مدیریت شود. توجه کنید که در این حالت، مقدار فیلد spec.tls.insecureEdgeTerminationPolicy تنها میتواند برابر مقادیر none و redirect باشد. نمونهی زیر، نشاندهندهی این حالت است:
apiVersion: v1
kind: Route
metadata:
name: route-passthrough-secured
spec:
host: www.example.com
to:
kind: Service
name: service-name
tls:
termination: passthrough
برای کسب اطلاعات بیشتر میتوانید به مستندات OKD مراجعه کنید. این مقاله از مراجع زیر اقتباس شده است.
- https://docs.okd.io/3.11/dev_guide/routes.html
- https://docs.okd.io/3.11/architecture/networking/routes.html