1. 記事一覧 >
  2. ブログ記事
category logo

Ubuntu 20.04 LTSのオンプレにKubernetes環境構築からnginx Pod稼働まで

(更新) (公開)

はじめに

インストールしたての Ubuntu 20.04 LTS のオンプレ環境に Kubernetes 環境(マスターノードとワーカーノード)を構築し、nginx の Pod 稼働まで確認しました。今回、その全手順を書きたいと思います。
Ubuntu 20.04 LTS のオンプレ環境は、マスターノードとワーカーノードともに過去記事「ubuntu-20.04.20-desktop-amd64 を VMware-workstation-12.5.5 にインストール」の手順で、VMware 上にインストールしたものです。


完成図は、以下です。

Ubuntu Kubernetes 完成図

目次
Docker インストール
Kubernetes インストール
マスターノード構築準備
マスターノード構築
ワーカーノード追加
Flannel インストール
Pod 追加
Service 追加
トラブルシュートまとめ


なお、今回、インターネットに直接繋がる環境ではなく、Proxy サーバーを通して、インターネットに繋がります。Proxy 越しネット環境の手順になります。
今回の手順中、HTTP プロキシ:http://192.168.0.158:3128/、HTTPS プロキシ:http://192.168.0.158:3128/とします。

Ubuntu Kubernetes プロキシ環境 図

【マスターノード環境】

VMware Workstation Pro 16

 Ubuntu 20.04.2 LTS

  Docker 20.10.12

  Kubernetes 1.23

【ワーカーノード環境】

VMware Workstation Pro 16

 Ubuntu 20.04.2 LTS

  Docker 20.10.12

  Kubernetes 1.23

   nginx:1.21.6-alpine


インストールは、全てroot権限で行っていますので、sudoは省略しています。


Docker インストール

Ubuntu Kubernetes Docker インストール 図

Docker をインストールします。


apt,curl が Proxy 越しにインターネットへ出られるように、プロキシサーバーの環境変数をセットします。

# export http_proxy="http://192.168.0.158:3128"
# export https_proxy="http://192.168.0.158:3128"

docker インストールに必要なパッケージをインストールします。

# apt update
# apt install -y apt-transport-https ca-certificates curl software-properties-common

docker リポジトリ鍵を登録します。

# curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

docker リポジトリを登録します。

# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
# apt update

docker をインストールします。

# apt install -y docker-ce

E: Package 'docker-ce' has no installation candidate

エラーになる時は、stable(安定)版が無いため、docker-ce edge版かtest版が必要のようです。

# add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable edge test"

でやり直しが必要です。

# docker -v
Docker version 20.10.12, build e91ed57

docker が起動しているか確認します。

# systemctl status docker
● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2022-01-29 00:50:38 PST; 4min 44s ago

OKです。


Kubernetes インストール

Ubuntu Kubernetes kubelet kubeadm kubectl インストール 図

Kubernetes をインストールします。「Kubernetes をインストール」と言っても、実際のところ、kubeletkubeadmkubectlをインストールになります。

kubelet: Pod の起動や管理を行うサービスです。

kubeadm: Kubernetes クラスターを構築するコマンドラインツールです。

kubectl: クラスターにアクセスして各種操作を行うコマンドラインツールです。kube-apiserver の API にアクセスして、各種操作を行っています。API は、curl コマンドでもアクセスできますが、API の仕様を調べないといけなく、kubectl を使った方が楽なので、インストールします。

通常、マスターノードにkubeletは有りませんが、kubeadmが必要とするため、このやり方の場合、マスターノードにも存在します。

kubernetes リポジトリ鍵を登録します。

# curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

kubernetes リポジトリを登録します。

# echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
# apt update

kubeletkubeadmkubectlをインストールします。

# apt install -y kubelet kubeadm kubectl

kubeletkubeadmkubectlapt upgradeで更新されないようにします。

# apt-mark hold kubelet kubeadm kubectl

