Menyiapkan Proxy DNS

Kubernetes secara native me-resolve nama DNS hanya untuk Services di cluster lokal. Proxy DNS memungkinkan Anda me-resolve Services Kubernetes di seluruh cluster jarak jauh dalam penyiapan multi-cluster dan membuat data DNS untuk resource ServiceEntry. Hal ini membantu Anda merutekan traffic ke nama host internal tanpa mengelola server DNS internal tambahan.

Mengonfigurasi Proxy DNS

Untuk mengonfigurasi proxy DNS, konfigurasikan flag ISTIO_META_DNS_CAPTURE sebagai berikut. Anda dapat memilih konfigurasi luas 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 memastikan 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 Service ns1/svc1 berikut, 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 lain ke Service, cluster tersebut akan menampilkan ClusterIP 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 Proxy DNS, 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 implementasi bidang kontrol Anda:

TRAFFIC_DIRECTOR

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

Contoh berikut menunjukkan ConfigMap asm-options dengan alokasi 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 implementasi bidang kontrol ISTIOD (dalam cluster atau ISTIOD terkelola), konfigurasikan 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. Memeriksa alamat yang dialokasikan di status.addresses (khusus TRAFFIC_DIRECTOR)

Dalam implementasi 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 implementasi TRAFFIC_DIRECTOR dan ISTIOD, kirim permintaan dari Pod tempat Proxy DNS diaktifkan untuk memverifikasi bahwa resolusi nama di-resolve ke VIP yang dialokasikan:

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

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

*   Trying 240.240.0.1:80...