kubernetes 无法通过工作台连接到kuberenetes上的mysql服务

zbdgwd5y  于 2022-11-21  发布在  Kubernetes
关注(0)|答案(2)|浏览(170)

我正在使用Minikube,以下是我的配置:
kubectl describe deployment mysql
输出:

Name:                   mysql
Namespace:              default
CreationTimestamp:      Sat, 12 Nov 2022 02:20:54 +0200
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=mysql
Replicas:               1 desired | 1 updated | 1 total | 1 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=mysql
  Containers:
   mysql:
    Image:      mysql
    Port:       3306/TCP
    Host Port:  0/TCP
    Environment:
      MYSQL_ROOT_PASSWORD:  <set to the key 'password' in secret 'mysql-pass'>  Optional: false
    Mounts:
      /docker-entrypoint-initdb.d from mysql-init (rw)
  Volumes:
   mysql-init:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      mysql-init
    Optional:  false
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   mysql-77fd55bbd9 (1/1 replicas created)

当我尝试使用mysql workbench连接到它时:

它告诉我:

但是,当我执行这一行来创建一个mysql-client以尝试连接到mysql服务器时:
kubectl run -it --rm --image=mysql:8.0 --restart=Never mysql-client -- mysql -h mysql -u skaffold -p,然后输入密码,**效果很好!**但我仍然需要更好地使用Workbench。
有没有人帮忙?
编辑1:
下面是用于部署和服务的yaml文件:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: mysql-pass
                  key: password
          ports:
            - containerPort: 3306
          volumeMounts:
            - name: mysql-init
              mountPath: /docker-entrypoint-initdb.d
      volumes:
        - name: mysql-init
          configMap:
            name: mysql-init
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    name: mysql
spec:
  ports:
    - port: 3306
      targetPort: 3306
      protocol: TCP
  selector:
    app: mysql
lmvvr0a8

lmvvr0a81#

首先确保服务正在运行,

kubectl get service

应返回类似于以下内容的内容:

NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
mysql        ClusterIP   10.99.140.115   <none>        3306/TCP     2d6h

从那时起,我将首先尝试运行一个端口转发:

kubectl port-forward service/mysql 3306:3306

这样,即使在使用ClusterIP服务时也可以进行连接。

ee7vknir

ee7vknir2#

如果要通过localhost直接连接到mysql部署的Pod,首先必须将Pod的容器端口转发到localhost

kubectl port-forward <pod-name> <local-port>:<container-port>

然后您的mysql将可以在localhost:<local-port>上访问。
与Pod通信的另一种方式是创建一个Service对象,它将把您的请求直接传递给Pod。有几种类型的服务可用于不同的使用类型。请查看documentation了解更多信息。
原因如下命令

kubectl run -it --rm --image=mysql:8.0 --restart=Never mysql-client -- mysql -h mysql -u skaffold -p

正确地连接到数据库是因为connect命令是在mysql容器本身内部完成的。

编辑1

如果未指定服务类型,则默认值将为ClusterIP,该值不允许您在群集外部公开端口。
由于Minikube不处理LoadBalancer,因此请改用NodePort服务类型。
您的服务YAML清单应如下所示:

apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    name: mysql
spec:
  type: NodePort
  ports:
    - port: 3306
      targetPort: 3306
      protocol: TCP
  selector:
    app: mysql

最后,由于您的集群是通过Minikube配置的,因此您仍需要调用以下命令来获取Minikube IP和服务的NodePort

minikube service <service-name> --url

相关问题