確認します。

# kubelet --version
Kubernetes v1.23.3
# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.3", GitCommit:"816c97ab8cff8a1c72eccca1026f7820e93e0d25", GitTreeState:"clean", BuildDate:"2022-01-25T21:24:08Z", GoVersion:"go1.17.6", Compiler:"gc", Platform:"linux/amd64"}
# kubectl version
Client Version: version.Info{Major:"1", Minor:"23", GitVersion:"v1.23.3", GitCommit:"816c97ab8cff8a1c72eccca1026f7820e93e0d25", GitTreeState:"clean", BuildDate:"2022-01-25T21:25:17Z", GoVersion:"go1.17.6", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

ヨシ!

The connection to the server localhost:8080 was refused - did you specify the right host or port?

は、サーバー側(kube-apiserver)のバージョンを表示しようとして、サーバー側に接続できていないエラーですが、この段階では、準備できていないだけのため、無視します。


マスターノード構築準備

kubeadm initによって、マスターノードを構築しますが、いきなり行うと、エラーになりますので、その前の準備を行います。


docker のプロキシを設定します。

Ubuntu Kubernetes Docker Proxy設定 図

プロキシサーバーを使わない場合、必要の無い手順ですが、kubeadm initの時に、docker pullが動きます。これのエラー回避になります。

# mkdir -p /etc/systemd/system/docker.service.d
# echo -e "[Service]\nEnvironment=HTTP_PROXY=http://192.168.0.158:3128/ HTTPS_PROXY=http://192.168.0.158:3128/" | tee /etc/systemd/system/docker.service.d/http-proxy.conf

設定を反映して、docker を再起動します。

# systemctl daemon-reload
# systemctl restart docker

docker の cgroup driver を変更します。
kubelet の systemd なのに対し、docker の cgroup driver は、cgroupfs のため、systemd に合わせます。

【 cgroup 】

プロセスグループのリソース(CPU、メモリ、ディスクI/Oなど)の利用を制限・隔離するLinuxカーネルの機能です。

systemdはcgroupと密接に統合されており、プロセスごとにcgroupを割り当てます。

# vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}

設定を反映して、docker を再起動します。

# systemctl daemon-reload
# systemctl restart docker

swap を無効にします。

Warningレベルで、必須ではないようですが、Kubernetesはswapがあることを前提に設計されていなく、セキュリティやパフォーマンスに問題が生じるようです。公式サイトでも必ずoffにしてくださいと書かれています。

# vi /etc/fstab

swap 部分をコメントアウトします。
注意:書かれている内容は、環境によって、異なると思います。

#/swapfile     none     swap    sw    0    0

systemctl の swap 利用を停止します。
まず、swap の UNIT 名を確認します。

# systemctl --type swap
  UNIT          LOAD   ACTIVE SUB    DESCRIPTION
  swapfile.swap loaded active active /swapfile

swapfile.swap を使わないように(mask)します。

# systemctl mask "swapfile.swap"
Created symlink /etc/systemd/system/swapfile.swap → /dev/null.

mask されたことを確認します。

# systemctl --type swap
  UNIT          LOAD   ACTIVE SUB    DESCRIPTION
● swapfile.swap masked active active /swapfile

"masked"になっていることを確認出来たら、reboot します。

# reboot

マスターノード構築

Ubuntu Kubernetes kubeadm init 図

kubeadm initで master というノード名でマスターノードを構築します。

# kubeadm init --node-name master --pod-network-cidr=10.244.0.0/16

--v=5オプションを付けると、詳細が表示されます。

処理中以下のようにコンテナをpullするところがあります。標準では出力されず、止まったように見えるので、付けて実行した方が良いかもしれません。

pulling: k8s.gcr.io/kube-apiserver:v1.23.3

pulling: k8s.gcr.io/kube-controller-manager:v1.23.3

pulling: k8s.gcr.io/kube-scheduler:v1.23.3

pulling: k8s.gcr.io/kube-proxy:v1.23.3

pulling: k8s.gcr.io/pause:3.6

pulling: k8s.gcr.io/etcd:3.5.1-0

pulling: k8s.gcr.io/coredns/coredns:v1.8.6

後で出てきますが、コンテナネットワークのAPIインターフェースFlannelを使用する場合、--pod-network-cidr=10.244.0.0/16が必要です。


構築に成功したら以下のように表示されます。 この時表示される token、sha256:ハッシュ値は重要ですので、メモが必要です。
token、sha256:ハッシュ値は後で作成もできます。詳細:トラブルシュートまとめ - Token 失効

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

  export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.12.200:6443 --token 95w8vq.89t27bukxp8dn6l7 \
        --discovery-token-ca-cert-hash sha256:e86f2ced6b3bd7a75e3b22cc54c4a6b47e2279b17f36192ecdc01904883ecffd

kubectlが設定を読み込めるように環境変数をセットします。

# export KUBECONFIG=/etc/kubernetes/admin.conf

今回rootで操作していますが、ユーザー権限の場合、以下の操作になります。

$ mkdir -p $HOME/.kube

$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

$ sudo chown $(id -u):$(id -g) $HOME/.kube/config


マスターノードが追加されているか確認します。

# kubectl get nodes
NAME     STATUS     ROLES                  AGE    VERSION
master   NotReady   control-plane,master   6m9s   v1.23.3

ヨシ!

マスターノードは、コントロールプレーン(control plane)ノードとも呼びます。今後は、マスター(master)という言葉は無くなっていくようです。


ワーカーノード追加

ワーカーノードを追加します。マスターノードとは別のサーバーで、「Docker インストール」「Kubernetes インストール」「マスターノード構築準備」まで行って、reboot 直後とします。

Ubuntu Kubernetes reboot 直後 図


kubeadm joinでワーカーノードとして、登録します。192.168.12.200は、マスターノードの IP アドレスです。token、sha256:ハッシュ値は、kubeadm init成功時に表示された値です。
デフォルトではホスト名がノード名として登録されるため、--node-name node1でノード名を指定しています。

# kubeadm join 192.168.12.200:6443 --node-name node1 --token 95w8vq.89t27bukxp8dn6l7 \
        --discovery-token-ca-cert-hash sha256:e86f2ced6b3bd7a75e3b22cc54c4a6b47e2279b17f36192ecdc01904883ecffd

Ubuntu Kubernetes kubeadm join 図

kubeadm initと同じく、--v=5オプションを付けると、詳細が表示されます。


# kubectl get nodes
NAME     STATUS     ROLES                  AGE   VERSION
master   NotReady   control-plane,master   46m   v1.23.3
node1    NotReady   <none>                 32s   v1.23.3

ノードの追加に成功しました!


ただ、この時点では、ノード間通信の専用ネットワークが構築されていないため、STATUS が"NotReady"になっています。"Ready"にしていきます。


Flannel インストール

Ubuntu Kubernetes Flannel インストール 図

ノード間通信を可能にし、STATUS を"Ready"にするため、Flannel をインストールします。
マスターノードでのみの作業です。

【 Flannel 】

CNI(Container Network Interface)、つまりコンテナネットワークのAPIインターフェースです。

LinuxのVXLAN機能を用いてL3ネットワーク上に論理的なL2ネットワークを構築するツールです。

スライドですが、こちらの説明がかなり分かりやすいと思いました。

参考:整理しながら理解するKubernetesネットワークの仕組み


Kubernetes 公式サイトに「Flannel を使用する場合は、iptables チェーンへのブリッジ IPv4 トラフィックを有効にすることをお勧めします。」とありますので、確認します。

# sysctl -a | grep net.bridge.bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 1

最初からなっていました。なっていない場合は、有効にします。

# sysctl net.bridge.bridge-nf-call-iptables=1

kubectl applyでインストールします。 なお、https_proxy="http://192.168.0.158:3128"は、プロキシサーバーで、no_proxy="192.168.12.200"部分は、自分自身の IP アドレス(192.168.12.200)です。プロキシサーバーを使わない場合は、必要有りません。
自分自身へのアクセスにプロキシを使い、タイムアウトするため、no_proxy="192.168.12.200"は必要でした。

# https_proxy="http://192.168.0.158:3128" no_proxy="192.168.12.200" kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

成功です。


# kubectl get nodes
NAME     STATUS   ROLES                  AGE     VERSION
master   Ready    control-plane,master   6h33m   v1.23.3
node1    Ready    <none>                 5h29m   v1.23.3

"Ready"になっています!ヨシ!


Pod 追加

Ubuntu Kubernetes Pod追加 図

ここまでで、Pod は一つもありません。Deployment で nginx の Pod を追加します。

# kubectl get pods
No resources found in default namespace.

Deployment の yaml を作成します。

# vi nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:1.21.6-alpine
          ports:
            - containerPort: 80

Docker Hub にある、Nginx 公式のイメージ nginx:1.21.6-alpine をインストールします。
レプリカ数(Pod 数)を 3 にします。
(今回、ブラウザからのアクセスが確認できるようなアプリをお試しで入れるだけなので、このイメージにした理由は特に有りません。)

# kubectl apply -f nginx-deployment.yaml
deployment.apps/nginx-deployment created

これにより、nginx:1.21.6-alpinedocker pullされて、デプロイされます。(プロキシ利用の場合、Docker のプロキシ設定は必要です。)

# kubectl get pods
NAME                                READY   STATUS              RESTARTS   AGE
nginx-deployment-5b7d486f5c-c8hzk   0/1     ContainerCreating   0          14s
nginx-deployment-5b7d486f5c-nms6k   0/1     ContainerCreating   0          14s
nginx-deployment-5b7d486f5c-q9mw8   0/1     ContainerCreating   0          14s

一瞬で、「created」になりますが、しばらくは、構築中ステータスになります。


# kubectl get pods -o wide
NAME                                READY   STATUS    RESTARTS   AGE   IP           NODE    NOMINATED NODE   READINESS GATES
nginx-deployment-5b7d486f5c-c8hzk   1/1     Running   0          92s   10.244.1.4   node1   <none>           <none>
nginx-deployment-5b7d486f5c-nms6k   1/1     Running   0          92s   10.244.1.3   node1   <none>           <none>
nginx-deployment-5b7d486f5c-q9mw8   1/1     Running   0          92s   10.244.1.5   node1   <none>           <none>

構築成功です。
-o wideでどこのノードにデプロイされたか確認できますが、ワーカーノードのnode1にデプロイされています。

デフォルトでは、セキュリティ上の理由により、クラスターはコントロールプレーンノード(マスターノード)にPodをスケジューリング(割り当て)しません。Taintを変更する必要がありますが、今回は、それで良いものとします。


Service 追加

ここまでで、nginx は Kubernetes の世界に閉じ込められた状態で、外からアクセスできません。

Ubuntu Kubernetes 外からアクセス不可 図

Service の NodePort を追加し、外からアクセスできるようにします。

Ubuntu Kubernetes Service 追加 外からアクセス可能 図

Service の yaml を作成します。

# vi nginx-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  ports:
    - protocol: 'TCP'
      port: 8080
      targetPort: 80
      nodePort: 30080
  selector:
    app: nginx

Service の yaml を apply します。

# kubectl apply -f nginx-service.yaml
# kubectl get services -o wide
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE   SELECTOR
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP          19h   <none>
nginx        NodePort    10.103.127.182   <none>        8080:30080/TCP   7s    app=nginx

nginx という名の NodePort タイプの Service が追加されました。


マスターノードの IP アドレス:192.168.12.200
ワーカーノードの IP アドレス:192.168.12.201
ですので、
ブラウザで、 http://192.168.12.200:30080/ にアクセスしてみます。

Ubuntu Kubernetes ブラウザでアクセス

ヨシ!

ワーカーノードのIPアドレス(http://192.168.12.201:30080/)でも行けます。


この後、Ingress を使って、ホスト名でアクセスできるようになりますが、ここまでとします。

LoadBalancerタイプのServiceでもhttp://[ホスト名]/でアクセスできますが、今回の手順では、LoadBalancerが実装されていない構成のため、NodePortタイプとしました。(AWS、Google Cloudではできます。)


トラブルシュートまとめ

kubeadm init

----- 現象 -----

# kubeadm init --node-name master --pod-network-cidr=10.244.0.0/16
W0125 23:40:54.844826    1779 version.go:103] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get "https://dl.k8s.io/release/stable-1.txt": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
W0125 23:40:54.844885    1779 version.go:104] falling back to the local client version: v1.23.3
[init] Using Kubernetes version: v1.23.3
[preflight] Running pre-flight checks
        [WARNING Swap]: swap is enabled; production deployments should disable swap unless testing the NodeSwap feature gate of the kubelet
        [WARNING Hostname]: hostname "master" could not be reached
        [WARNING Hostname]: hostname "master": lookup master on 127.0.0.53:53: server misbehaving
