一、前提条件
Harbor 私有云
Spring Boot项目
Mysql-5.6.36
k8s (三个node,其中一个用来整Harbor)
Docker
二、具体步骤
大概流程图
部署MySQL
原文链接:https://blog.csdn.net/mryang125/article/details/108456272
- 创建一个持久卷,用来为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
- 编写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
- 编写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。
以下是具体步骤:
- 首先,您需要确定运行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,并连接到数据库。让我们逐步分析这条命令:
kubectl exec -it
: 这是Kubernetes的命令,exec
是"execute"的意思,它让你在特定的pod中执行命令。-it
参数允许你交互地执行命令,也就是说,它会为你打开一个交互式终端。mysql-649f85f55c-2hb8d
: 这是你要连接的MySQL pod的名字。--
: 这是一个特殊的标志,用于分隔kubectl命令和要执行的命令。mysql -u root -p123456
: 这是在pod中要执行的MySQL命令。这里,我们使用mysql
命令来登录到MySQL服务器。-u root
表示使用用户名为"root",-p123456
表示密码是"123456"。--default-character-set=utf8mb4
: 这是MySQL的一个选项,用于设置默认的字符集。这里是设置为utf8mb4。pharmacy
: 这是你要连接到的MySQL数据库的名字。< /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中部署和使用特定镜像,可以按照以下步骤进行操作:
- 创建一个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
镜像。
- 创建一个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中实现这个过程:
- 创建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
- 创建应用的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数据库。