1. ホーム
  2. Junit

Kubeadmのデプロイメント Kubernetes 1.13で発生した問題の解決記録

2022-02-14 11:19:58
<パス <ブロッククオート

kubeadmはKubernetesクラスタのセットアップを支援します。ここでは、そのデプロイメントを使用する際の問題点と解決策を文書化します。

目次

1. Google ネットワークに到達できない

https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64/repodata/repomd.xml: [Errno 14] curl#7 - "Failed to connect to 2404: 6800:4005:809::200e: Network unreachable"


古典的な問題、自分の梯子を持参する必要があります。
CentOSでyumのプロキシを設定する

vi /etc/yum.conf
# Add the following.
proxy=http://xxx.xx.x.xx:xxx # Proxy address


Aliyuanのハシゴはありません

cat > /etc/yum.repos.d/kubernetes.repo <<EOF 
[kubernetes] 
name=Kubernetes 
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 
enabled=1 
gpgcheck=0 
repo_gpgcheck=0 
EOF


2. 公式ドキュメントを参照する

インストールリファレンス ドキュメント

Installed:
  kubeadm.x86_64 0:1.13.0-0 kubectl.x86_64 0:1.13.0-0 kubelet.x86_64 0:1.13.0-0
is installed as a dependency:
  cri-tools.x86_64 0:1.12.0-0 kubernetes-cni.x86_64 0:0.6.0-0 socat.x86_64 0:1.7.3.2-2.el7
Done!

F1213 10:20:53.304755 2266 server.go:261] failed to run Kubelet: Running with swap on is not supported, please disable swap! or set --fail-swap-on flag /proc/swaps contained:


3. クローズスワップ