[preflight] Pulling images required for setting up a Kubernetes cluster
[preflight] This might take a minute or two, depending on the speed of your internet connection
[preflight] You can also perform this action in beforehand using 'kubeadm config images pull'

ここで停止。

# kubeadm config images pull
W0126 00:35:41.005320    1993 version.go:103] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get "https://dl.k8s.io/release/stable-1.txt": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
W0126 00:35:41.005376    1993 version.go:104] falling back to the local client version: v1.23.3
failed to pull image "k8s.gcr.io/kube-apiserver:v1.23.3": output: Error response from daemon: Get "https://k8s.gcr.io/v2/": dial tcp: lookup k8s.gcr.io: Temporary failure in name resolution
, error: exit status 1

----- 原因 -----
docker pull ができていない。(インターネットに繋がっていない。)


----- 対処 -----
Proxy 環境下で docker pull できるようにする。

# mkdir -p /etc/systemd/system/docker.service.d
# echo -e "[Service]\nEnvironment=HTTP_PROXY=http://192.168.0.158:3128/ HTTPS_PROXY=http://192.168.0.158:3128/" | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment=HTTP_PROXY=http://192.168.0.158:3128/ HTTPS_PROXY=http://192.168.0.158:3128/
# systemctl daemon-reload
# systemctl restart docker

