k8s-实际项目部署案例
2021-11-26 本文已影响0人
小李飞刀_lql
实际项目部署案例
容器交付流程
![](https://img.haomeiwen.com/i19175849/ec1edeeab5fd9c9d.png)
在K8s平台部署项目流程
![](https://img.haomeiwen.com/i19175849/959ba058562c78cb.png)
在K8s平台部署Java网站项目
构建项目镜像
001 解压缩tomcat-java-demo-master项目
[root@es3 file]# yum install -y unzip zip
[root@es3 file]# unzip tomcat-java-demo-master.zip
[root@es3 file]# cd tomcat-java-demo-master
002 Dockerfile
--------------------------------------------------------------------------
FROM lizhenliang/tomcat
LABEL maintainer www.ctnrs.com
RUN rm -rf /usr/local/tomcat/webapps/*
ADD target/ROOT /usr/local/tomcat/webapps/ROOT
--------------------------------------------------------------------------
003 将Dockerfile复制到项目pom.xml的同级目录下
[root@k8s-master javademo]# cp Dockerfile tomcat-java-demo-master
004 将Dockerfile复制到项目pom.xml的同级目录下
[root@es3 file]# cp Dockerfile tomcat-java-demo-master
005 安装相关环境
[root@es3 tomcat-java-demo-master]# yum install java-1.8.0-openjdk maven git -y
006 编译项目,生产target目录
[root@es3 tomcat-java-demo-master]# mvn clean package -Dmaven.test.skip=true
007 解压缩war到相关目录
[root@es3 tomcat-java-demo-master]# unzip target/*.war -d target/ROOT
008 构建镜像
[root@es3 tomcat-java-demo-master]# docker build -t java-demo:v1 .
Successfully tagged java-demo:v1
009 推送镜像
[root@es3 tomcat-java-demo-master]# docker tag java-demo:v1 192.168.153.27/demo/java-demo:v1
[root@es3 tomcat-java-demo-master]# docker push 192.168.153.27/demo/java-demo:v1
010 测试镜像
[root@es3 tomcat-java-demo-master]# docker run -d -p 8088:8080 192.168.153.27/demo/java-demo:v1
http://192.168.153.27:8088/
011 删除镜像
[root@es3 tomcat-java-demo-master]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8980665a5081 192.168.153.27/demo/java-demo:v1 "catalina.sh run" 0.0.0.0:8088->8080/tcp, :::8088->8080/tcp cranky_chatelet
[root@es3 tomcat-java-demo-master]# docker rm -f 8980665a5081
8980665a5081
![](https://img.haomeiwen.com/i19175849/aa297837b6c242d8.png)
数据库搭建
配置文件
apiVersion: v1
kind: Secret
metadata:
name: java-demo-db
namespace: default
type: Opaque
data:
mysql-root-password: "MTIzNDU2"
mysql-password: "MTIzNDU2"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-demo-db
namespace: default
spec:
selector:
matchLabels:
project: www
app: mysql
template:
metadata:
labels:
project: www
app: mysql
spec:
containers:
- name: db
image: mysql:5.7.30
resources:
requests:
cpu: 500m
memory: 512Mi
limits:
cpu: 500m
memory: 512Mi
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: java-demo-db
key: mysql-root-password
- name: MYSQL_PASSWORD
valueFrom:
secretKeyRef:
name: java-demo-db
key: mysql-password
- name: MYSQL_USER
value: "aliang"
- name: MYSQL_DATABASE
value: "k8s"
ports:
- name: mysql
containerPort: 3306
livenessProbe:
exec:
command:
- sh
- -c
- "mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}"
initialDelaySeconds: 30
periodSeconds: 10
readinessProbe:
exec:
command:
- sh
- -c
- "mysqladmin ping -u root -p${MYSQL_ROOT_PASSWORD}"
initialDelaySeconds: 5
periodSeconds: 10
volumeMounts:
- name: data
mountPath: /var/lib/mysql
volumes:
- name: data
persistentVolumeClaim:
claimName: java-demo-db
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: java-demo-db
namespace: default
spec:
storageClassName: "managed-nfs-storage"
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "8Gi"
---
apiVersion: v1
kind: Service
metadata:
name: java-demo-db
namespace: default
spec:
type: ClusterIP
ports:
- name: mysql
port: 3306
targetPort: mysql
selector:
project: www
app: mysql
------------------------------------------------------------------------------
[root@k8smaster javademo]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/java-demo-db-6c775c4d4b-wtb4j 1/1 Running 0 3m18s
pod/nfs-client-provisioner-5f98b5cdfb-rm7dd 1/1 Running 4 47h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/java-demo-db ClusterIP 10.104.14.222 <none> 3306/TCP 3m18s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 26d
初始化MYSQL
001 编辑脚本tables_ly_tomcat.sql
-------------------------------------------------------------------
CREATE DATABASE IF NOT EXISTS `k8s` DEFAULT CHARACTER SET utf8 ;
USE `k8s`;
CREATE TABLE `user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL COMMENT '名字',
`age` INT(3) NOT NULL COMMENT '年龄',
`sex` CHAR(1) DEFAULT NULL COMMENT '性别',
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
COMMIT;
---------------------------------------------------------------------------
002 将sql脚本复制到容器中
[root@k8smaster javademo]# kubectl cp tables_ly_tomcat.sql java-demo-db-6c775c4d4b-wtb4j:/
003 进入容器,登录mysql,初始化脚本
[root@k8smaster javademo]# kubectl exec -it java-demo-db-6c775c4d4b-wtb4j -- bash
root@java-demo-db-6c775c4d4b-wtb4j:/# mysql -ualiang -p123456
mysql> source /tables_ly_tomcat.sql
mysql> use k8s
mysql> select * from user;
部署服务
配置文件
apiVersion: v1
kind: ConfigMap
metadata:
name: java-demo-config
data:
application.yml: |
server:
port: 8080
spring:
datasource:
url: jdbc:mysql://java-demo-db:3306/k8s?characterEncoding=utf-8
username: aliang
password: 123456
driver-class-name: com.mysql.jdbc.Driver
freemarker:
allow-request-override: false
cache: true
check-template-location: true
charset: UTF-8
content-type: text/html; charset=utf-8
expose-request-attributes: false
expose-session-attributes: false
expose-spring-macro-helpers: false
suffix: .ftl
template-loader-path:
- classpath:/templates/
使用镜像仓库
001 配置可信任(如果仓库是HTTPS访问不用配置)
--------------------------------------------------------------------------
[root@es3 harbor]# vi /etc/docker/daemon.json
{
"registry-mirrors": ["......"],
"insecure-registries":["192.168.153.27"]
}
systemctl restart docker
systemctl daemon-reload
docker login 192.168.153.27
--------------------------------------------------------------------------
002 将镜像仓库认证凭据保存在K8s Secret中
[root@k8smaster javademo]# kubectl create secret docker-registry registry-auth --docker-username=admin --docker-password=Harbor12345 --docker-server=192.168.153.27
secret/registry-auth created
[root@k8smaster javademo]# kubectl get secret
NAME TYPE DATA AGE
registry-auth kubernetes.io/dockerconfigjson 1 55s
003 在yaml中使用这个认证凭据
imagePullSecrets:
- name: registry-auth
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-demo
spec:
replicas: 1
selector:
matchLabels:
project: www
app: java-demo
template:
metadata:
labels:
project: www
app: java-demo
spec:
imagePullSecrets:
- name: registry-auth
containers:
- image: 192.168.153.27/demo/java-demo:v1
name: java-demo
volumeMounts:
- name: config
mountPath: "/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/application.yml"
subPath: application.yml
resources:
requests:
cpu: 0.5
memory: 500Mi
limits:
cpu: 1
memory: 1Gi
livenessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 50
periodSeconds: 10
readinessProbe:
httpGet:
path: /
port: 8080
initialDelaySeconds: 50
periodSeconds: 10
volumes:
- name: config
configMap:
name: java-demo-config
items:
- key: "application.yml"
path: "application.yml"
----------------------------------------------------------------------
[root@k8smaster javademo]# kubectl get pod
NAME READY STATUS RESTARTS AGE
java-demo-6dfb768958-9j2t6 1/1 Running 0 94s
java-demo-db-6c775c4d4b-wtb4j 1/1 Running 1 53m
nfs-client-provisioner-5f98b5cdfb-rm7dd 1/1 Running 6 2d
Service
apiVersion: v1
kind: Service
metadata:
name: java-demo
spec:
selector:
project: www
app: java-demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
------------------------------------------------------------------------
[root@k8smaster javademo]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
java-demo ClusterIP 10.105.252.26 <none> 80/TCP 5s
java-demo-db ClusterIP 10.104.14.222 <none> 3306/TCP 57m
Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: java-demo
spec:
rules:
- host: javademo.ctnrs.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: java-demo
port:
number: 80
-----------------------------------------------------------------------------
001 启动ingress
[root@k8smaster ingress]# kubectl apply -f ingress-controller.yaml
002 启动项目的ingress
[root@k8smaster javademo]# kubectl apply -f ingress.yaml
ingress.networking.k8s.io/java-demo created
#Hosts
192.168.153.22 javademo.ctnrs.com
#访问
http://javademo.ctnrs.com/
![](https://img.haomeiwen.com/i19175849/24f8e072a16d3891.png)
增加公网负载均衡器
![](https://img.haomeiwen.com/i19175849/fd000872f04957fa.png)
001 安装nginx
yum install -y nginx
002 修改配置文件/etc/nginx/nginx.conf
----------------------------------------------------------------
#include /etc/nginx/conf.d/*.conf;
upstream java-demo {
server 192.168.153.22:80;
}
server {
listen 81;
server_name javademo.ctnrs.com;
location / {
proxy_pass http://java-demo;
proxy_set_header Host $Host;
}
}
--------------------------------------------------------------------
003 重启nginx
[root@es3 nginx]# systemctl daemon-reload
[root@es3 nginx]# systemctl restart nginx.service
004 hosts
192.168.153.27 javademo.ctnrs.com
005 访问网站
http://javademo.ctnrs.com:81/