swapoff -a
 [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1      
 [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=... `



実行

echo "1" >/proc/sys/net/ipv4/ip_forward
echo "1" >/proc/sys/net/bridge/bridge-nf-call-iptables

4. マスターエラーの設定

# kubeadm config images list --kubernetes-version v1.13.0 # Look at the image names under that version
# Pull the mirror
docker pull mirrorgooglecontainers/kube-apiserver:v1.13.0
docker pull mirrorgooglecontainers/kube-controller-manager:v1.13.0
docker pull mirrorgooglecontainers/kube-scheduler:v1.13.0
docker pull mirrorgooglecontainers/kube-proxy:v1.13.0
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd:3.2.24
docker pull coredns/coredns:1.2.6

# Rename the image tag
docker tag docker.io/mirrorgooglecontainers/kube-proxy:v1.13.0 k8s.gcr.io/kube-proxy:v1.13.0
docker tag docker.io/mirrorgooglecontainers/kube-scheduler:v1.13.0 k8s.gcr.io/kube-scheduler:v1.13.0
docker tag docker.io/mirrorgooglecontainers/kube-apiserver:v1.13.0 k8s.gcr.io/kube-apiserver:v1.13.0
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager:v1.13.0 k8s.gcr.io/kube-controller-manager:v1.13.0
docker tag docker.io/mirrorgooglecontainers/etcd:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag docker.io/mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag docker.io/coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6

# Delete the old image
docker rmi docker.io/mirrorgooglecontainers/kube-proxy:v1.13.0 
docker rmi docker.io/mirrorgooglecontainers/kube-scheduler:v1.13.0 
docker rmi docker.io/mirrorgooglecontainers/kube-apiserver:v1.13.0 
docker rmi docker.io/mirrorgooglecontainers/kube-controller-manager:v1.13.0 
docker rmi docker.io/mirrorgooglecontainers/etcd:3.2.24  
docker rmi docker.io/mirrorgooglecontainers/pause:3.1 
docker rmi docker.io/coredns/coredns:1.2.6  


プロンプトに従って 1 に設定

Your Kubernetes master 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

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/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.232.204:6443 --token m2hxkd.scxjrxgew6pyhvmb --discovery-token-ca-cert-hash sha256: 8b94cefbe54ae4b3d7201012db30966c53870aad55be80a2888ec

5.Kubeadmのinitインストールイメージが固まる

またもや万里の長城、これは解決するのが面倒です、プロキシを直接設定する場所がないので、以下のスクリプトでミラーを引っ張ってきています。
他に方法がないときは、その問題を解決するソリューションがベストソリューションなのです

# This is the configuration of my virtual machine /etc/hosts
192.168.232.204 k8a204
192.168.232.203 k8a203
192.168.232.202 k8a202


おっとっと、やっと見れた

NAME STATUS ROLES AGE VERSION
k8a204 Ready master 6m6s v1.13.0
[root@localhost .kube]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8a203 NotReady <none> 4s v1.13.0
k8a204 Ready master 6m19s v1.13.0


6. ネットワーク構成

  1. 各ホストのホスト名とIPを含むように、各ホストの⼟を設定します。
kubectl get pods --all-namespaces
=============== Here is the result ===============
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-86c58d9df4-2vdvx 1/1 Running 0 7m32s
kube-system coredns-86c58d9df4-88fjk 1/1 Running 0 7m32s
kube-system etcd-k8a204 1/1 Running 0 6m39s
kube-system kube-apiserver-k8a204 1/1 Running 0 6m30s
kube-system kube-controller-manager-k8a204 1/1 Running 0 6m30s
kube-system kube-proxy-tl7g5 1/1 Running 0 7m32s
kube-system kube-proxy-w2jgl 0/1 ContainerCreating 0 95s
kube-system kube-scheduler-k8a204 1/1 Running 0 6m49s


  1. 選択したネットワークをマニュアル通りにインストールし、dnsのインストールがOKになるのを待ち、ノードを追加します。
docker save -o /opt/kube-pause.tar k8s.gcr.io/pause:3.1
docker save -o /opt/kube-proxy.tar k8s.gcr.io/kube-proxy:v1.13.0
docker save -o /opt/kube-flannel1.tar quay.io/coreos/flannel:v0.9.1
docker save -o /opt/kube-flannel2.tar quay.io/coreos/flannel:v0.10.0-amd64
docker save -o /opt/kube-calico1.tar quay.io/calico/cni:v3.3.2
docker save -o /opt/kube-calico2.tar quay.io/calico/node:v3.3.2


なお、設定には時間がかかるので、気長に待ちましょう

 scp /opt/*.tar [email protected]:/opt/


7. ノード結合後のNotReady

前問からの続きです。
ContainerCreating **statesの間、お待ちください。 しかし、10分経っても応答がない場合は、何らかのエラーが発生しているものと思われます。
主な問題点:ノードのミラーがプルダウンされない。
以下の方法で。

  1. マスターホスト内に画像をファイルとして保存します。
docker load -i /opt/kube-flannel1.tar
docker load -i /opt/kube-flannel2.tar
docker load -i /opt/kube-proxy.tar
docker load -i /opt/kube-pause.tar
docker load -i /opt/kube-calico1.tar
docker load -i /opt/kube-calico2.tar


  1. ファイルをノードコンピュータにコピーする
docker images
============================================== Here is the result ======================================
REPOSITORY TAG IMAGE ID CREATED SIZE
k8s.gcr.io/kube-proxy v1.13.0 8fa56d18961f 9 days ago 80.2 MB
quay.io/calico/node v3.3.2 4e9be81e3a59 9 days ago 75.3 MB
quay.io/calico/cni v3.3.2 490d921fa49c 9 days ago 75.4 MB
quay.io/coreos/flannel v0.10.0-amd64 f0fad859c909 10 months ago 44.6 MB
k8s.gcr.io/pause 3.1 da86e6ba6ca1 11 months ago 742 kB
quay.io/coreos/flannel v0.9.1 2b736d06ca4c 13 months ago 51.3 MB


  1. ノード上でdocker importを実行します。
[root@localhost .kube]# kubectl get pods --all-namespaces
==================================== Here is the result ========================================
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-node-4dsg5 1/2 Running 0 42m
kube-system calico-node-5dtk2 1/2 Running 0 41m
kube-system calico-node-78qvp 1/2 Running 0 41m
kube-system coredns-86c58d9df4-26vr7 1/1 Running 0 43m
kube-system coredns-86c58d9df4-s5ljf 1/1 Running 0 43m
kube-system etcd-k8a204 1/1 Running 0 42m
kube-system kube-apiserver-k8a204 1/1 Running 0 42m
kube-system kube-controller-manager-k8a204 1/1 Running 0 42m
kube-system kube-proxy-8c7hs 1/1 Running 0 41m
kube-system kube-proxy-dls8l 1/1 Running 0 41m
kube-system kube-proxy-t65tc 1/1 Running 0 43m
kube-system kube-scheduler-k8a204 1/1 Running 0 42m


swapoff -a
# Start all containers
# A more concise command: docker start $(docker ps -aq)  
docker start $(docker ps -a | awk '{ print $1}' | tail -n +2)
systemctl start kubelet
# Check for startup errors
journalctl -xefu kubelet
# docker boot self-restart
docker run --restart=always


  1. ノードイメージファイルの確認
kubectl exec -ti busybox -- nslookup kubernetes.default
============================= Here is the result ============================
Server: 10.96.0.10
Address: 10.96.0.10:53
** server can't find kubernetes.default: NXDOMAIN
*** Can't find kubernetes.default: No answer


OK、完了です。すべてのサービスが稼働しています。

 kubeadm token list
============================= Here is the result ============================
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
85iiq4.3y8s1ri8erb7ah6b <invalid> 2018-12-22T16:40:49+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token


8. リカバリーマスターを再起動する

# Generate a new token
kubeadm token create
# Generate a new token hash code
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^. * //'
# Join the node with the new token and hash code
# master address, token, hash please change it yourself
kubeadm join 192.168.232.204:6443 --token m87q91.gbcqhfx9ansvaf3o --discovery-token-ca-cert-hash sha256: fdd34ef6c801e382f3fb5b87bc9912a120bf82029893db121b9c8eae29e91c62


9. kubernetes.default の DNS 解決に失敗する。

dns検出のためにbusyboxをインストールすると、以下のエラーが出続けます。

kubectl exec -ti busybox -- nslookup kubernetes.default
============================= Here is the result ============================
Server: 10.96.0.10
Address: 10.96.0.10:53
** server can't find kubernetes.default: NXDOMAIN
*** Can't find kubernetes.default: No answer


確認したところ、新バージョンのbusyboxはdns parsingに変更またはバグがあり、旧バージョンのbusybox images <= 1.28.4を使ってテストするとOKだったそうです。

10.トークン期限切れ後の再生成

 kubeadm token list
============================= Here is the result ============================
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
85iiq4.3y8s1ri8erb7ah6b <invalid> 2018-12-22T16:40:49+08:00 authentication,signing The default bootstrap token generated by 'kubeadm init'.   system:bootstrappers:kubeadm:default-node-token


次のコマンドで新しいトークンを生成します。

# Generate a new token
kubeadm token create
# Generate a new token hash code
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^. * //'
# Join the node with the new token and hash code
# master address, token, hash please change it yourself
kubeadm join 192.168.232.204:6443 --token m87q91.gbcqhfx9ansvaf3o --discovery-token-ca-cert-hash sha256: fdd34ef6c801e382f3fb5b87bc9912a120bf82029893db121b9c8eae29e91c62