cgroup を切り替えていない

----- 現象 -----

kubelet 起動エラー。

# journalctl -xeu kubelet
Jan 27 17:20:49 ubuntu kubelet[342857]: E0127 17:20:49.359548  342857 server.go:302] "Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is>
Jan 27 17:20:49 ubuntu systemd[1]: kubelet.service: Main process exited, code=exited, status=1/FAILURE

----- 原因 -----
docker の cgroup を切り替えていない。(kubelet の systemd なのに対し、docker の cgroup driver は、cgroupfs)


----- 対処 -----

# vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
# systemctl daemon-reload
# systemctl restart docker

Port 6443 is in use

----- 現象 -----

# kubeadm init --node-name master --pod-network-cidr=10.244.0.0/16
W0126 01:29:08.438000    6843 version.go:103] could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt": Get "https://dl.k8s.io/release/stable-1.txt": context deadline exceeded (Client.Timeout exceeded while awaiting headers)
W0126 01:29:08.438145    6843 version.go:104] falling back to the local client version: v1.23.3
[init] Using Kubernetes version: v1.23.3
[preflight] Running pre-flight checks
        [WARNING Hostname]: hostname "master" could not be reached
        [WARNING Hostname]: hostname "master": lookup master on 127.0.0.53:53: server misbehaving
