הגדרת שרת Proxy של DNS

DNS Proxy היא תכונה שמספקת את היכולות הבאות:

  1. הפצת רשומות DNS של Services באשכולות בהגדרה מרובת אשכולות.
  2. מתבצע אכלוס של רשומות DNS עבור ServiceEntry.

‫Kubernetes מספק פענוח DNS רק עבור Services באשכול המקומי. אם אתם צריכים לספק רזולוציית שמות עבור Services באשכולות מרוחקים או להשתמש בשם מארח פנימי בלבד עם ServiceEntry בלי שיהיה לכם שרת DNS פנימי בלבד נוסף, DNS Proxy מספק דרך לפתור שמות DNS במקרים כאלה.

הגדרת שרת Proxy ל-DNS

כדי להגדיר פרוקסי DNS, מגדירים את הדגל ISTIO_META_DNS_CAPTURE באופן הבא. אפשר לבחור את ההגדרה של האשכול או את ההגדרה של כל שרת proxy.

הגדרה ברמת האשכול

כדי להגדיר שרת proxy ל-DNS באשכול, מוסיפים את מטא-נתוני ה-proxy‏ ISTIO_META_DNS_CAPTURE ל-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 שבו מופעל שרת proxy של DNS. לדוגמה, אם מריצים את הפקודה 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...