この間書いた記事で、AWS上にk3sクラスタを作ることができました。
AWSのインスタンスにログインしてからkubectlで操作してもよいのですが、せっかくなのでローカルのWindows端末からもアクセスしたいですよね。でも、どういうわけかてこずってしまいました。
1.準備
用意したインスタンス
サーバー用×3
名前:k3s-a,k3s-b,k3s-c
インスタンスタイプ:t3.large
ストレージ:20G
AMI:Debian 11を指定
エージェント用×1
名前:k3s-d
インスタンスタイプ:t2.micro
ストレージ:20G
- 各インスタンスは、同じサブネットに所属するように設定しておきました。
- セキュリティグループも各インスタンス同じものを設定しておきます。このセキュリティグループは、同じセキュリティグループに所属するインスタンスからは無制限にアクセスできるようにしておく必要があります
ソフトウェアのバージョン
k3s側
Debian GNU/Linux 11
k3s version v1.23.8+k3s1 (53f2d4e7)
go version go1.17.5
Windows端末側
Rancher Desktop 1.2.1
※kubectlはRancher Desktop付属のもの
2.インスタンスと繋がるようにする
ローカルのWindwosPCからAWSのインスタンスに繋がらなくては話になりません。AWSのコンソールで対象のインスタンスをクリックし、セキュリティグループを選び、、、
「インバウンドルールの編集」をクリックします。
自分のグローバルipアドレスからのインバウンドは、すべて受け付ける様に設定しました。横着して”すべてのトラフィック”を指定しましたが、本来は必要な6443ポートだけを追加する方がいいのかもしれません。
ルールを保存して終了です。ですが私の場合、直後にkubectlを使ってもどういうわけかunreachableと叱られてしまいました。一日たってもう一度試すと、何の問題もなく繋がったので、ひょっとしたら設定の変更に時間がかかるのでしょうか?わかりません。ここがてこずったポイントの一つ目でした。
3.kubectlを使ってみる
インスタンスk3s-aにログインして、k3s.yamlを確認し、何らかの方法でローカルPCにコピーしましょう(それこそGUI上のコピー&ペーストでも何でもよい)。
$sudo cat /etc/rancher/k3s/k3s.yaml
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUyTlRZNE9USTJNVFl3SGhjTk1qSXdOekF6TWpNMU5qVTJXaGNOTXpJd05qTXdNak0xTmpVMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUyTlRZNE9USTJNVFl3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFUUXc4NjV2aHZ0ZWxvcmJPY3JaRkNRaEdxMXo1MUh2T1FDNWRGd1liNDEKa1dwcXNkZ1BtVFRCbmtUZTdWVkxCNW5tUjRDQ0FvRHVpSks1NVpxTGQ2MVBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVXRIL3ozNmo4T1dZOS95K3AwbGdQCklKRVdkL1F3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnR24rSTVPQjNscENadThvdFN0QlY0cm54ZzN0UVhNcXEKNGhSZU9XS2tMUjRDSVFEeU1GcWxZT0tMMFVkWTVaUms3Mm9qSzRPY1l1ZytGRks2RWdoVFpQRTFTdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://127.0.0.1:6443
name: default
contexts:
- context:
cluster: default
user: default
name: default
current-context: default
kind: Config
preferences: {}
users:
- name: default
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJrRENDQVRlZ0F3SUJBZ0lJZlRmWjQ2VFlBOVV3Q2dZSUtvWkl6ajBFQXdJd0l6RWhNQjhHQTFVRUF3d1kKYXpOekxXTnNhV1Z1ZEMxallVQXhOalUyT0RreU5qRTJNQjRYRFRJeU1EY3dNekl6TlRZMU5sb1hEVEl6TURjdwpOREF3TlRrd09Wb3dNREVYTUJVR0ExVUVDaE1PYzNsemRHVnRPbTFoYzNSbGNuTXhGVEFUQmdOVkJBTVRESE41CmMzUmxiVHBoWkcxcGJqQlpNQk1HQnlxR1NNNDlBZ0VHQ0NxR1NNNDlBd0VIQTBJQUJKcUxhK3NnMENuQ3N4OGgKVENsV3B6ZEtvUXltamROY0dvQUNGeDZLS0w0bHBvWEdJbHJrbDJwZGhDc2RnWFpieHFDVjVtalA3Q25xazN5YQo5bi94V3UyalNEQkdNQTRHQTFVZER3RUIvd1FFQXdJRm9EQVRCZ05WSFNVRUREQUtCZ2dyQmdFRkJRY0RBakFmCkJnTlZIU01FR0RBV2dCUVhMUFBJVnZMTzMxUHZYbFd1eDRrUFVmNkFWREFLQmdncWhrak9QUVFEQWdOSEFEQkUKQWlCeEljRVZnLytKck50aWx2a3pKWElITkhsbmJWYitobFVtS2lnVHJhZjhtZ0lnTjZKcHFKU3FIVGxrcVdxWApib1NJZnV6Sys4VHZJOVJMeUNZUVlqUXYzc0E9Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdFkyeHAKWlc1MExXTmhRREUyTlRZNE9USTJNVFl3SGhjTk1qSXdOekF6TWpNMU5qVTJXaGNOTXpJd05qTXdNak0xTmpVMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRZMnhwWlc1MExXTmhRREUyTlRZNE9USTJNVFl3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFScXd0aFJFVCthenBNTm1HL1drZnVoVHE4RVVFWS9vZi9YSTFyeTdydGoKZnRZdHBNaWExOXRlWHRQejByWVVSZ2dabllueFBqUGpQRlVSRDRKd2RHUGRvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVUZ5enp5RmJ5enQ5VDcxNVZyc2VKCkQxSCtnRlF3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUloQU0yN1ZjckNrWmJWV24rSlNyV3BEbXd1cXo1NEJ3MUkKUlMwR3JwYStnNjNaQWlCa283ZUZQQkJlYTAyM2doTnpFSXBTTW9XVGZWL3FqQi9yNkVlV0phUVF4UT09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
client-key-data: LS0tLS1CRUdJTiBFQyBQUklWQVRFIEtFWS0tLS0tCk1IY0NBUUVFSUpRZzg2elR2OUVXUjRhaEFtSmlsS2xWbUFhK0Jjd1ppRnlIcEtlWS9sbGlvQW9HQ0NxR1NNNDkKQXdFSG9VUURRZ0FFbW90cjZ5RFFLY0t6SHlGTUtWYW5OMHFoREthTjAxd2FnQUlYSG9vb3ZpV21oY1lpV3VTWAphbDJFS3gyQmRsdkdvSlhtYU0vc0tlcVRmSnIyZi9GYTdRPT0KLS0tLS1FTkQgRUMgUFJJVkFURSBLRVktLS0tLQo=
k3s.yamlをローカルに用意出来たら、いよいよkubectlを使いたいのですが、
$ kubectl --kubeconfig k3s.yaml get all
I0707 09:49:34.679235 42700 versioner.go:58] Get https://13.208.173.101:6443/version?timeout=5s:
x509: certificate is valid for 10.43.0.1, 127.0.0.1, 13.208.186.206, 13.208.45.169, 15.152.36.55, 15.152.39.162, 172.31.42.76, 172.31.46.204, 172.31.47.52, ::1, not 13.208.xxx.xxx
末尾でnot 13.208.xxx.xxxと叱られてしまいました。13.208.xxx.xxxはインスタンスのパブリックアドレスですが、どうやらこの証明書はこのパブリックアドレスでは使えませんよ、と言われてしまってるようです。k3sの証明書は自己署名証明書でかつ動的に生成されます。
そこで、k3s.yamlに細工をします。
apiVersion: v1
clusters:
- cluster:
#certificate-authority-dataをコメントアウト。削除でも可。
#certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUJkekNDQVIyZ0F3SUJBZ0lCQURBS0JnZ3Foa2pPUFFRREFqQWpNU0V3SHdZRFZRUUREQmhyTTNNdGMyVnkKZG1WeUxXTmhRREUyTlRZNE9USTJNVFl3SGhjTk1qSXdOekF6TWpNMU5qVTJXaGNOTXpJd05qTXdNak0xTmpVMgpXakFqTVNFd0h3WURWUVFEREJock0zTXRjMlZ5ZG1WeUxXTmhRREUyTlRZNE9USTJNVFl3V1RBVEJnY3Foa2pPClBRSUJCZ2dxaGtqT1BRTUJCd05DQUFUUXc4NjV2aHZ0ZWxvcmJPY3JaRkNRaEdxMXo1MUh2T1FDNWRGd1liNDEKa1dwcXNkZ1BtVFRCbmtUZTdWVkxCNW5tUjRDQ0FvRHVpSks1NVpxTGQ2MVBvMEl3UURBT0JnTlZIUThCQWY4RQpCQU1DQXFRd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlZIUTRFRmdRVXRIL3ozNmo4T1dZOS95K3AwbGdQCklKRVdkL1F3Q2dZSUtvWkl6ajBFQXdJRFNBQXdSUUlnR24rSTVPQjNscENadThvdFN0QlY0cm54ZzN0UVhNcXEKNGhSZU9XS2tMUjRDSVFEeU1GcWxZT0tMMFVkWTVaUms3Mm9qSzRPY1l1ZytGRks2RWdoVFpQRTFTdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
server: https://13.208.173.101:6443
#insecure-skip-tls-verifyの一行を追加
insecure-skip-tls-verify: true
name: default
(以下略)
TLSによる認証を強制的にスキップしているという事に注意してください。
本来なら正式に証明書をk3sにインストールすべきでしょう(そこまで調査の手が回ってないのですが)
改めて挑戦。
$ kubectl --kubeconfig k3s.yaml get all
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-9456bbbf9-4bns8 1/1 Running 2 (7m59s ago) 42h
pod/nginx-deployment-9456bbbf9-lnhkb 1/1 Running 2 (8m ago) 42h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 3d
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 2/2 2 2 42h
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-9456bbbf9 2 2 2 42h
今度はうまくいきました。k3s.yamlを細工する代わりに、以下でも同じ結果になります。
kubectl --kubeconfig k3s.yaml get all --insecure-skip-tls-verify=true
4.参考文献
k3sを使う - 名有りさんの日記
このページを見つけられなければ解決しませんでした。御礼申し上げます。