はじめに
先日、helm installでingress-nginxを導入しようとしたら以下のエラーが発生しました。
$ helm install ingress-nginx-1 ingress-nginx/ingress-nginx -n ingress-nginx
Error: INSTALLATION FAILED: failed pre-install: 1 error occurred:
* timed out waiting for the condition
今回はこのエラーの対処と、エラー解消までの経緯の中で学んだk8sのアーキテクチャについて記載しようと思います。
ちなみに、今回の環境はk8sのmaster nodeで実施したものになります。
試行錯誤
まずは、kubectl get eventsの実行をしてみます。
参考: (https://stackoverflow.com/questions/51975069/helm-test-failure-timed-out-waiting-for-the-condition)
appare99@k8s-master:~ $ kubectl get events -n ingress-nginx
LAST SEEN TYPE REASON OBJECT MESSAGE
5m21s Normal Scheduled pod/ingress-nginx-1-admission-create-zflfs Successfully assigned ingress-nginx/ingress-nginx-1-admission-create-zflfs to k8s-worker1
110s Normal Pulled pod/ingress-nginx-1-admission-create-zflfs Container image "registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.5.0@sha256:aaafd456bda110628b2d4ca6296f38731a3aaf0bf7581efae824a41c770a8fc4" already present on machine
110s Normal Created pod/ingress-nginx-1-admission-create-zflfs Created container create
110s Normal Started pod/ingress-nginx-1-admission-create-zflfs Started container create
15s Warning BackOff pod/ingress-nginx-1-admission-create-zflfs Back-off restarting failed container create in pod ingress-nginx-1-admission-create-zflfs_ingress-nginx(f1e9c97a-2e28-4086-a104-d6addcbbb923)
5m21s Normal SuccessfulCreate job/ingress-nginx-1-admission-create Created pod: ingress-nginx-1-admission-create-zflfs
Back-off restarting failed container create in pod ingress-nginx-1-admission-create-zflfs_ingress-nginx
というものが発生しており、ingress-nginx-controller-admissionを作成する時に失敗しているように見えます。
ChatGPT先生に聞くと、admission-create
は、Admission Webhookのための 証明書作成処理 を行う 一時的なJobで、このadmission-create
が失敗して証明書が作成できないため、結果的にIngress 作成時にエラーになっているのだとか。
🥲「フーン、さっぱりわからん」って感じで、結局それはどうすんだよって思ったんですが、podがあったので、
$ kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-1-admission-create-k8wql 0/1 CrashLoopBackOff 5 (40s ago) 6m42s
ログも見てみます。
$ kubectl logs ingress-nginx-1-admission-create-k8wql -n ingress-nginx
W0530 14:58:16.148495 1 client_config.go:667] Neither --kubeconfig nor --master was specified. Using the inClusterConfig. This might not work.
{"err":"Get \"https://10.96.0.1:443/api/v1/namespaces/ingress-nginx/secrets/ingress-nginx-1-admission\": dial tcp 10.96.0.1:443: i/o timeout","level":"fatal","msg":"error getting secret","source":"k8s/k8s.go:232","time":"2025-05-30T14:58:46Z"}
"Get \"https://10.96.0.1:443/api/v1/namespaces/ingress-nginx/secrets/ingress-nginx-1-admission\": dial tcp 10.96.0.1:443: i/o timeout"
とのことで、
10.96.0.1へのアクセスがタイムアウトで上手くいっていないようです。
ここで、10.96.0.1はKubernetes API サーバのサービスです。
Kubernetes クラスタが起動すると、自動的に以下のような Service が default namespace に作成されます(上記エラーに出てきている10.96.0.1ですね)
$ kubectl get svc kubernetes
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 68d
Pod 内のアプリケーションがhttps://kubernetes.default.svc
で Kubernetes API を参照しようとします。
このhttps://kubernetes.default.svc
という名前は DNS(CoreDNS)を通じて 10.96.0.1 などの IP に変換されます。
さて、ここで問題になるのが、CoreDNS がクラッシュしていたり、Podが異常終了していると名前解決が失敗するという事です。
そして、名前解決ができないとhttps://kubernetes.default.svc
の URL が無効になり、タイムアウトします。
CoreDNSを確認してみると、以下のようになっていました。
$ kubectl get pods -n kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-7db6d8ff4d-5c9b4 0/1 ContainerCreating 0 68d
coredns-7db6d8ff4d-827j7 0/1 ContainerCreating 0 68d
ずっとコンテナが作り途中ですね。
ちなみに、ここで、kube-systemというnamespaceを指定しましたが、
kube-systemはデフォルトで作成されるnamespaceです。
kube-systemのpodは以下のようになっています。
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7db6d8ff4d-5c9b4 0/1 ContainerCreating 0 68d
coredns-7db6d8ff4d-827j7 0/1 ContainerCreating 0 68d
etcd-k8s-master 1/1 Running 1 68d
kube-apiserver-k8s-master 1/1 Running 1 68d
kube-controller-manager-k8s-master 1/1 Running 7 (35h ago) 68d
kube-proxy-gbvvq 1/1 Running 0 68d
kube-proxy-rgzkb 1/1 Running 0 68d
kube-proxy-zd47t 1/1 Running 1 68d
kube-scheduler-k8s-master 1/1 Running 7 (35h ago) 68d
各podの説明は以下です。
- coredns-xxxx
- DNSサーバ
- 「Service名 → IP名」解決を行う
- etcd
- クラスタの情報を保存し、管理する分散Key-Valueストア
- kube-apiserver
- APIのエントリーポイント
- k8sのコンポーネントとやりとりをする
- kube-controller-manager
- k8sのオブジェクトを処理するコントローラを実行、管理する
- kube-proxy-xxxxx
- Serviceをもとにルーティングを実施
- kube-scheduler
- PodをNodeへスケジュールする
解消
flannelを入れる
$ kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
確認する
$ kubectl get ns | grep flannel
kube-flannel Active 5m54s
これで、CoreDNSを確認すると動いていました。
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-7db6d8ff4d-5c9b4 1/1 Running 0 68d
coredns-7db6d8ff4d-827j7 1/1 Running 0 68d
etcd-k8s-master 1/1 Running 1 68d
kube-apiserver-k8s-master 1/1 Running 1 68d
kube-controller-manager-k8s-master 1/1 Running 8 (3m14s ago) 68d
kube-proxy-gbvvq 1/1 Running 0 68d
kube-proxy-rgzkb 1/1 Running 0 68d
kube-proxy-zd47t 1/1 Running 1 68d
kube-scheduler-k8s-master 1/1 Running 8 (3m14s ago) 68d
これでingress-nginxのinstallが無事できました。
$ helm install ingress-nginx-1 ingress-nginx/ingress-nginx -n ingress-nginx
NAME: ingress-nginx-1
LAST DEPLOYED: Sat May 31 10:11:01 2025
NAMESPACE: ingress-nginx
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The ingress-nginx controller has been installed.
It may take a few minutes for the load balancer IP to be available.
You can watch the status by running 'kubectl get service --namespace ingress-nginx ingress-nginx-1-controller --output wide --watch'
An example Ingress that makes use of the controller:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example
namespace: foo
spec:
ingressClassName: nginx
rules:
- host: www.example.com
http:
paths:
- pathType: Prefix
backend:
service:
name: exampleService
port:
number: 80
path: /
# This section is only required if TLS is to be enabled for the Ingress
tls:
- hosts:
- www.example.com
secretName: example-tls
If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:
apiVersion: v1
kind: Secret
metadata:
name: example-tls
namespace: foo
data:
tls.crt: <base64 encoded cert>
tls.key: <base64 encoded key>
type: kubernetes.io/tls
最後に
エラーなどのトラブルシューティングは学びが多いのでたまにはするべきですね。