# k8s 大哉問(? [toc] ## 1. 我有一個 domain 為啥無法解析?該怎麼 troubleshooting?可能原因是? ### 1. 如果是跨 namespace 的需要指定 namespace ,例如:`test` on `prod` namespace: domain 會是 test.prod > :question: pod 內需要指定 domain 嗎?不行直接連 service name 就好嗎? >> [是的](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/#namespaces-of-services) > :question: 那為什麼 pod 知道這個 test domain? >> resolv.conf 有放 >>  >> :question: 我沒有設定 `resolv.conf ` 怎麼知道有這些 domain? >>> k8s 會幫你設喔,貼心吧<br> >>> :question: 那我想自己設定的話?該怎麼設定? >>>> spec.dnsPolicy: "None" and set `spec.dnsConfig`<br> >>>> :question: 這個看起來是要逐一設定 pod 我有辦法讓整個 cluster 預設 resolv.conf 設定嗎? >>>>> 哪一種的預設? >>>>> => 在 Kubernetes 整個 cluster 所建立的 pod 使用的 `resolv.conf` 都是自定義的 <br> >>>>> 1. 可以 deploy 時 spec.dnsPolicy: "default",這會直接吃 node 的 >>>>> 2. 或更改[KubeletConfiguration](https://kubernetes.io/docs/reference/config-api/kubelet-config.v1beta1/#kubelet-config-k8s-io-v1beta1-KubeletConfiguration) 中的 resolvConf 來設定 basic resolv.conf >>>>> 3. 寫 MutatingAdmissionWebhook 來塞 ### 2. 確認 k8s 的 DNS 有執行 > :question: 怎麼確認 DNS 有執行? >> `kubectl get -n kube-system deployments.apps coredns`<br> >> :question: 我有看到都是 running 還是有無法解析問題,那我該怎麼辦? >>> 修改 CoreDNS config,加入 log >>> ```conf= >>> apiVersion: v1 >>> data: >>> Corefile: | >>> .:53 { >>> log >>> ... >>> } >>> ``` >>> 觀察 log 看 request 是否有到 CoreDNS,以辨識是否是 CoreDNS 的問題<br> >>> :question: 除了看 log 之外,還有其他方式可以看 CoreDNS pod 是否正常解析嗎? >>>> tcpdump ### 3. 確認 CoreDNS `kubectl get -n kube-system configmaps coredns -o yaml | less` > :question: 這個命令是希望檢查什麼? >> node level 的解析規則 >> ```conf= >> apiVersion: v1 >> data: >> Corefile: | >> .:53 { >> errors >> health { >> lameduck 5s >> } >> ready >> kubernetes cluster.local in-addr.arpa ip6.arpa { >> pods insecure >> fallthrough in-addr.arpa ip6.arpa >> ttl 30 >> } >> prometheus :9153 >> forward . /etc/resolv.conf { >> max_concurrent 1000 >> } >> cache 30 >> loop >> reload >> loadbalance >> } >> kind: ConfigMap >> metadata: >> creationTimestamp: "2021-09-24T07:29:43Z" >> name: coredns >> namespace: kube-system >> resourceVersion: "223" >> uid: ea542261-1256-4abf-af3f-586bdd3d5ede >> ``` >> :question: 可是上面的 config 看起來是 CoreDNS config,node 上怎麼看這個 CoreDNS config 的? >>> 沒有在 master node 上?<br> >>> :question: CoreDNS 一定要部署在 master node 嗎?我部署在 worker node 上不行嗎? >>>> 我看起來是不行(可以嗎?<br> >>>> :question: 不行的話,那有文件嗎? >>>>> deployment 的文件可以算嗎? <br> >>>>> :question: deployment 有什麼定義需要一定放在 master node 上嗎? >>>>>>  -> 建議可以放純文字,比較好編輯或補充內文 >>>>>>> :question: 可是 toleration 定義是 `NoSchedule=noderole.kubernetes.io/master` 不就代表他不要 schedule role 為 master 或 control-plane 上面嗎?<br> >>>>>>> 文件上是說不符合這條件就不 schedule [文件](https://kubernetes.io/docs/concepts/scheduling-eviction/taint-and-toleration/) >>>>>>> :::info >>>>>>> places a taint on node node1. The taint has key key1, value value1, and taint effect NoSchedule. This means that no pod will be able to schedule onto node1 unless it has a matching toleration. >>>>>>> ::: >>>>>>> :question: 那這些 toleration 不行拿掉,讓他部署在 worker node 上面嗎? >>>>>>>> 我有看到可以,[文件](https://github.com/kubernetes/kubeadm/issues/1931#issuecomment-753932305) ### 4. 我是使用官方說的方式 在你出事的 namespace 建立一個 `dnsutils` pod,exec 進這個 pod 研究 > :question: 可是如果 dnsutils 檢查都正常,那只有 deploy 的其中 2 個 pod 不行?該怎麼檢查?(假使全部的 pod 都正常,只有一兩個 pod 不行) >> ip 衝突<br> >> :question: 什麼情況會 IP 衝突? >>> 有設 network policy >>> - limit pod >>> - limit namespace >>> - limit ip block >>>> :question: 上述 network policy 為什麼會影響 DNS 解析? >>>>> 該 pod 對外連線被限制住 <br> >>>>> :question: 如果被限制住了,那我應該開放哪些 port? >>>>>> 53 ## 2. 如果我有一個節點無法加入 k8s cluster,該怎麼 troubleshooting?可能原因是? ### 1. 網路在不同子網域 可以使用 ping 或 traceroute > :question: 如果是同網段,還是無法加入? >> kubeadm ..... -v 10 來看是卡在哪? >>> :question: kubeadm 在跟節點加入過程中,有幫忙做了哪些事情? >>>>  >>>> 1. 確認 node 有符合要求 >>>>> :question: 需要符合哪些要求? >>>> 2. 驗證,並取得憑證 >>>>> :question: kubeadm 怎麼進行驗證? >>>> 3. 讀取 `kubeadm-config` from master >>>>> :question: 為什麼需要讀取 kubeadm-config? >>>> 4. 設定 kubelet >>>> [文件](https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/#join-workflow) >>>>> :question: 設定 kubelet 那些參數? ### 2. 被防火牆擋住:因 k8s 目前只支援 iptable ,所以請查看 iptable 有沒有誤設 :::info kube-proxy 也有支援 ipvs mode,不過當然目前是講預設 iptable mode ::: ### 3. key 錯了 > :question: 什麼的 key 錯了? >> --discovery-token <br> >> --discovery-token-ca-cert-hash <br> >> :question: 為什麼上面的 key 設定錯誤會導致無法 node 加入問題? >>> k8s 需要進行認證雙邊認證 `discovery-token` 代表你(worker)不是隨便的人 `--discovery-token-ca-cert-hash` 認證 master node ## 3. 為什麼 [Istio](https://istio.io/) 可以幫我 inject sidecar container,可以自己實作一個類似功能嗎? ### 1. MutatingAdmissionWebhook ### 2. 可以,向 k8s 講你的 MutatingAdmissionWebhook 的 uri 即可(need TLS)[網址](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/) > :question: MutatingAdmissionWebhook 主要是做什麼?在 Kubernetes 上我有需要特別設定什麼嗎? >> 他可以針對 request 進行修改,例如增加一個 volume 或 container 等<br> >> 向 k8s 講你的 MutatingAdmissionWebhook 的 uri 即可(need TLS)[網址](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/) ## 4. 如果發現 kubectl 命令很慢,該怎麼 troubleshooting?可能原因是? ### 1. 看看 apiserver 是不是一直重啟 ### 2. `kubectl get pod -o wide -v=10` > :question: 這個命令希望看什麼呢? >> `kubectl get pod -o wide` 是卡在什麼地方<br> >> :question: `kubectl get pod` 正常,但是 kubectl exec <POD_NAME> or kubectl get logs <POD_NAME> 偶爾會有錯誤,那我該查什麼? >>> 我認為是 storage 出錯了,或 CRI 那有問題 >>>> :question: 是哪裡的 storage 或 CRI 出問題?依據為? ### 4. 看看 apiserver 的 log > :question: 看了 log 沒重啟,除了 CPU loading 之外,還有什麼可能原因會造成 kubectl 命令慢? >> - 網路慢 >> - 網路衝突 >> - etcd 有問題 ### 5. 伺服器目前的 loading 是不是很重 > :question: 如果 loading 重,那我要怎麼檢查是什麼原因造成 loading 重 >> 看 log <br> >> :question: 看什麼 log ? >>> `kubectl logs -n kube-system -l component=etcd` <br> >>> `kubectl logs -n kube-system -l component=kube-apiserver`<br> >>> 看 [metrics](https://kubernetes.io/docs/concepts/cluster-administration/system-metrics/) >>>> :question: 可以明確描述一下可能可以觀察哪些 metrics 嗎? >>>>> 對這邊就不太熟了, >>>>> 我最多只能找到[別人做好的](https://promcat.io/apps/kubernetes-control-plane) ## 5. 如果使用以下 kubectl command 會發生什麼事? ``` $ kubectl run -it myapp –image alpine -- /bin/sh ``` 報錯:指令是錯的喔 `--`少一槓 XD ```shell= kubectl run -it myapp --image=alpine -- /bin/sh ``` 因為沒有指定 namespace 故使用 `default`,image 沒指定版本故使用 latest, restart 會是 always,所以 `exit` 出來,pod 會被重啟。 > :question: 為什麼 node 知道要部署這個 alpine 的 pod? >> 首先 scheduler 會定時去問 api server 有沒有東西要被 schedule >> 當有 pod 需要被 schedule,api server 會被動通知,scheduler schedule pod >> api server 再根據 scheduler 的決定通知該 node 的 kubelet <br> >> :question: scheduler 怎麼去評斷要去部署在哪一個 node?scheduler 會做哪些事情? >>> :::info >>> Factors that need to be taken into account for scheduling decisions include individual and collective resource requirements, hardware / software / policy constraints, affinity and anti-affinity specifications, data locality, inter-workload interference, and so on. >>> ::: >>> 1. 資源(cpu mem storge)要夠 >>> 2. 根據 policy 打分數,價高者得 >>> >>> [~~文檔~~文件](https://kubernetes.io/docs/concepts/scheduling-eviction/kube-scheduler/) >>> [policy](https://kubernetes.io/docs/reference/scheduling/policies/) >>>> :question: 所以具體 scheduler 有哪些步驟來選擇 node >>>> :question: Kubernetes 可以替換不同的 scheduler 嗎? ## 6. 如果我有一個 node 顯示 NotReady 該怎麼 troubleshooting?有哪些可能原因是? 1. CNI 未安裝 2. kube-proxy 未成功 > :question: kube-proxy 未成功,那為什麼還可以顯示 NotReady?而不會是一開始就無法加入,導致 `kubectl get node` 命令無法顯示? 4. (master) etcd 未成功 5. (master) cloud-controller-manager 未成功 6. (master) kube-scheduler 未成功 7. (master) kube-apiserver 未成功 > :question: nodes 都需要跟上面 components 連線嗎? ## 7. Ingress 跟 Service resource 差別在哪裡?
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up