前置き
この記事は自分用のメモとしての意味合いが強いです。ネットで調べた物を試しても上手くいかず、自分で片っ端から試してみたらたまたま出来てしまった設定を紹介します。分かる人が見れば「そりゃそうだろ」って感じかもしれませんが、調べてもあんまり出てこなかったので、ここに載せておきます。
経緯
Kubernetes上でMySQLのPodを作成した。色々あって、このPodにPythonのmysql.connectorを使ってテーブルを編集したくなった。そこでMySQLに接続するために接続情報を入力する。入力する情報は以下の5つ
- host
- port
- user
- password
- database
問題発生
これのuser, password, databasesは直ぐに分かる。portも普通に3306だろうと判断した。しかし、hostが分からない。これだろうと設定したhostがことごとく弾かれる。
当初は、mysqlのService名を設定した。しかし上手くいかない。localhost(127.0.0.1)かと思ったが、上手くいかない。さて何故だ。
MySQLの設定
参考までにMySQLの設定をここに書いておく。
ServiceのYamlファイル
apiVersion: v1
kind: Service
metadata:
name: mysql-test
labels:
app: mysql
spec:
type: ClusterIP
ports:
- port: 3306
targetPort: 3306
selector:
app: mysql
DeployのYamlファイル
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-test
labels:
app: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
nodeSelector:
kubernetes.io/hostname: worker
containers:
- image: mysql:5.7
name: mysql-test
env:
- name: MYSQL_ROOT_PASSWORD
value: ROOT_PASSWORD
- name: MYSQL_DATABASE
value: DB
- name: MYSQL_USER
value: USER
- name: MYSQL_PASSWORD
value: USER_PASSWORD
ports:
- containerPort: 3306
name: mysql-test
volumeMounts:
- name: mysql-storage-test
mountPath: /var/lib/mysql
volumes:
- name: mysql-storage-test
persistentVolumeClaim:
claimName: mysql-pvc-test
dnsPolicy: ClusterFirstWithHostNet
MySQLのPodの詳細情報
Name: mysql-test-8fd9f44fb-5tcx9
Namespace: default
Priority: 0
Service Account: default
Node: worker/192.168.100.169
Start Time: Tue, 24 Oct 2023 05:50:11 +0000
Labels: app=mysql
pod-template-hash=8fd9f44fb
Annotations: <none>
Status: Running
IP: 10.42.1.8
IPs:
IP: 10.42.1.8
Controlled By: ReplicaSet/mysql-test-8fd9f44fb
Containers:
mysql-test:
Container ID: containerd://1accde85c6b6bdfd7655f0a121b62e272d988c4cc96f1791584673b2437caae0
Image: mysql:5.7
Image ID: docker.io/library/mysql@sha256:4f9bfb0f7dd97739ceedb546b381534bb11e9b4abf013d6ad9ae6473fed66099
Port: 3306/TCP
Host Port: 0/TCP
State: Running
Started: Tue, 24 Oct 2023 05:50:13 +0000
Ready: True
Restart Count: 0
Environment:
MYSQL_ROOT_PASSWORD: ROOT_PASSWORD
MYSQL_DATABASE: DB
MYSQL_USER: USER
MYSQL_PASSWORD: USER_PASSWORD
Mounts:
/var/lib/mysql from mysql-storage-test (rw)
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qrj9b (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
mysql-storage-test:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: mysql-pvc-test
ReadOnly: false
kube-api-access-qrj9b:
Type: Projected (a volume that contains injected data from multiple sources)
TokenExpirationSeconds: 3607
ConfigMapName: kube-root-ca.crt
ConfigMapOptional: <nil>
DownwardAPI: true
QoS Class: BestEffort
Node-Selectors: kubernetes.io/hostname=c0a20092-worker
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events: <none>
解決編
結果から言うと、このMySQLのPodのIPアドレスをhostに設定すると上手くいきました。
PodのIPアドレスはdescribeの「IP」に書いてある奴です。今回は「10.42.1.8」でした。
仮想マシンやローカルのPCにおいての「localhost」とKubernetesのPodにおける「localhost」は違うのかもしれません。