- 記事一覧 >
- ブログ記事
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 上にインストールしたものです。
完成図は、以下です。
目次
Docker インストール
Kubernetes インストール
マスターノード構築準備
マスターノード構築
ワーカーノード追加
Flannel インストール
Pod 追加
Service 追加
トラブルシュートまとめ
なお、今回、インターネットに直接繋がる環境ではなく、Proxy サーバーを通して、インターネットに繋がります。Proxy 越しネット環境の手順になります。
今回の手順中、HTTP プロキシ:http://192.168.0.158:3128/
、HTTPS プロキシ:http://192.168.0.158:3128/
とします。
【マスターノード環境】
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 インストール
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 インストール
Kubernetes をインストールします。「Kubernetes をインストール」と言っても、実際のところ、kubelet
とkubeadm
とkubectl
をインストールになります。
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
kubelet
とkubeadm
とkubectl
をインストールします。
# apt install -y kubelet kubeadm kubectl
kubelet
とkubeadm
とkubectl
がapt 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 のプロキシを設定します。
プロキシサーバーを使わない場合、必要の無い手順ですが、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
マスターノード構築
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 直後とします。
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
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 インストール
ノード間通信を可能にし、STATUS を"Ready"にするため、Flannel をインストールします。
マスターノードでのみの作業です。
【 Flannel 】
CNI(Container Network Interface)、つまりコンテナネットワークのAPIインターフェースです。
LinuxのVXLAN機能を用いてL3ネットワーク上に論理的なL2ネットワークを構築するツールです。
スライドですが、こちらの説明がかなり分かりやすいと思いました。
↓
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 追加
ここまでで、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-alpine
がdocker 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 の世界に閉じ込められた状態で、外からアクセスできません。
Service の NodePort を追加し、外からアクセスできるようにします。
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/
にアクセスしてみます。
ヨシ!
ワーカーノードの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 導入など。
その他、宣伝、誹謗中傷等、当方が不適切と判断した書き込みは、理由の如何を問わず、投稿者に断りなく削除します。
書き込み内容について、一切の責任を負いません。
このコメント機能は、予告無く廃止する可能性があります。ご了承ください。
コメントの削除をご依頼の場合はTwitterのDM等でご連絡ください。