K8S-部署Spring Boot+Mysql

一、前提条件

Harbor 私有云

Spring Boot项目

Mysql-5.6.36

k8s (三个node,其中一个用来整Harbor)
Docker

二、具体步骤

大概流程图

在这里插入图片描述

部署MySQL

原文链接:https://blog.csdn.net/mryang125/article/details/108456272

  1. 创建一个持久卷,用来为MySQL挂载存储,不然容器重启数据容易对丢失

mysql-pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: mysql-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

kubectl apply -f mysql-pv.yaml
  1. 编写mysql-deployment.yaml文件

mysql-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - image: mysql:5.6
          name: mysql
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: mysql520
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-persistent-storage
              mountPath: /var/lib/mysql
      volumes:
        - name: mysql-persistent-storage
          persistentVolumeClaim:
            claimName: mysql-pv-claim
  1. 编写service文件

mysql-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql
		[root@k8s-master01 yaml]# kubectl get pod 
		NAME                    READY   STATUS    RESTARTS   AGE
		mysql-77ccd75d5-5cksn   1/1     Running   0          7m1s

进入MySQL交互界面

如果您希望进入Kubernetes中运行的MySQL服务的交互界面,您需要先找到运行MySQL服务的Pod,然后进入该Pod。

以下是具体步骤:

  1. 首先,您需要确定运行MySQL服务的Pod的名称。您可以通过运行以下命令来列出所有Pod:
kubectl get pods

在输出中,您需要找到运行MySQL服务的Pod的名称。
2. 一旦您找到运行MySQL服务的Pod的名称,您可以使用以下命令进入该Pod:

kubectl exec -it <Pod名称> -- mysql -u root -p

<Pod名称> 替换为您找到的MySQL服务的Pod的名称。按回车键执行命令。
3. 现在,您已经进入了MySQL服务的Pod。接下来,您可以运行MySQL命令来进入交互界面。例如,您可以运行以下命令:

mysql -u 用户名 -p

将 “用户名” 替换为您的MySQL用户名。按回车键执行命令。
4. 系统会提示您输入密码。输入密码后,按回车键。
5. 如果输入的密码正确,您将进入MySQL的交互界面。

导入sql表

	kubectl exec -it mysql-649f85f55c-2hb8d 
		-- mysql -u root -p123456 
		 --default-character-set=utf8mb4 
		 	 pharmacy</root/yaml/pharmacy.sql 

这条命令是用于在Kubernetes环境中执行MySQL命令的。它试图进入一个名为mysql-649f85f55c-2hb8d的MySQL pod,并连接到数据库。让我们逐步分析这条命令:

  1. kubectl exec -it: 这是Kubernetes的命令,exec是"execute"的意思,它让你在特定的pod中执行命令。-it参数允许你交互地执行命令,也就是说,它会为你打开一个交互式终端。
  2. mysql-649f85f55c-2hb8d: 这是你要连接的MySQL pod的名字。
  3. --: 这是一个特殊的标志,用于分隔kubectl命令和要执行的命令。
  4. mysql -u root -p123456: 这是在pod中要执行的MySQL命令。这里,我们使用mysql命令来登录到MySQL服务器。-u root表示使用用户名为"root",-p123456表示密码是"123456"。
  5. --default-character-set=utf8mb4: 这是MySQL的一个选项,用于设置默认的字符集。这里是设置为utf8mb4。
  6. pharmacy: 这是你要连接到的MySQL数据库的名字。
  7. < /root/yaml/pharmacy.sql: 这部分是一个输入重定向,表示将pharmacy.sql文件的内容作为SQL命令输入到mysql命令中。

所以,整个命令的意思是:在名为mysql-649f85f55c-2hb8d的MySQL pod中,以"root"用户名和"123456"密码登录到名为pharmacy的数据库,并将/root/yaml/pharmacy.sql文件中的SQL命令作为输入。


坑:

  Warning  FailedCreatePodSandBox  3m49s (x106 over 26m)  kubelet            (combined from similar events): 
  Failed to create pod sandbox: rpc error: code = Unknown desc = failed to setup network for sandbox "92727a09630928e016146e54f57ce67df76b477f43ebbb561f9021611998e90d": plugin type="flannel" failed (add): failed to delegate add: 
  failed to set bridge addr: "cni0" already has an IP address different from 10.244.1.1/24

	核心: failed to set bridge addr: "cni0" already has an IP address different from 10.244.1.1/24
	#已经有一个IP地址与Flannel插件设置的网络冲突,这个IP地址不在10.244.1.1/24范围内。

	解决法子:
	第一步:先干掉
		ifconfig cni0 down
		ifconfig flannel.1 down
		ifconfig docker0 down
		ip link delete cni0
		ip link delete flannel.1
		systemctl restart docker
	# 如果第一步没有好的话,就执行第二步
	第二部:删除这个pod,这时候k8s强大的就死负伤能力就重新在其他节点重新获取一个IP,就不会冲突
	`kubectl delete pod <name>`


