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分だし..

ClaudeをOpenAI O1のように思考させるDifyサンプルを試す

 Difyの「探索」タブにはさまざまなサンプルが載っており、その1つに「Thinking Claude (OpenAI O1 Alternative)」というものがある。   このサンプルがどういうものか、未だに自分でも解けない以下の問題をためしに聞いてみることにした。 『人類の...