MySQLのPodにPythonで接続する

## 前置き
この記事は自分用のメモとしての意味合いが強いです。ネットで調べた物を試しても上手くいかず、自分で片っ端から試してみたらたまたま出来てしまった設定を紹介します。分かる人が見れば「そりゃそうだろ」って感じかもしれませんが、調べてもあんまり出てこなかったので、ここに載せておきます。

## 経緯
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」は違うのかもしれません。