kubernetes部署应用程序及MySQL数据库

镜像制作网上有很多教程,本地镜像仓库也有很多教程,这里不去详细介绍和部署了

生成yaml文件

kubectl create deployment web --image=fage/java-demo:v1 --dry-run=client -o yaml >deployment.yaml

部署前需要考虑的有:

1、拉取镜像认证信息
2、拉取镜像策略
3、资源的限制
4、健康检查
5、数据卷挂载.....等

cat deployment.yaml  

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web   #这里的标签名称要和service的对应才能被service关联
  name: java-demo    #显示的名称
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
      project: www    #注意:如果这里有这个标签,在service也要有
  strategy: {}
  template:
    metadata:
      labels:
        app: web
        project: www   #注意:如果这里有这个标签,在service也要有
    spec:
      containers:
      - image: fage/java-demo:v1
        name: java-demo
        resources: {}
        # 镜像拉取策略
        imagePullPolicy: IfNotPresent
        # 变量
        env:
        - name: ABC
          value: "123456"
        # 资源限制,requests是启动最小资源,limits是最大使用资源,分配资源到pod参考依据
        resources:
          limits:
            cpu: 1
            memory: "1000Mi"
          requests:
            cpu: 0.5
            memory: "500Mi"
        # 存活健康检查,关联service,失败会被ep剔除pod
        livenessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 10
        # 准备就绪检查
        readinessProbe:
          httpGet:
            path: /
            port: 8080
          initialDelaySeconds: 60
          periodSeconds: 10
        # 数据卷挂载
        #voluneMounts:
        #  - name: config
        #    mountPath: /data
      #数据源位置数据卷类型有nfs\secret\hostPath\configmap\emptyDir等
      #volumes:
      #  - name: config
      #    type: nfs
      #      path: /data
      #      server: 192.168.10.162

这里暂时不用数据卷

生效清单文件

kubectl apply -f deployment.yaml 

如果需要更新的话需要将原来的deployment.yaml删除掉后重建kubectl delete -f deployment.yaml 重建 kubectl apply -f deployment.yaml

创建service

vim svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: java-demo
  project: www   #注意:如果这里有这个标签,在deployment也要有
spec:
  ports:
  - port: 80
    protocol: TCP
    nodePort: 30010
    targetPort: 8080
  selector:
    app: web   #这里要与deployment的标签对应才能提供服务
  type: NodePort

需要是三个都能看到才能正常访问

 

kubernetes部署MySQL容器实例

生成配置清单文件

cat mysql.yaml

apiVersion: v1
kind: Secret
metadata:
  name: java-demo-db 
  namespace: default
type: Opaque
data:
  mysql-root-password: "MTIzNDU2"
  mysql-password: "MTIzNDU2"
# 以上是secret存储信息,不能存储明文数据,需要base64加密方式后的密码
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: java-demo-db   #pod显示的名称
  namespace: default   #属于哪个标签
spec:
  selector:
    matchLabels:
      project: www
      app: mysql       #service关联的标签
  template:
    metadata:
      labels:
        project: www
        app: mysql     #service关联的标签
    spec:
      containers:
      - name: db
        image: mysql:5.7.30  #使用官方的镜像部署MySQL
        resources:     #资源限制
          requests:
            cpu: 500m
            memory: 512Mi
          limits: 
            cpu: 500m
            memory: 512Mi
        env:           #使用secret环境变量
        - 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: "test"
        - name: MYSQL_DATABASE
          value: "test"
        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
---
# PVC自动供给
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: java-demo-db   #PVC被挂载的名称
  namespace: default
spec:
  storageClassName: "managed-nfs-storage"
  accessModes:
    - "ReadWriteOnce"  #挂载的权限类型
  resources:
    requests:
      storage: "8Gi"
---
#service暴露信息
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

注意:数据库需要持久化,需要搭建自动供给环境如:NFS挂载自动供给获取其他支持持久化数据存储

生效清单文件

kubectl apply -f mysql.yaml
kubectl get pods -owide |grep "java-demo-db"

kubectl get pv,pvc |grep "java-demo-db"

kubectl get svc |grep "java-demo-db"

创建临时mysql客户端测试

kubectl run mysql-client -it --rm --image=mysql:5.7 -- bash

更改镜像连接数据库的地址、数据库名、用户和密码

vim tomcat-java-demo-master/src/main/resources/application.yml

指向你的数据库的地址

然后将数据库的sql文件导入到数据库,创建并授权用户可以远程连接

kubectl get pods | grep " java-demo-db"
kubectl cp /root/tomcat-java-demo-master/db/tables_ly_tomcat.sql java-demo-db-79fb79db89-zpkbn:/
kubectl exec -it java-demo-db-79fb79db89-zpkbn bash
mysql -uroot -p123456
create database test;
use test;
source /tables_ly_tomcat.sql
grant all on test.* to 'root'@'%' identified by '123456';

然后重新构建镜像和创建业务镜像

cd && cd tomcat-java-demo-master/ && mvn clean package -Dmaven.test.skip=true
docker build -t fage/java-demo:v2 .

然后上传镜像到镜像仓库,没有镜像仓库可以到处镜像复制到其他及节点上导入

docker save -o java-demo-v2.tar fage/java-demo:v2
scp java-demo-v2.tar root@192.168.10.111:~
scp java-demo-v2.tar root@192.168.10.112:~

在其他节点导入镜像

docker load <java-demo-v2.tar

修改yaml镜像使用新的版本,把版本更改为最新的即可

如果需要提供给外部访问创建ingress规则即可

至此部署完成

posted @ 2020-10-06 15:17  缺个好听的昵称  阅读(72)  评论(0编辑  收藏  举报