Translate

2023年1月26日木曜日

Play with Kubernetes 上でPodをcreateしてもPendingのままになる

 Kubernetes を勉強するとき、Docker DesktopをローカルPCにいれたり、Minikubeをインストールしたりするが、会社のルールでローカルPCにDockerや仮想マシンをインストール出来ない場合がある。

そういったときにPlay with Kubernetes https://labs.play-with-k8s.com/ を使う(
ログインするにはGitHubもしくはDockerHubのアカウントを作成しておく必要がある)。

Loginした状態になると、記事執筆時点(2023/1/26)では4時間だけ使用可能な環境が与えられる。

ADD NEW INSTANCE を押すと以下のメッセージが表示されたコンソール画面が表示される。


                          WARNING!!!!

 This is a sandbox environment. Using personal credentials
 is HIGHLY! discouraged. Any consequences of doing so, are
 completely the user's responsibilites.

 You can bootstrap a cluster as follows:

 1. Initializes cluster master node:

 kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16
    

 2. Initialize cluster networking:

kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml


 3. (Optional) Create an nginx deployment:

 kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx-app.yaml


                          The PWK team.


(日本語訳)
                         警告!!!!

 これはサンドボックス環境です。個人の認証情報を使用することは非常にお勧めできません。そうすることで生じるいかなる結果も、完全にユーザの責任となります。

 以下の手順でクラスタをブートストラップできます。

 1. クラスタマスタノードを初期化します。

 kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16
    

 2. クラスタネットワーキングを初期化します。

kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml


 3.オプション)nginxのDeploymentを作成します。

 kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx-app.yaml


                          PWKチーム

 

 

3はオプションになっているけど、nginxが動作した状態になるので、きちんとKubernetes環境がPlay with Kubernetes上に作れているかを確認する場合は3も実行する。


だがノードを1つ作成し、そのまま手順に従って1から3の順にコマンドをコピペ実行して kubectl get pod してみるが、3で作成されたはずのnginxがPendingのままになる..


これはmasterノードだけしか作成されていないためで、別途workerノードを1つ以上つくっておかないといけない。

なのでログインしたら、

  • ADD NEW INSTANCE を押し、node1を作成
  • ADD NEW INSTANCE を押し、node2を作成
  • node1のコンソール画面で1を実行(ex. kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16)

 

:
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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.0.X:6443 --token XXXX...XXX \
    --discovery-token-ca-cert-hash sha256:XXXX...XXX
Waiting for api server to startup
Warning: resource daemonsets/kube-proxy is missing the kubectl.kubernetes.io/last-applied-configuration annotation which is required by kubectl apply. kubectl apply should only be used on resources created declaratively by either kubectl create --save-config or kubectl apply. The missing annotation will be patched automatically.
daemonset.apps/kube-proxy configured
No resources found
[node1 ~]$
 

(日本語訳)

:

Kubernetesのコントロールプレーンが正常に初期化されました!

クラスタの利用を開始するには、一般ユーザで以下を実行する必要があります。

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

また、rootユーザの場合は、以下のように実行します。

  export KUBECONFIG=/etc/kubernetes/admin.conf を実行します。

これで、クラスタにポッドネットワークがデプロイされました。
kubectl apply -f [podnetwork].yaml "を、以下に記載されているいずれかのオプションで実行します。
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

次に、ワーカーノード上でrootとして以下を実行することで、任意の数のワーカーノードに参加することができます。

kubeadm join 192.168.0.X:6443 --token XXXX....XXXX \
    --discovery-token-ca-cert-hash sha256:XXXX...XXX


apiサーバーの起動を待っています
警告: リソース daemonsets/kube-proxy には、kubectl apply で必要とされる kubectl.kubernetes.io/last-applied-configuration アノテーションがありません。kubectl apply は kubectl create --save-config または kubectl apply によって declaratively に作成したリソースに対してのみ使用されるべきものです。不足するアノテーションは自動的にパッチが適用されます。
daemonset.apps/kube-proxyが設定されています。
リソースが見つかりません


 

  • 実行メッセージ内の以下の箇所をコピー