error execution phase preflight: [preflight] Some fatal errors occurred:
        [ERROR Port-6443]: Port 6443 is in use
        [ERROR Port-10259]: Port 10259 is in use

----- 原因 -----
既にkubeadm initが実行されている。


----- 対処 -----

# kubeadm reset
# kubeadm init --node-name master --pod-network-cidr=10.244.0.0/16

kubectl

----- 現象 -----

# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
The connection to the server localhost:8080 was refused - did you specify the right host or port?

----- 原因 -----
設定が読み込まれていない。


----- 対処 -----
root の場合:

# export KUBECONFIG=/etc/kubernetes/admin.conf

ユーザー権限の場合:

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config

flannel

----- 現象 -----
Proxy 環境でエラー。

# https_proxy="http://192.168.0.158:3128" kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Unable to connect to the server: Forbidden

----- 原因 -----

no_proxy に自 IP アドレスが必要。


----- 対処 -----

# https_proxy="http://192.168.0.158:3128" no_proxy="192.168.12.200" kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Warning: policy/v1beta1 PodSecurityPolicy is deprecated in v1.21+, unavailable in v1.25+
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created

Token 失効

----- 現象 -----

# kubeadm join 192.168.12.200:6443 --token 7bquah.q7ofwnr0obpeg44p \
>         --discovery-token-ca-cert-hash sha256:1c6e75a5f9743a6f766efb5d5dba1b82541c7a1614f3d93214f3b4b777756ba7
[preflight] Running pre-flight checks
error execution phase preflight: couldn't validate the identity of the API Server: could not find a JWS signature in the cluster-info ConfigMap for token ID "7bquah"
To see the stack trace of this error execute with --v=5 or higher

