hirano00o's blog

技術的な記録、日常の記録

証明書 expired: kubectlコマンドがエラーを返す

つい先日kubectlコマンドがエラーを返した。エラーを見てみると証明書の期限が切れていることがわかった。

$ k get po
E0720 18:48:58.168234 1768112 memcache.go:265] couldn't get current server API group list: Get "https://127.0.0.1:6443/api?timeout=32s": tls: failed to verify certificate: x509: certificate has expired or is not yet valid: current time 2025-07-20T18:48:58+09:00 is after 2025-07-19T15:08:00Z
...

前回証明書を作成したのがちょうど1年前くらい(確か一度作り直したので1ヶ月ずれている)。前回の手順を参考に、証明書関連に絞って実施する。 hirano00o.hateblo.jp

手順

まずは証明書自体を作成する。前回作成分は念の為リネームして残しておく。

# 前回の作業ディレクトリに移動後
mv cert cert.`date +%Y%m%d`
./generate-cert.sh
# Hostname of Node1: rs01
# Hostname of Node2: rs02
# Hostname of Node3: rs03
# Addresses of Node1 (x.x.x.x[,x.x.x.x]): 192.168.0.201
# Addresses of Node2 (x.x.x.x[,x.x.x.x]): 192.168.0.202
# Addresses of Node3 (x.x.x.x[,x.x.x.x]): 192.168.0.203
# Address of Kubernetes ClusterIP (first address of ClusterIP subnet): 10.10.0.1
# City or Locality (L) of distinguished name: Chiba
# State or Province (ST) of distinguished name: Chiba
# Generate cert? [y/N]: y
# ...

cd cert/
ls -l
ls | wc -l
# 41
# 証明書を各ノードに送る
scp ca.pem rs01.pem rs01-key.pem rs01:~/
scp ca.pem rs02.pem rs02-key.pem rs02:~/
scp ca.pem rs03.pem rs03-key.pem rs03:~/

次にKubeconfigを作成する。こちらも前回分はリネームして残す。

cd ../
mv kubeconfig kubeconfig.`date +%Y%m%d`
./generate-kubeconfig.sh
# Hostname of Node1: rs01
# Hostname of Node2: rs02
# Hostname of Node3: rs03
# Address of Master Node: 192.168.0.201
# Cluster Name: hirano00o-k8s
# Generate Kubeconfig? [y/N]: y
# ...
cd kubeconfig/
ls
ls | wc -l
# 7
# configを各ノードに送る
scp rs01.kubeconfig kube-proxy.kubeconfig rs01:~/
scp rs02.kubeconfig kube-proxy.kubeconfig rs02:~/
scp rs03.kubeconfig kube-proxy.kubeconfig rs03:~/

etcdの証明書を更新し、再起動する。

cd ../
sudo cp cert/ca.pem cert/kubernetes-key.pem cert/kubernetes.pem /etc/etcd/
ls -l /etc/etcd/
sudo systemctl restart etcd
sudo ETCDCTL_API=3 etcdctl member list \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/etcd/ca.pem \
  --cert=/etc/etcd/kubernetes.pem \
  --key=/etc/etcd/kubernetes-key.pem
# とりあえずactiveになっていればOK
sudo systemctl status etcd

kube-apiserverの証明書を更新し、再起動する。

sudo cp -a cert/ca.pem cert/ca-key.pem \
cert/kubernetes-key.pem cert/kubernetes.pem \
cert/service-account-key.pem cert/service-account.pem \
/var/lib/kubernetes/
sudo systemctl restart kube-apiserver
# とりあえずactiveになっていればOK
sudo systemctl status kube-apiserver

次にkube-controller-managerのconfigを更新し、再起動する。

sudo cp -a kubeconfig/kube-controller-manager.kubeconfig /var/lib/kubernetes/
sudo systemctl restart kube-controller-manager
# とりあえずactiveになっていればOK
sudo systemctl status kube-controller-manager

kube-schedulerのconfigを更新し、再起動する

sudo cp -a kubeconfig/kube-scheduler.kubeconfig /var/lib/kubernetes/
sudo systemctl restart kube-scheduler
# とりあえずactiveになっていればOK
sudo systemctl status kube-scheduler

kubeletの更新をする。ここは各ノードで同じ作業をする。

sudo cp -a ~/${HOSTNAME}-key.pem ~/${HOSTNAME}.pem /var/lib/kubelet/
sudo cp -a ~/${HOSTNAME}.kubeconfig /var/lib/kubelet/kubeconfig
sudo cp -a ~/ca.pem /var/lib/kubernetes/ # Masterは配置済みなのでスキップ
sudo systemctl restart kubelet
# とりあえずactiveになっていればOK
sudo systemctl status kubelet

最後にconfigをコピーして完了。

cp kubeconfig/admin.kubeconfig $HOME/.kube/config

kubectl get po
NAME                           READY   STATUS      RESTARTS       AGE
cloudflared-7b47c5979f-472m5   1/1     Running     48 (55d ago)   330d
cloudflared-7b47c5979f-7hmlc   1/1     Running     32 (55d ago)   330d

終わりに

ほとんどの箇所で証明書が絡んでおり、結構手間がかかった(ちなみにkube-proxyはCiliumに入れ替えていたので実施していない)。

hirano00o.hateblo.jp

kubeadmを利用していればもう少し簡易に入れ替えができただろうが、今から変更する気力はないので当分はこのまま手動更新でいこうと思う。もしくはclaudeにスクリプト書いてもらうのもありか。

