הגדרת שרת Proxy של DNS
DNS Proxy היא תכונה שמספקת את היכולות הבאות:
- הפצת רשומות DNS של
Servicesבאשכולות בהגדרה מרובת אשכולות. - מאכלסים את רשומות ה-DNS של
ServiceEntry.
Kubernetes מספק פענוח DNS רק ל-Services באשכול המקומי.
כשצריך לספק רזולוציית שמות ל-Services באשכולות מרוחקים או להשתמש בשם מארח פנימי בלבד עם ServiceEntry בלי שיהיה שרת DNS פנימי נוסף, DNS Proxy מספק דרך לפתור שמות DNS במקרים כאלה.
הגדרת שרת Proxy של DNS
כדי להגדיר פרוקסי DNS, מגדירים את הדגל ISTIO_META_DNS_CAPTURE באופן הבא. אפשר לבחור את ההגדרה של האשכול או של כל שרת proxy.
הגדרה של האשכול כולו
כדי להגדיר שרת proxy של DNS באשכול, מוסיפים ISTIO_META_DNS_CAPTURE proxy
metadata אל ConfigMap עבור MeshConfig. השם של ConfigMap הוא בפורמט istio-<revision_name>. פרטים על השינוי מופיעים בסקירה הכללית של השינוי
apiVersion: v1
data:
mesh: |-
...
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
...
kind: ConfigMap
metadata:
name: istio-<revision_name>
namespace: istio-system
הגדרות לכל שרת proxy
כדי להגדיר שרת proxy של DNS לשרת proxy, מוסיפים את הערת המטא-נתונים ISTIO_META_DNS_CAPTURE proxy באופן הבא:
kind: Deployment
metadata:
name: app1
namespace: ns1
spec:
...
template:
metadata:
annotations:
proxy.istio.io/config: |
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
...
מוודא
כדי לוודא שהכול מוגדר בצורה נכונה, מבצעים את השלבים.
תרגום שם (Name resolution) של Service באשכולות
אחרי ההגדרה של כמה אשכולות, פורסים את Service רק באחד מהאשכולות כדי לאמת את פתרון השם בין האשכולות.
אם יש לכם את הדוגמה הבאה Service ns1/svc1, תוכלו למצוא את ClusterIP ב-Service.
$ kubectl get -n ns1 svc1
kind: Service
metadata:
name: svc1
namespace: ns1
spec:
...
ClusterIP: 210.200.1.1
...
לאחר מכן, כשמשתמשים ב-curl מהאשכול other אל Service, התוצאה צריכה להיות ClusterIP כמו בדוגמה הבאה.
curl -sS -v svc1.ns1.svc.cluster.local
* Trying 210.200.1.1:80...
תרגום שם (Name resolution) עבור ServiceEntry
מוסיפים ServiceEntry עם שם מארח שלא רשום ב-DNS.
כדי לאמת את תרגום השם לכתובת, בדוגמה הבאה יש כתובת מפורשת 192.168.123.123.
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: test-service-entry
spec:
addresses:
- "192.168.123.123"
hosts:
- not-existing-hostname.internal
ports:
- name: http
number: 80
protocol: HTTP
EOF
לאחר מכן, מנסים רזולוציית DNS ב-Pod שבו מופעל DNS Proxy. לדוגמה, אם מריצים curl ב-Pod, כתובת ה-IP תוצג כך:
curl -sS -v not-existing-hostname.internal
* Trying 192.168.123.123:80...
הקצאה אוטומטית של כתובות IP ל-ServiceEntry
כשמשתמשים ב-ServiceEntry עם DNS Proxy, אפשר להפעיל הקצאה אוטומטית של כתובות IP. כשהאפשרות הזו מופעלת, כתובות IP פנימיות (מהטווח 240.240.0.0/16) מוקצות באופן אוטומטי למארחים ServiceEntry שלא מציינים כתובות IP מפורשות ב-spec.addresses.
הפעלת הקצאה אוטומטית של כתובות IP
כדי להפעיל הקצאה אוטומטית של כתובות IP, פועלים לפי ההוראות להטמעה של מישור הבקרה:
TRAFFIC_DIRECTOR
כדי להטמיע את מישור הבקרה TRAFFIC_DIRECTOR, צריך להגדיר הקצאה אוטומטית של כתובות IP ב-asm-options ConfigMap במרחב השמות istio-system על ידי הגדרת ip_auto_allocation: "true".
בדוגמה הבאה מוצג asm-options ConfigMap עם הקצאה אוטומטית של כתובות IP:
apiVersion: v1
kind: ConfigMap
metadata:
name: asm-options
namespace: istio-system
data:
# Enable IP auto-allocation for ServiceEntry (Rapid channel)
ip_auto_allocation: "true"
אפשר גם להחיל את ההגדרה הזו באמצעות kubectl patch:
kubectl patch configmap/asm-options -n istio-system --type merge \
-p '{"data":{"ip_auto_allocation":"true"}}'
ISTIOD
במקרים של אשכולות שמשתמשים בהטמעה של מישור הבקרה ISTIOD (בתוך האשכול או מנוהל ISTIOD), צריך להגדיר הקצאה אוטומטית של כתובות IP על ידי הוספת ISTIO_META_DNS_AUTO_ALLOCATE: "true" למטא-נתונים של ה-proxy בתוך MeshConfig:
apiVersion: v1
data:
mesh: |-
defaultConfig:
proxyMetadata:
ISTIO_META_DNS_CAPTURE: "true"
ISTIO_META_DNS_AUTO_ALLOCATE: "true"
kind: ConfigMap
metadata:
name: istio-<revision_name>
namespace: istio-system
אימות של הקצאת כתובות IP אוטומטית
כדי לוודא שהקצאת ה-IP האוטומטית פועלת, אפשר לבצע את השלבים הבאים.
לפני האימות, יוצרים ServiceEntry בלי לציין את spec.addresses:
$ kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1beta1
kind: ServiceEntry
metadata:
name: auto-allocated-service-entry
namespace: ns1
spec:
hosts:
- auto-allocated.internal
ports:
- name: http
number: 80
protocol: HTTP
resolution: DNS
EOF
1. בדיקת הכתובת שהוקצתה ב-status.addresses (TRAFFIC_DIRECTOR בלבד)
בהטמעה של TRAFFIC_DIRECTOR, בקר ההקצאה מקצה כתובת VIP ומאכלס את השדה status.addresses של ServiceEntry:
$ kubectl get serviceentry auto-allocated-service-entry -n ns1 -o yaml
הכתובת שהוקצתה מוצגת בפלט מתחת ל-status.addresses:
status:
addresses:
- host: auto-allocated.internal
value: 240.240.0.1
2. בדיקת פענוח DNS מ-Pod (TRAFFIC_DIRECTOR ו-ISTIOD)
ביישומים של TRAFFIC_DIRECTOR ושל ISTIOD, שולחים בקשה מ-Pod שבו מופעל DNS Proxy כדי לוודא שפענוח השם מתפרש כ-VIP שהוקצה:
$ kubectl exec deploy/curl -n ns1 -- curl -sS -v http://auto-allocated.internal
ניסיון החיבור אמור להסתיים בהקצאה אוטומטית של כתובת VIP (לדוגמה, 240.240.0.1:80):
* Trying 240.240.0.1:80...