在Kubernetes中,可以使用Kubernetes的Pod和Service组件来创建部署(Deployments)和services,并将其与特定的容器镜像关联起来。然而,Kubernetes并不直接支持拉取特定哈希值的容器镜像。相反,Kubernetes依赖于Docker Hub或其他注册中心来拉取和管理镜像。

要在Kubernetes中部署和使用特定镜像,可以按照以下步骤进行操作:

  1. 创建一个Deployment来部署容器镜像:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-container
          image: 192.168.65.101/library/pharmacy_test_02@sha256:cc368b6d4aaefcf6e1013ab90565cb2e99ae047791c963f96361c159e14fcecf
          ports:
            - containerPort: 8080

在上述示例中,我们创建了一个名为my-deployment的Deployment,使用特定哈希值的192.168.65.101/library/pharmacy_test_02@sha256:cc368b6d4aaefcf6e1013ab90565cb2e99ae047791c963f96361c159e14fcecf镜像。

  1. 创建一个Service来暴露Deployment中的容器服务:
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

上述示例创建了一个名为my-service的Service,它将流量转发到my-deployment Deployment中容器的8080端口。
3. 在你的Kubernetes集群上应用这些配置文件,可以使用kubectl apply命令:

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

上述命令分别应用了Deployment和Service的配置文件。请确保将文件名替换为你实际使用的文件名。

在k8s中拉去的镜像需要关联到MYSQL数据库,该怎么做?

在Kubernetes中,要关联一个镜像到MySQL数据库,你需要创建一个Deployment(部署)来运行MySQL容器,并在另一个Deployment中运行你的应用容器。然后,你可以使用Kubernetes的Service(服务)来连接这两个容器。

以下是一个简单的示例,说明如何在Kubernetes中实现这个过程:

  1. 创建MySQL的Deployment和Service:

首先,你需要创建一个Deployment来运行MySQL容器。创建一个名为mysql-deployment.yaml的文件,并添加以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
        - name: mysql
          image: mysql:latest
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: your_root_password
          ports:
            - containerPort: 3306

然后,创建一个Service来暴露MySQL容器:

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
  1. 创建应用的Deployment:

现在,你可以创建一个Deployment来运行你的应用容器。创建一个名为app-deployment.yaml的文件,并添加以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app-service
  template:
    metadata:
      labels:
        app: app-service
    spec:
      containers:
        - name: app-container
          image: your_app_image:tag  # 替换为你的应用镜像的完整路径和标签
          ports:
            - containerPort: 8080  # 替换为你的应用监听的端口号(如果与8080不同)
          env:
            - name: MYSQL_HOST
              value: mysql-service  # 这里使用你在前面创建的MySQL Service的名称来连接MySQL容器,确保与你的环境匹配。使用服务名称而不是IP地址。如果使用IP地址,请确保它是可访问的。使用环境变量来存储MySQL连接信息。根据需要添加其他环境变量(例如MYSQL_USER, MYSQL_PASSWORD等)。你可以根据实际情况进行调整。这些变量应该在你的应用代码中用于建立与MySQL的连接。确保你的应用容器可以访问这些环境变量。你可以通过在部署文件中添加相应的`envFrom`或`env`字段来实现。例如,如果你需要将MYSQL_USER和MYSQL_PASSWORD传递给应用容器,可以在spec.template.spec.containers.env中添加这些字段。

	app-deployment.yaml中的 env:  
	            - name: MYSQL_HOST  
	              value: mysql-service 

是用来连接数据库的?

是的,app-deployment.yaml文件中的env字段是用来设置应用容器的环境变量的。在这个例子中,MYSQL_HOST是一个环境变量,它的值是mysql-service。这个设置告诉应用容器如何连接到MySQL数据库。

当应用容器启动时,它可以通过读取MYSQL_HOST环境变量的值来获取MySQL数据库的地址。由于这里的值是mysql-service,应用容器会查找名为mysql-service的服务并使用该服务的IP地址作为MySQL数据库的地址。这样,应用容器就可以通过网络连接到MySQL数据库,并执行相应的操作。

确保你在部署应用容器之前已经创建了名为mysql-service的MySQL服务,并且该服务已经正确地暴露了MySQL数据库的端口。这样,应用容器才能通过网络连接到MySQL数据库。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值