[英]How to Connect Golang application to mysql statefulset in Kubernetes
[英]How to connect my application to kubernetes mysql statefulset
我已經按照鏈接https://kubernetes.io/docs/tasks/run-application/run-replicated-stateful-application/部署了 mysql statefulset,所有 3 個 Z81C3B080DAD537DE7EZE10E09 都運行良好。 我在 Golang 中編寫了一個應用程序,當連接到本地機器上的 MySQL 服務器時,它從 config.toml 文件中讀取 MySQL 環境變量。 config.toml 文件包含這些變量。 當我的應用程序在我的本地機器上運行時使用這些。
MySQLServer = "127.0.0.1"
Port = "3306"
MySQLDatabase = "hss_lte_db"
User = "hss"
Password = "hss"
現在我想在我的 Kubernetes 集群中部署我的應用程序,以便它連接到 MySQL Statefulset 服務。 我創建了如下所示的部署,但 pod 顯示 Error 和 CrashLoopBackOff。 在如何將我的應用程序連接到 MySQL Statefulset 服務方面需要幫助。 也不確定 MySQLServer 連接字符串在 configMap 中是否正確。
apiVersion: v1
data:
config.toml: |
MySQLServer = "mysql-0.mysql,mysql-1.mysql,mysql-2.mysql"
Port = "3306"
MySQLDatabase = "hss_lte_db"
User = "root"
Password = ""
GMLCAddressPort = ":8000"
NRFIPAddr = "192.168.31.115"
NRFPort = "30005"
kind: ConfigMap
metadata:
name: vol-config-gmlcapi
namespace: default
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: gmlc-instance
namespace: default
spec:
selector:
matchLabels:
app: gmlc-instance
replicas: 1
template:
metadata:
labels:
app: gmlc-instance
version: "1.0"
spec:
nodeName: k8s-worker-node2
containers:
- name: gmlc-instance
image: abrahaa1/gmlcapi:1.0.0
imagePullPolicy: "Always"
ports:
- containerPort: 8000
volumeMounts:
- name: configs
mountPath: /gmlcapp/config.toml
subPath: config.toml
volumeMounts:
- name: gmlc-configs
mountPath: /gmlcapp/profile.json
subPath: profile.json
volumes:
- name: configs
configMap:
name: vol-config-gmlcapi
- name: gmlc-configs
configMap:
name: vol-config-profile
我對deployment做了一些變量名的修改,所以更新的deployment如上,但還是沒有連接上。 吊艙的描述如下
ubuntu@k8s-master:~/gmlc$ kubectl describe pod gmlc-instance-5898989874-s5s5j -n default
Name: gmlc-instance-5898989874-s5s5j
Namespace: default
Priority: 0
Node: k8s-worker-node2/192.168.31.151
Start Time: Sun, 10 May 2020 19:50:09 +0300
Labels: app=gmlc-instance
pod-template-hash=5898989874
version=1.0
Annotations: <none>
Status: Running
IP: 10.244.1.120
IPs:
IP: 10.244.1.120
Controlled By: ReplicaSet/gmlc-instance-5898989874
Containers:
gmlc-instance:
Container ID: docker://b756e67a39b7397e24fe394a8b17bc6de14893329903d3eace4ffde86c335213
Image: abrahaa1/gmlcapi:1.0.0
Image ID: docker-pullable://abrahaa1/gmlcapi@sha256:e0c8ac2a3db3cde5015ea4030c2099126b79bb2472a9ade42576f7ed1975b73c
Port: 8000/TCP
Host Port: 0/TCP
State: Terminated
Reason: Error
Exit Code: 1
Started: Sun, 10 May 2020 19:50:33 +0300
Finished: Sun, 10 May 2020 19:50:33 +0300
Last State: Terminated
Reason: Error
Exit Code: 1
Started: Sun, 10 May 2020 19:50:17 +0300
Finished: Sun, 10 May 2020 19:50:17 +0300
Ready: False
Restart Count: 2
Environment: <none>
Mounts:
/gmlcapp/profile.json from gmlc-configs (rw,path="profile.json")
/var/run/secrets/kubernetes.io/serviceaccount from default-token-prqdp (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
configs:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: vol-config-gmlcapi
Optional: false
gmlc-configs:
Type: ConfigMap (a volume populated by a ConfigMap)
Name: vol-config-profile
Optional: false
default-token-prqdp:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-prqdp
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulling 9s (x3 over 28s) kubelet, k8s-worker-node2 Pulling image "abrahaa1/gmlcapi:1.0.0"
Normal Pulled 7s (x3 over 27s) kubelet, k8s-worker-node2 Successfully pulled image "abrahaa1/gmlcapi:1.0.0"
Normal Created 7s (x3 over 26s) kubelet, k8s-worker-node2 Created container gmlc-instance
Normal Started 6s (x3 over 26s) kubelet, k8s-worker-node2 Started container gmlc-instance
Warning BackOff 6s (x3 over 21s) kubelet, k8s-worker-node2 Back-off restarting failed container
仍然無法連接。
日志 output: ubuntu@k8s-master:~/gmlc$ kubectl 日志 gmlc-instance-5898989874-s5s5j -n 默認 2020/05/10 18:13:21 打開 config.toml: 沒有這樣的文件或目錄
看起來 config.toml 文件是問題所在,我的應用程序需要該文件才能運行。
我有 2 個文件(config.toml 和 profile.json)必須在 /gmlcapp/ 目錄中才能運行應用程序。 因為 profile.json 像上面那樣添加到部署中是巨大的,所以我已經單獨創建了它的 configmap。 這是它的 configmap output
ubuntu@k8s-master:~/gmlc$ kubectl get configmaps
NAME DATA AGE
mysql 2 4d3h
vol-config-gmlcapi 1 97m
vol-config-profile 1 7h56m
這也是我在部署中評論 vol-config-profile 時的日志。
ubuntu@k8s-master:~/gmlc$ kubectl logs gmlc-instance-b4ddd459f-fd8nr -n default
root:@tcp(mysql-0.mysql,mysql-1.mysql,mysql-2.mysql:3306)/hss_lte_db
2020/05/10 18:39:43 GMLC cannot ping MySQL sever
2020/05/10 18:39:43 Cannot read json file
panic: Cannot read json file
goroutine 1 [running]:
log.Panic(0xc00003dda8, 0x1, 0x1)
/usr/local/go/src/log/log.go:351 +0xac
gmlc-kube/handler.init.0()
/app/handler/init.go:43 +0x5e9
我通過更改部署中的 volumeMount 使其運行。
解決方案如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: gmlc-instance
namespace: default
spec:
selector:
matchLabels:
app: gmlc-instance
replicas: 1
template:
metadata:
labels:
app: gmlc-instance
version: "1.0"
spec:
nodeName: k8s-worker-node2
containers:
- name: gmlc-instance
image: abrahaa1/gmlcapi:1.0.0
imagePullPolicy: "Always"
ports:
- containerPort: 8000
volumeMounts:
- name: configs
mountPath: /gmlcapp/config.toml
subPath: config.toml
readOnly: true
- name: gmlc-configs
mountPath: /gmlcapp/profile.json
subPath: profile.json
volumes:
- name: configs
configMap:
name: vol-config-gmlcapi
- name: gmlc-configs
configMap:
name: vol-config-profile
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.