----- 原因 -----

トークンが失効している。(kubeadm init後 24 時間で失効する。)

(マスターノード側作業)

# kubeadm token list

→ 何も表示されない。


----- 対処 -----

(マスターノード側作業)

# kubeadm token create --print-join-command
kubeadm join 192.168.12.200:6443 --token 558az8.uh111y2v4eme4dcj --discovery-token-ca-cert-hash sha256:1c6e75a5f9743a6f766efb5d5dba1b82541c7a1614f3d93214f3b4b777756ba7

→ ハッシュは変らない。


(ワーカーノード側作業)

# kubeadm join 192.168.12.200:6443 --token 558az8.uh111y2v4eme4dcj --discovery-token-ca-cert-hash sha256:1c6e75a5f9743a6f766efb5d5dba1b82541c7a1614f3d93214f3b4b777756ba7

InvalidImageName

----- 現象 -----

# kubectl get pods -o wide
NAME                                READY   STATUS             RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
nginx-deployment-84d98d877f-cs6dr   0/1     InvalidImageName   0          2m45s   10.244.1.3   node1    <none>           <none>
nginx-deployment-84d98d877f-m2pgj   0/1     InvalidImageName   0          2m45s   10.244.1.4   node1    <none>           <none>
nginx-deployment-84d98d877f-qxpvc   0/1     InvalidImageName   0          2m45s   10.244.1.2   node1    <none>           <none>

----- 原因 -----
nginx-deployment.yaml の image が間違っている。

例:image: nginx:1.21.6:alpine(正しいのは、image: nginx:1.21.6-alpine


----- 対処 -----

# kubectl delete deployment nginx-deployment

nginx-deployment.yaml 修正

# kubectl apply -f nginx-deployment.yaml

EXTERNAL-IP が pending

----- 現象 -----

EXTERNAL-IP が<pending>のままになる。

# kubectl get services
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          6h57m
nginx        LoadBalancer   10.107.14.190   <pending>     8080:32446/TCP   18s

----- 原因 -----

Service タイプ LoadBalancer に対応していない環境。


----- 対処 -----

# kubectl delete services nginx

Ingress 導入など。

loading...