Menyiapkan Proxy DNS

Proxy DNS adalah fitur untuk menyediakan kemampuan berikut:

  1. Menyebarkan entri DNS Services di seluruh cluster dalam penyiapan multi-cluster.
  2. Mengisi entri DNS untuk ServiceEntry.

Kubernetes menyediakan resolusi DNS hanya untuk Services di cluster lokal. Saat Anda perlu menyediakan resolusi nama untuk Services di cluster jarak jauh atau menggunakan nama host khusus internal dengan ServiceEntry tanpa memiliki server DNS khusus internal tambahan, Proxy DNS menyediakan cara untuk menyelesaikan nama DNS untuk kasus tersebut.

Mengonfigurasi Proxy DNS

Untuk mengonfigurasi proxy DNS, konfigurasi flag ISTIO_META_DNS_CAPTURE sebagai berikut. Anda dapat memilih konfigurasi seluruh cluster atau per-proxy.

Konfigurasi seluruh cluster

Untuk mengonfigurasi proxy DNS di cluster, tambahkan metadata proxy ISTIO_META_DNS_CAPTURE ke ConfigMap untuk MeshConfig. Nama ConfigMap memiliki format istio-<revision_name>. Untuk mengetahui detail revisi, lihat ringkasan revisi

apiVersion: v1
data:
  mesh: |-
    ...
    defaultConfig:
      proxyMetadata:
        ISTIO_META_DNS_CAPTURE: "true"        
    ...
kind: ConfigMap
metadata:
  name: istio-<revision_name>
  namespace: istio-system

Konfigurasi per proxy

Untuk mengonfigurasi proxy DNS untuk proxy, tambahkan anotasi metadata proxy ISTIO_META_DNS_CAPTURE sebagai berikut:

kind: Deployment
metadata:
  name: app1
  namespace: ns1
spec:
...
  template:
    metadata:
      annotations:
        proxy.istio.io/config: |
          proxyMetadata:
            ISTIO_META_DNS_CAPTURE: "true"
...

Memverifikasi

Untuk memverifikasi bahwa semuanya dikonfigurasi dengan benar, jalankan langkah-langkahnya.

Resolusi nama untuk Service di seluruh cluster

Setelah penyiapan multi-cluster, deploy Service hanya di salah satu cluster untuk memverifikasi resolusi nama lintas cluster.

Jika Anda memiliki contoh berikut Service ns1/svc1, Anda dapat menemukan ClusterIP di Service.

$ kubectl get -n ns1 svc1
kind: Service
metadata:
  name: svc1
  namespace: ns1
spec:
...
  ClusterIP: 210.200.1.1
...

Kemudian, saat menggunakan curl dari cluster lainnya ke Service, ClusterIP akan ditampilkan sebagai berikut.

curl -sS -v svc1.ns1.svc.cluster.local
*   Trying 210.200.1.1:80...

Resolusi nama untuk ServiceEntry

Tambahkan ServiceEntry dengan nama host yang tidak terdaftar di DNS Anda. Untuk memverifikasi resolusi nama, contoh berikut memiliki alamat eksplisit 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

Kemudian, coba resolusi DNS di Pod tempat Proxy DNS diaktifkan. Misalnya, jika Anda menjalankan curl di Pod, alamat IP akan ditampilkan sebagai berikut:

curl -sS -v not-existing-hostname.internal
*   Trying 192.168.123.123:80...

Alokasi otomatis IP untuk ServiceEntry

Saat menggunakan ServiceEntry dengan DNS Proxy, Anda dapat mengaktifkan alokasi otomatis IP secara opsional. Jika diaktifkan, alamat IP internal (dari rentang 240.240.0.0/16) akan otomatis dialokasikan untuk host ServiceEntry yang tidak menentukan alamat IP eksplisit di spec.addresses.

Mengaktifkan alokasi otomatis IP

Untuk mengaktifkan alokasi otomatis IP, ikuti petunjuk untuk penerapan bidang kontrol Anda:

TRAFFIC_DIRECTOR

Untuk penerapan bidang kontrol TRAFFIC_DIRECTOR, konfigurasikan alokasi otomatis IP di asm-options ConfigMap dalam namespace istio-system dengan menyetel ip_auto_allocation: "true".

Contoh berikut menunjukkan asm-options ConfigMap dengan pengalokasian otomatis IP diaktifkan:

apiVersion: v1
kind: ConfigMap
metadata:
  name: asm-options
  namespace: istio-system
data:
  # Enable IP auto-allocation for ServiceEntry (Rapid channel)
  ip_auto_allocation: "true"

Anda juga dapat menerapkan konfigurasi ini menggunakan kubectl patch:

kubectl patch configmap/asm-options -n istio-system --type merge \
  -p '{"data":{"ip_auto_allocation":"true"}}'

ISTIOD

Untuk cluster yang menggunakan penerapan bidang kontrol ISTIOD (dalam cluster atau ISTIOD terkelola), konfigurasi alokasi otomatis IP dengan menambahkan ISTIO_META_DNS_AUTO_ALLOCATE: "true" ke metadata proxy Anda dalam 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

Memverifikasi alokasi otomatis IP

Anda dapat memverifikasi bahwa alokasi otomatis IP berfungsi menggunakan langkah-langkah berikut.

Sebelum verifikasi, buat ServiceEntry tanpa menentukan 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. Periksa alamat yang dialokasikan di status.addresses (khusus TRAFFIC_DIRECTOR)

Dalam penerapan TRAFFIC_DIRECTOR, pengontrol mengalokasikan VIP dan mengisi kolom status.addresses dari ServiceEntry:

$ kubectl get serviceentry auto-allocated-service-entry -n ns1 -o yaml

Output akan menampilkan alamat yang dialokasikan di bagian status.addresses:

status:
  addresses:
  - host: auto-allocated.internal
    value: 240.240.0.1

2. Menguji resolusi DNS dari Pod (TRAFFIC_DIRECTOR dan ISTIOD)

Dalam penerapan TRAFFIC_DIRECTOR dan ISTIOD, kirim permintaan dari Pod tempat Proxy DNS diaktifkan untuk memverifikasi bahwa resolusi nama diselesaikan ke VIP yang dialokasikan:

$ kubectl exec deploy/curl -n ns1 -- curl -sS -v http://auto-allocated.internal

Upaya koneksi harus diselesaikan ke VIP yang dialokasikan secara otomatis (misalnya, 240.240.0.1:80):

*   Trying 240.240.0.1:80...