helm installでingress-nginxがtimed out waiting for the conditionを起こしたことでk8sのコンポーネントを学べた

スポンサーリンク
個人開発

はじめに

先日、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

最後に

エラーなどのトラブルシューティングは学びが多いのでたまにはするべきですね。

タイトルとURLをコピーしました