kubeadm join 192.168.0.X:6443 --token XXXXXXX...XXX \
    --discovery-token-ca-cert-hash sha256:XXXXXX....XXXX


  • node2 のコンソール画面に移動し、コピーしたkubeadmコマンドを実行

 [node2 ~]$ kubeadm join 192.168.0.X:6443 --token XXX...XXX  --discovery-token-ca-cert-hash sha256:XXXXXX....XXXXX
Initializing machine ID from random generator.
[preflight] Running pre-flight checks
        [WARNING Service-Docker]: docker service is not active, please run 'systemctl start docker.service'
        [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
        [WARNING FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables does not exist
[preflight] The system verification failed. Printing the output from the verification:
KERNEL_VERSION: 4.4.0-210-generic
DOCKER_VERSION: 20.10.1
OS: Linux
CGROUPS_CPU: enabled
CGROUPS_CPUACCT: enabled
CGROUPS_CPUSET: enabled
CGROUPS_DEVICES: enabled
CGROUPS_FREEZER: enabled
CGROUPS_MEMORY: enabled
CGROUPS_PIDS: enabled
CGROUPS_HUGETLB: enabled
        [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 20.10.1. Latest validated version: 19.03
        [WARNING SystemVerification]: failed to parse kernel config: unable to load kernel module: "configs", output: "", err: exit status 1
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

(日本語訳)
このノードはクラスタに参加しました。
* 証明書署名要求が apiserver に送信され、応答が受信されました。
* Kubeletに新しいセキュアな接続の詳細が通知されました。

control-plane の 'kubectl get nodes' を実行して、このノードがクラスタに参加したことを確認します。

  • node1 にもどり kubectl get nodes でmaster以外のノードnode2が追加されていることを確認

このあとnode1で2と3を実行し kubectl get pod すれば Pending ではなく Ready になる。

[node1 ~]$ kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
configmap/kube-router-cfg created
daemonset.apps/kube-router created
serviceaccount/kube-router created
clusterrole.rbac.authorization.k8s.io/kube-router created
clusterrolebinding.rbac.authorization.k8s.io/kube-router created
[node1 ~]$ kubectl get nodes
NAME    STATUS     ROLES                  AGE    VERSION
node1   NotReady   control-plane,master   12m    v1.20.1
node2   NotReady   <none>                 5m1s   v1.20.1
[node1 ~]$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx-app.yaml
service/my-nginx-svc created
deployment.apps/my-nginx created
[node1 ~]$ kubectl get nodes
NAME    STATUS   ROLES                  AGE     VERSION
node1   Ready    control-plane,master   12m     v1.20.1
node2   Ready    <none>                 5m28s   v1.20.1
[node1 ~]$ kubectl get pod
NAME                        READY   STATUS    RESTARTS   AGE
my-nginx-66b6c48dd5-kwx58   1/1     Running   0          34m
my-nginx-66b6c48dd5-qw9zf   1/1     Running   0          34m
my-nginx-66b6c48dd5-r7n5p   1/1     Running   0          34m
Play with Kubernetes環境は、使用中もとても遅くなることがあり、Pendingになっている時間が結構かかる場合もある。なのでゆっくりめのトイレタイムをあけて再度kubectl get podすると動いている場合がある。自分はだめな場合と判断しているのは、2トイレタイムくらい間を空けてだめなときだ。
 
Play with Kubernetes 環境はおそすぎてADD NEW INSTANCEしても無視することがある。そういった場合はセッションをCLOSEしてしばらく待ってから再度Loginしてみる。
30分後くらいには普通の動作に戻ることもあるし、1日だめなばあいもある。

 

いらいらいすることもあるけど、無料で使わせていただいている身なので、ありがたく使わせていただいている。 


ps

Speaker Deckに「Play with Kubernetesはじめにやること」というスライドを投稿しました。初心者でもできるように一挙手一投足をスライドにしています。ご笑覧ください。

 

ps2

..にしてもよく落ちる..

Killacodaのk8s playgroundにしようかな.. 

でも、こっちはexposeしたサービスを外部からみれないし、60分だし..

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...