AndroidのLinuxターミナルで始めるVibeCoding

PixelシリーズではOS標準のLinuxターミナルが利用できます。Pixel以外でもPlayストアにはターミナルアプリがあるので同様のことができます。

本記事ではPixelのLinuxターミナルでGemini cliを使ってVibeCodingできる環境を整えるところまでを紹介します。

Linuxターミナルの準備

LinuxターミナルはAndroidの開発者向けオプションで有効にできます。有効にするとアプリ一覧に出てくるので起動します。

必要なパッケージをインストールしていきます。Nodeが必要なので最新版のLTSをインストールします。またその他必要な設定等を行います。

# パッケージの更新
sudo apt update && sudo apt upgrade -y

# 日本語表示
sudo apt install task-japanese -y
sudo dpkg-reconfigure locales
# ja_JP.UTF-8にチェックを入れて設定する
# ターミナルを終了して再起動
localectl status

# タイムゾーンをJSTに変更
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# NodeのLTSをインストール
curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
sudo apt install nodejs -y

# gitとghをインストール
sudo apt install git -y

(type -p wget >/dev/null || (sudo apt update && sudo apt-get install wget -y)) \
&& sudo mkdir -p -m 755 /etc/apt/keyrings \
&& out=$(mktemp) && wget -nv -O$out https://cli.github.com/packages/githubcli-archive-keyring.gpg \
&& cat $out | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
&& sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
&& sudo mkdir -p -m 755 /etc/apt/sources.list.d \
&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
&& sudo apt update \
&& sudo apt install gh -y

# ブラウザは利用できないので、あらかじめトークンを作成しておく
gh auth login

gemini-cliのインストールと認証

# gemini-cliをインストール
sudo npm install -g @google/gemini-cli

gemini --debug
# EnterでカラーテーマをOKする
# 認証はLogin with Googleを選択
# リスニングポートの許可はしない
# https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount...のURLが表示されるのでクリックしてログインする

geminiはデバッグモードで起動します。Googleアカウントの認証ではブラウザにアクセスする必要がありますが、ターミナルからはブラウザを開けないのでURLを表示するためにデバッグモードを利用します。

カラーテーマはEnterを押してOKし、認証はLogin with Googleを選択します。ターミナルからリスニングポートの許可を求められますが、コールバックURLを早めに取得するため、許可はしません

https://accounts.google.com/o/oauth2/v2/auth/oauthchooseaccount...のURLが表示されるのでクリックしてログインします。ログインするとlocalhostにコールバックされるためURLをコピーしておきます。 ターミナルに戻って別タブを開き、curlで実行することで認証が完了します。

curl 'コピーしたコールバックURL'

geminiを実行したタブに戻ると、認証が完了した状態になっています。このままでも利用できますが、デバッグモードなので一度終了します。

/quit

ここまでの設定でGitHubのリポジトリへのアクセスや、アプリケーション開発などをgeminiに依頼できます。

終わりに

Android単体でgeminiを使ってVibeCodingできる環境を整えました。少し使ってはみましたが、やはりコーディングしてもらうのであればClaudeの方が良いなという印象です。とはいえgeminiは現状無料で利用できるため、あまりAIに投資できないユーザーにとってはありがたい存在です。 geminiを使う場合、(Claudeにも言えることかもしれませんが)1から10を任せるのではなく、タスクを細かく分割して、少しずつ依頼、コミットして最後はユーザー自身が整えるのがいいのかなと思いました。

余談ですが、sshで自宅のPCにログインしてtmuxを利用する方法もあります。弱い回線で接続が切れても、再接続後にtmuxのセッションをアタッチすれば切断前の状態から続けることができます。PCを用意できるのであれば、もしかしたらこちらの方が良いかもしれないですね。

Clicks for Pixel 9を購入した

大方レビューは出ていますが、私も購入したので触った感じをレビューしたいと思います。

5/31(土)に注文して6/11(水)の昼には到着しました。大体1週間半くらいでした。日本郵便は運送事業許可取消があってすぐだったので少し心配でしたが、日本に到着後すぐに届いたので安心しました。

残念なところ

  • 矢印キーが123キー+Searchキーを押さないと打てない。
    • 文章を打つときにカーソルを移動させるのに矢印キーを使いますが、簡易に利用できないです。
  • `はグラーブで変換しないと打てない。
    • Markdownで書くときにはよく使いますが、キーがないのでコピペするか変換する必要があります。
  • 文章を打っていると手が疲れてくる。
    • 重心がスマホ本体側にあるので、だんだん疲れてきます。
  • キー配置に慣れが必要。
    • 限られたスペースしかないので仕方ないですが、タブキーがスペースの右にあったり、修飾キーを使う記号が色んなところに散りばめられています。またEscキーなど、存在しないキーがいくつかあります。

良いところ

  • ホームポジションのキーに突起があるので、一応キーボードを見なくても場所はわかる。(が慣れるまではキーボードを見ないと打てない)
  • ctrl+cやctrl+vでコピペができる。他にもalt+tabなどのショートカットが使える。アプリケーションごとに用意されているショートカットもある。
  • 記号を使わなければ文章は打ちやすい。Androidのターミナルを使うのに相性は良さそう。

終わりに

ClicksのキーボードアプリでもAndroidのシステムでもいいですが、キーマッピングが簡単に変更できるようになるとより多くの人が使いやすくなるかなと思いました。あとやはり長くなるのでポケットからは多少出てしまうし、入れたまましゃがむのが少し厳しいですね。