Skip to content

Commit cc677c8

Browse files
authored
Merge pull request #22907 from danninov/id/dns-debugging-resolution
Add ID localization for task/dns-debugging-resolution
2 parents f169e99 + 28daaa4 commit cc677c8

File tree

2 files changed

+268
-0
lines changed

2 files changed

+268
-0
lines changed
Lines changed: 254 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,254 @@
1+
---
2+
reviewers:
3+
title: Debugging Resolusi DNS
4+
content_type: task
5+
min-kubernetes-server-version: v1.6
6+
---
7+
8+
<!-- overview -->
9+
Laman ini menyediakan beberapa petunjuk untuk mendiagnosis masalah DNS.
10+
11+
## {{% heading "prerequisites" %}}
12+
13+
{{< include "task-tutorial-prereqs.md" >}}
14+
Klaster kamu harus dikonfigurasi untuk menggunakan
15+
{{< glossary_tooltip text="addon" term_id="addons" >}} CoreDNS atau pendahulunya,
16+
kube-dns.
17+
18+
{{% version-check %}}
19+
20+
<!-- steps -->
21+
22+
### Membuat Pod sederhana yang digunakan sebagai lingkungan pengujian
23+
24+
{{< codenew file="admin/dns/dnsutils.yaml" >}}
25+
26+
Gunakan manifes berikut untuk membuat sebuah Pod:
27+
28+
```shell
29+
kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml
30+
```
31+
```
32+
pod/dnsutils created
33+
```
34+
…dan verifikasi statusnya:
35+
```shell
36+
kubectl get pods dnsutils
37+
```
38+
```
39+
NAME READY STATUS RESTARTS AGE
40+
dnsutils 1/1 Running 0 <some-time>
41+
```
42+
43+
Setelah Pod tersebut berjalan, kamu dapat menjalankan perintah `nslookup` di lingkungan tersebut.
44+
Jika kamu melihat hal seperti ini, maka DNS sudah berjalan dengan benar.
45+
46+
```shell
47+
kubectl exec -i -t dnsutils -- nslookup kubernetes.default
48+
```
49+
```
50+
Server: 10.0.0.10
51+
Address 1: 10.0.0.10
52+
53+
Name: kubernetes.default
54+
Address 1: 10.0.0.1
55+
```
56+
57+
Jika perintah `nslookup` gagal, periksa hal berikut:
58+
59+
### Periksa konfigurasi DNS lokal terlebih dahulu
60+
61+
Periksa isi dari berkas resolv.conf.
62+
(Lihat [_Inheriting_ DNS dari node](/docs/tasks/administer-cluster/dns-custom-nameservers/#inheriting-dns-from-the-node) dan
63+
[Isu-isu yang dikenal](#known-issues) di bawah ini untuk informasi lebih lanjut)
64+
65+
```shell
66+
kubectl exec -ti dnsutils -- cat /etc/resolv.conf
67+
```
68+
69+
Verifikasi _path_ pencarian dan nama server telah dibuat agar tampil seperti di bawah ini (perlu diperhatikan bahwa _path_ pencarian dapat berbeda tergantung dari penyedia layanan cloud):
70+
71+
```
72+
search default.svc.cluster.local svc.cluster.local cluster.local google.internal c.gce_project_id.internal
73+
nameserver 10.0.0.10
74+
options ndots:5
75+
```
76+
77+
Kesalahan yang muncul berikut ini mengindikasikan terdapat masalah dengan _add-on_ CoreDNS (atau kube-dns) atau Service terkait:
78+
79+
```shell
80+
kubectl exec -i -t dnsutils -- nslookup kubernetes.default
81+
```
82+
```
83+
Server: 10.0.0.10
84+
Address 1: 10.0.0.10
85+
86+
nslookup: can't resolve 'kubernetes.default'
87+
```
88+
89+
atau
90+
91+
```shell
92+
kubectl exec -i -t dnsutils -- nslookup kubernetes.default
93+
```
94+
```
95+
Server: 10.0.0.10
96+
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local
97+
98+
nslookup: can't resolve 'kubernetes.default'
99+
```
100+
101+
### Periksa apakah Pod DNS sedang berjalan
102+
103+
Gunakan perintah `kubectl get pods` untuk memverifikasi apakah Pod DNS sedang berjalan.
104+
105+
```shell
106+
kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
107+
```
108+
```
109+
NAME READY STATUS RESTARTS AGE
110+
...
111+
coredns-7b96bf9f76-5hsxb 1/1 Running 0 1h
112+
coredns-7b96bf9f76-mvmmt 1/1 Running 0 1h
113+
...
114+
```
115+
116+
{{< note >}}
117+
Nilai dari label `k8s-app` adalah `kube-dns` baik untuk CoreDNS maupun kube-dns.
118+
{{< /note >}}
119+
120+
Jika kamu melihat tidak ada Pod CoreDNS yang sedang berjalan atau Pod tersebut gagal/telah selesai, _add-on_ DNS mungkin tidak dijalankan (_deployed_) secara bawaan di lingkunganmu saat ini dan kamu harus menjalankannya secara manual.
121+
122+
### Periksa kesalahan pada Pod DNS
123+
124+
Gunakan perintah `kubectl logs` untuk melihat log dari Container DNS.
125+
126+
Untuk CoreDNS:
127+
```shell
128+
kubectl logs --namespace=kube-system -l k8s-app=kube-dns
129+
```
130+
131+
Berikut contoh log dari CoreDNS yang sehat (_healthy_):
132+
133+
```
134+
.:53
135+
2018/08/15 14:37:17 [INFO] CoreDNS-1.2.2
136+
2018/08/15 14:37:17 [INFO] linux/amd64, go1.10.3, 2e322f6
137+
CoreDNS-1.2.2
138+
linux/amd64, go1.10.3, 2e322f6
139+
2018/08/15 14:37:17 [INFO] plugin/reload: Running configuration MD5 = 24e6c59e83ce706f07bcc82c31b1ea1c
140+
```
141+
142+
Periksa jika ada pesan mencurigakan atau tidak terduga dalam log.
143+
144+
### Apakah layanan DNS berjalan?
145+
146+
Verifikasi apakah layanan DNS berjalan dengan menggunakan perintah `kubectl get service`.
147+
148+
```shell
149+
kubectl get svc --namespace=kube-system
150+
```
151+
```
152+
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
153+
...
154+
kube-dns ClusterIP 10.0.0.10 <none> 53/UDP,53/TCP 1h
155+
...
156+
```
157+
158+
{{< note >}}
159+
Nama layanan adalah `kube-dns` baik untuk CoreDNS maupun kube-dns.
160+
{{< /note >}}
161+
162+
Jika kamu telah membuat Service atau seharusnya Service telah dibuat secara bawaan namun ternyata tidak muncul, lihat
163+
[_debugging_ Service](/docs/tasks/debug-application-cluster/debug-service/) untuk informasi lebih lanjut.
164+
165+
### Apakah endpoint DNS telah ekspos?
166+
167+
Kamu dapat memverifikasikan apakah _endpoint_ DNS telah diekspos dengan menggunakan perintah `kubectl get endpoints`.
168+
169+
```shell
170+
kubectl get endpoints kube-dns --namespace=kube-system
171+
```
172+
```
173+
NAME ENDPOINTS AGE
174+
kube-dns 10.180.3.17:53,10.180.3.17:53 1h
175+
```
176+
177+
Jika kamu tidak melihat _endpoint_, lihat bagian _endpoint_ pada dokumentasi
178+
[_debugging_ Service](/docs/tasks/debug-application-cluster/debug-service/).
179+
180+
Untuk tambahan contoh Kubernetes DNS, lihat
181+
[contoh cluster-dns](https://github.com/kubernetes/examples/tree/master/staging/cluster-dns) pada repositori Kubernetes GitHub.
182+
183+
### Apakah kueri DNS diterima/diproses?
184+
185+
Kamu dapat memverifikasi apakah kueri telah diterima oleh CoreDNS dengan menambahkan plugin `log` pada konfigurasi CoreDNS (alias Corefile).
186+
CoreDNS Corefile disimpan pada {{< glossary_tooltip text="ConfigMap" term_id="configmap" >}} dengan nama `coredns`. Untuk mengeditnya, gunakan perintah:
187+
188+
```
189+
kubectl -n kube-system edit configmap coredns
190+
```
191+
192+
Lalu tambahkan `log` pada bagian Corefile seperti contoh berikut:
193+
194+
```yaml
195+
apiVersion: v1
196+
kind: ConfigMap
197+
metadata:
198+
name: coredns
199+
namespace: kube-system
200+
data:
201+
Corefile: |
202+
.:53 {
203+
log
204+
errors
205+
health
206+
kubernetes cluster.local in-addr.arpa ip6.arpa {
207+
pods insecure
208+
upstream
209+
fallthrough in-addr.arpa ip6.arpa
210+
}
211+
prometheus :9153
212+
proxy . /etc/resolv.conf
213+
cache 30
214+
loop
215+
reload
216+
loadbalance
217+
}
218+
```
219+
220+
Setelah perubahan disimpan, perubahan dapat memakan waktu satu hingga dua menit untuk Kubernetes menyebarkan perubahan ini pada Pod CoreDNS.
221+
222+
Berikutnya, coba buat beberapa kueri dan lihat log pada bagian atas dari dokumen ini. Jika pod CoreDNS menerima kueri, kamu seharusnya akan melihatnya pada log.
223+
224+
Berikut ini contoh kueri yang terdapat di dalam log:
225+
226+
```
227+
.:53
228+
2018/08/15 14:37:15 [INFO] CoreDNS-1.2.0
229+
2018/08/15 14:37:15 [INFO] linux/amd64, go1.10.3, 2e322f6
230+
CoreDNS-1.2.0
231+
linux/amd64, go1.10.3, 2e322f6
232+
2018/09/07 15:29:04 [INFO] plugin/reload: Running configuration MD5 = 162475cdf272d8aa601e6fe67a6ad42f
233+
2018/09/07 15:29:04 [INFO] Reloading complete
234+
172.17.0.18:41675 - [07/Sep/2018:15:29:11 +0000] 59925 "A IN kubernetes.default.svc.cluster.local. udp 54 false 512" NOERROR qr,aa,rd,ra 106 0.000066649s
235+
```
236+
237+
## Isu-isu yang Dikenal
238+
239+
Beberapa distribusi Linux (contoh Ubuntu) menggunakan _resolver_ DNS lokal secara bawaan (systemd-resolved).
240+
Systemd-resolved memindahkan dan mengganti `/etc/resolv.conf` dengan berkas _stub_ yang dapat menyebabkan _forwarding loop_ yang fatal saat meresolusi nama pada server _upstream_. Ini dapat diatasi secara manual dengan menggunakan _flag_ kubelet `--resolv-conf`
241+
untuk mengarahkan ke `resolv.conf` yang benar (Pada `systemd-resolved`, ini berada di `/run/systemd/resolve/resolv.conf`).
242+
kubeadm akan otomatis mendeteksi `systemd-resolved`, dan menyesuaikan _flag_ kubelet sebagai mana mestinya.
243+
244+
Pemasangan Kubernetes tidak menggunakan berkas `resolv.conf` pada _node_ untuk digunakan sebagai klaster DNS secara _default_, karena proses ini umumnya spesifik pada distribusi tertentu. Hal ini bisa jadi akan diimplementasi nantinya.
245+
246+
Libc Linux (alias glibc) secara bawaan memiliki batasan `nameserver` DNS sebanyak 3 rekaman (_records_). Selain itu, pada glibc versi yang lebih lama dari glibc-2.17-222 ([versi terbaru lihat isu ini](https://access.redhat.com/solutions/58028)), jumlah rekaman DNS `search` dibatasi sejumlah 6 ([lihat masalah sejak 2005 ini](https://bugzilla.redhat.com/show_bug.cgi?id=168253)). Kubernetes membutuhkan 1 rekaman `nameserver` dan 3 rekaman `search`. Ini berarti jika instalasi lokal telah menggunakan 3 `nameserver` atau menggunakan lebih dari 3 `search`,sementara versi glibc kamu termasuk yang terkena dampak, beberapa dari pengaturan tersebut akan hilang. Untuk menyiasati batasan rekaman DNS `nameserver`, _node_ dapat menjalankan `dnsmasq`,yang akan menyediakan `nameserver` lebih banyak. Kamu juga dapat menggunakan kubelet `--resolv-conf` _flag_. Untuk menyiasati batasan rekaman `search`, pertimbangkan untuk memperbarui distribusi linux kamu atau memperbarui glibc ke versi yang tidak terdampak.
247+
248+
Jika kamu menggunakan Alpine versi 3.3 atau lebih lama sebagai dasar _image_ kamu, DNS mungkin tidak dapat bekerja dengan benar disebabkan masalah dengan Alpine.
249+
[Masalah 30215](https://github.com/kubernetes/kubernetes/issues/30215) Kubernetes menyediakan informasi lebih detil tentang ini.
250+
251+
## {{% heading "whatsnext" %}}
252+
253+
- Lihat [Penyekalaan otomatis Service DNS dalam klaster](/docs/tasks/administer-cluster/dns-horizontal-autoscaling/).
254+
- Baca [DNS untuk Service dan Pod](/docs/concepts/services-networking/dns-pod-service/)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: v1
2+
kind: Pod
3+
metadata:
4+
name: dnsutils
5+
namespace: default
6+
spec:
7+
containers:
8+
- name: dnsutils
9+
image: gcr.io/kubernetes-e2e-test-images/dnsutils:1.3
10+
command:
11+
- sleep
12+
- "3600"
13+
imagePullPolicy: IfNotPresent
14+
restartPolicy: Always

0 commit comments

Comments
 (0)