k8s部署java项目
1. 部署流程
大概流程如下:
制作镜像 (编写Dockerfile) -》推送镜像仓库(网易、阿里) -》 控制器镜像部署 (Deployment) -》对外暴露应用(Service、Ingress) -》运维监控
2. 测试
1. 测试自己的镜像
其实就是一个简单的springboot 项目,里面就依赖的一个mysql。
1. 部署mysql
(1) deployment.yaml
apiVersion: apps/v1 # apiserver的版本 kind: Deployment # 副本控制器deployment,管理pod和RS metadata: name: mysql # deployment的名称,全局唯一 spec: replicas: 1 # Pod副本期待数量 selector: matchLabels: # 定义RS的标签 app: mysql # 符合目标的Pod拥有此标签 strategy: # 定义升级的策略 type: RollingUpdate # 滚动升级,逐步替换的策略 template: # 根据此模板创建Pod的副本(实例) metadata: labels: app: mysql # Pod副本的标签,对应RS的Selector spec: containers: # Pod里容器的定义部分 - name: mysql # 容器的名称 image: mysql:5.7 # 容器对应的docker镜像 volumeMounts: # 容器内挂载点的定义部分 - name: time-zone # 容器内挂载点名称 mountPath: /etc/localtime # 容器内挂载点路径,可以是文件或目录 - name: mysql-data mountPath: /var/lib/mysql # 容器内mysql的数据目录 - name: mysql-logs mountPath: /var/log/mysql # 容器内mysql的日志目录 ports: - containerPort: 3306 # 容器暴露的端口号 env: # 写入到容器内的环境容量 - name: MYSQL_ROOT_PASSWORD # 定义了一个mysql的root密码的变量 value: "123456" volumes: # 本地需要挂载到容器里的数据卷定义部分 - name: time-zone # 数据卷名称,需要与容器内挂载点名称一致 hostPath: path: /etc/localtime # 挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区 - name: mysql-data hostPath: path: /data/mysql/data # 本地存放mysql数据的目录 - name: mysql-logs hostPath: path: /data/mysql/logs # 本地存入mysql日志的目
(2) service.yaml
apiVersion: v1 kind: Service metadata: name: mysql-service spec: type: NodePort ports: - port: 3306 targetPort: 3306 nodePort: 30006 selector: app: mysql
(3) 创建资源,然后查看service
[root@k8smaster01 ~]# kubectl get svc -o wide | grep mysql mysql-service NodePort 10.1.67.176 <none> 3306:30006/TCP 3h20m app=mysql
然后从外部通过任意节点的30006 端口即可访问到mysql
补充: mysql 由于是linux,默认区分大小写,解决办法如下
(1) 排查问题: 先确定一下数据库
show variables like 'lower%'
显示 lower_case_table_names 0
(2) 解决办法
修改 /etc/mysql/mysql.conf.d/mysqld.cnf
加上 lower_case_table_names=1
(3) 然后重启, 因为docker 容器是一个简易容器,没有vi、没有vim、没有yum, 这里只能复制到宿主机修改再复制到容器
容器复制到宿主机
docker cp 35164f686f5f:/etc/mysql/mysql.conf.d/mysqld.cnf ./
宿主机复制到容器:
docker cp ./mysqld.cnf 35164f686f5f:/etc/mysql/mysql.conf.d/
然后重启容器:
docker restart 35164f686f5f
2. 基于Dockerfile 制作自己的镜像
(1) 目录结构如下
[root@k8snode01 springboot-ssm]# ll -R .: total 8 -rw-r--r-- 1 root root 150 Jan 29 04:57 Dockerfile -rw-r--r--. 1 root root 1615 Jan 29 03:40 mysqld.cnf drwxr-xr-x. 2 root root 32 Jan 29 04:24 target ./target: total 109272 -rw-r--r--. 1 root root 111890642 Jan 29 04:23 springboot-ssm.jar
(2) Dockerfile 内容如下
FROM openjdk:8-jdk-alpine VOLUME /tmp ADD ./target/springboot-ssm.jar /springboot-ssm.jar ENTRYPOINT ["java", "-jar", "/springboot-ssm.jar", "&"]
(3) 基于Dockerfile 制作镜像
docker build -t springboot-ssm-01:latest .
(4) 查看镜像
[root@k8snode01 springboot-ssm]# docker images | grep spring springboot-ssm-01 latest 3a8fad2d046a 16 hours ago 217MB
(5) 启动容器
docker run -d -p 8088:8088 springboot-ssm-01 -t
(6) 查看容器
[root@k8snode01 springboot-ssm]# docker ps -a | grep spring a6c668b13d69 springboot-ssm-01 "java -jar /springbo…" 16 hours ago Up 16 hours 0.0.0.0:8088->8088/tcp focused_ramanujan
(7) 测试
外部通过8088 端口正常访问服务即可,测试之后发现mysql 也可以在k8s 集群内部访问到。
2. 推到镜像仓库进行部署
1. 创建镜像仓库
到阿里云创建仓库, 如下:
2. 登录到阿里云, 输入自己的登录密码, 替换为自己的账号和密码
docker login --username=qlq04**** registry.cn-hangzhou.aliyuncs.com
也可以直接用账号密码明文登录
docker login --username=qlq04**** -p=yourpwd registry.cn-hangzhou.aliyuncs.com
3. 打一个tag
语法:
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/qlq_repository/springboot-ssm-01:[镜像版本号]
打tag:
docker tag 3a8fad2d046a registry.cn-hangzhou.aliyuncs.com/qlq_repository/springboot-ssm-01:1.0.0
4. 推送
docker push registry.cn-hangzhou.aliyuncs.com/qlq_repository/springboot-ssm-01:1.0.0
5. 部署镜像,暴露应用
kubectl create deployment springboot-ssm-01 --image=registry.cn-hangzhou.aliyuncs.com/qlq_repository/springboot-ssm-01:1.0.0
开放端口:
kubectl expose deployment springboot-ssm-01 --port=8088 --target-port=8088 -type=NodePort
然后查看svc 和 deployment, 以及pods:
[root@k8smaster01 ~]# kubectl get pods,svc,deployment | grep spring pod/springboot-ssm-01-7cbbfd9697-5gh7d 1/1 Running 0 34h service/springboot-ssm-01 NodePort 10.1.44.205 <none> 8088:31788/TCP 34h deployment.apps/springboot-ssm-01 1/1 1 1 34h
然后客户端通过 31788 端口访问即可。