K8s: 应用项目部署运维环境搭建

使用 StatefulSet 部署 Mysql

  • 数据库环境准备是应用的前置准备工作

  • 先在 node 节点上安装 mysql

    • $ sudo yum install mysql-server -y 安装
    • $ sudo systemctl start mysqld 启动
    • $ sudo systemctl enable mysqld 设置开启启动
    • $ sudo mysql_secure_installation 设置安全选项
    • $ mysql --version 查看版本
  • 我们在 node1 这个 work 节点部署,准备 app-mysql.yaml

    apiVersion: v1
    kind: Service
    metadata:name: mysql-nodeport
    spec:ports:- port: 3306nodePort: 30306selector:app: mysqltype: NodePort---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:name: mysql
    spec:serviceName: "mysql"replicas: 1 # 虽然您要求不要副本,但StatefulSet通常需要至少一个副本selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:8.0.36env:- name: MYSQL_ROOT_PASSWORDvalue: "password"ports:- containerPort: 3306name: mysqlvolumeMounts:- name: mysql-configmountPath: /etc/mysql/conf.d- name: mysql-datamountPath: /var/lib/mysqlvolumes:- name: mysql-confighostPath:path: /tmp/mysql/conf.dtype: DirectoryOrCreate- name: mysql-datahostPath:path: /tmp/mysql/datatype: DirectoryOrCreate
    
  • $ kubectl create -f app-mysql.yaml 创建

    service/mysql-nodeport created
    statefulset.apps/mysql created
    
  • $ kubectl get all

    NAME          READY   STATUS    RESTARTS   AGE
    pod/mysql-0   1/1     Running   0          27sNAME                     TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    service/kubernetes       ClusterIP   10.1.0.1       <none>        443/TCP          35h
    service/mysql-nodeport   NodePort    10.1.183.195   <none>        3306:30306/TCP   27sNAME                     READY   AGE
    statefulset.apps/mysql   1/1     27s
    
  • $ mysql -u root -P 30306 -h node1.k8s -p

    Enter password:
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 8
    Server version: 8.0.36 MySQL Community Server - GPLCopyright (c) 2000, 2024, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
    
    • 输入密码 password 就可以登录了
  • 注意,在低版本的一些 mysql 中的配置会有不同,而且可能需要加上如下,不会意外退出

    command: [ "/bin/bash", "-c", "--" ]
    args: [ "while true; do sleep 30; done;" ]
    
  • 现在,我们可以创建一个新的数据库了

  • $ create database blogDBTest DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

    Query OK, 1 row affected, 2 warnings (0.06 sec)
    
  • 查看 $ show databases

    +--------------------+
    | Database           |
    +--------------------+
    | blogDBTest         |
    | information_schema |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.03 sec)
    
  • 可见,mysql数据库环境准备好了,这里只做了单实例的

  • 注意,这个配置有很多的优化点,比如:集群副本,存储,密码加密等

    • 密码这块,参考下面的配置
  • 仅供参考,可关注我之前的博文以及持续关注 …

为应用程序配置 Service 和 Development


1 ) 先说明下博客应用的底层配置

  • 比如,当前博客应用的application.yml
    spring:thymeleaf:mode: HTMLprofiles:active: devcomment.avater: /images/avatar.png
    server:port: 5000
    
  • 可以看到应用程序启动后的端口是 5000
  • 继续看下其 Dockerfile 文件
    FROM openjdk:8-jdk-alpine3.7
    VOLUME /tmp
    ADD target/blog.jar /blog.jar
    EXPOSE 5000
    ENTRYPOINT ["java", "-jar", "/blog.jar"]
    
  • 可见容器内对外暴露的也是 5000 的端口
  • application-dev.yml 文件中做了一些数据库相关的配置,如下
    spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://${MYSQL_SERVER:localhost}:${MYSQL_PORT:3306}/${MYSQL_DB_NAME_TEST:blogDB}?useUnicode=true&characterEncoding=utf-8username: ${MYSQL_USER_TEST: root}password: ${MYSQL_PASSWORD_TEST: password}
    

2 )现在进入正题,应用程序的配置

  • $ vi app-blog.yaml 这个是博客应用程序的yaml文件

    apiVersion: v1
    kind: Service
    metadata:name: k8sblog
    spec:selector:app: k8sblogtype: NodePortports:- port: 5000targetPort: 5000nodePort: 30002---
    apiVersion: apps/v1
    kind: Deployment
    metadata:name: k8sblog
    spec:selector:matchLabels:app: k8sblogtemplate:metadata:labels:app: k8sblogspec:hostAliases:- ip: "10.211.10.2"hostnames:- "art.local" # 这里是我们的私有镜像中心containers:- name: k8sblogimage: 10.211.10.2:8081/docker-local/k8sblog:1.1ports:- containerPort: 5000env:- name: MYSQL_PORTvalue: "30306"- name: MYSQL_SERVERvalue: "node1.k8s"- name: MYSQL_DB_NAME_TESTvalue: blogDB- name: MYSQL_USER_TESTvalue: "root"- name: MYSQL_PASSWORD_TESTvalueFrom:secretKeyRef:name: mysql-password-testkey: MYSQL_PASSWORD_TESTimagePullSecrets:- name: regcred-local
    
  • 这里的密码加密的生成,这里上面的可以进行参考,之前博文也有其他方式,请持续关注

    • $ kubectl create secret generic mysql-password-test --from-literal=MYSQL_PASSWORD_TEST=password
  • $ kubectl create -f app-blog.yaml 创建

  • $ kubectl get po 查看app成功运行

  • 访问: http://node1.k8s:30002

  • 以上仅仅是一种演示,仅供参考

从私有镜像中心拉取/同步应用镜像


1 ) 拉取

  • 从上面的yaml中,可以看到,image: 10.211.10.2:8081/docker-local/k8sblog:1.1 这个配置
  • 这个就是私有镜像中心拉取的

2 )上传同步

  • 当应用程序修改源码后,需要重新打包, 重新将镜像传到镜像中心
  • $ mvn package
  • $ docker build -t 10.211.10.2:8081/docker-local/k8sblog:1.1 .
  • $ docker push 10.211.10.2:8081/docker-local/k8sblog:1.1
  • 注意,每次发版都要升级版本

3 )关于设置镜像拉取密码

  • 从上面可以看到, 有如下配置

    imagePullSecrets:
    - name: regcred-local
    
  • 这个就是在私有镜像中心设置的拉取镜像时的密码

  • $ kubectl create secret docker-registry regcred-local --docker-server=10.211.10.2:8081 --docker-username=admin --docker-password=password --docker-email=xxx@qq.com

    • 这里 regcred-local 就代表你的用户名和密码加密后的code
    • $ kubectl describe secret regcred-local 可以看到加密了和之前的其他secret 一样的效果

空间隔离


1 ) 关于空间隔离

  • 空间的隔离,一般都是指的是 namespace
  • default 命名空间可以用于测试,测试完成后需要归类到某个命名空间下
  • 之前所有的 pod 都是运行在 default 命名空间中的
  • $ kubectl get ns 查看所有命名空间
  • $ kubectl create ns test 创建 test 命名空间

2 )创建相关环境的秘钥

  • $ kubectl create secret generic mysql-password-test --from-literal=MYSQL_PASSWORD_TEST=password -n test
    • 创建 test 环境命名空间的 mysql 秘钥
  • $ kubectl create secret docker-registry regcred-local --docker-server=10.211.10.2:8081 --docker-username=admin --docker-password=password --docker-email=xxx@qq.com -n test
    • 创建 test 环境命名空间的 拉取镜像的 秘钥
  • 同时,我们可以在上述 yaml 配置下的 metadata 中添加命名空间
    metadata:namespace: test
    
  • $ kubectl get secret -n test 查看test空间下创建的所有秘钥

私有镜像仓库管理

  • 在本地研发测试的时候,不是直接部署到 docker-test, docker-prod
  • 可以在local本地建空间来测试,比如在 docker-local下继续建
    • docker-local-test
    • docker-local-prod
  • 这样在研发的时候就可以进行本地测试 test 和 prod了
  • 同样,在 yaml 中对应的镜像地址可以修改,之前是这样的
    • $ 10.211.10.2:8081/docker-local/k8sblog:1.1
  • 现在没有必要改成如下的配置
    • $ 10.211.10.2:8081/docker-local-test/k8sblog:1.1
    • $ 10.211.10.2:8081/docker-local-prod/k8sblog:1.1
  • 只需要这样,使用虚拟镜像地址
    • $ 10.211.10.2:8081/docker/k8sblog:1.1
    • 注意,所有的仓库都在 docker 组下
    • 可以在 Set Me Up 中设置
  • 注意,实际使用中需要使用 API 和脚本去做镜像从一个仓库拷贝到另一个仓库的操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab进阶绘图第51期—带填充等高线的三维特征渲染散点图

带填充等高线的三维特征渲染散点图是填充等高线图与特征渲染三维散点图的组合。 其中&#xff0c;填充等高线图与特征渲染的三维散点图的颜色用于表示同一个特征。 由于填充等高线图无遮挡但不直观&#xff0c;特征渲染的三维散点图直观但有遮挡&#xff0c;而将二者组合&…

MySQL数据库进阶篇二(优化、视图/存储过程/存储函数/触发器)

目录 一、SQL优化1.1、插入数据1.2、主键优化1.3、order by优化1.4、group by优化1.5、limit优化1.6、count优化1.7、update优化 二、视图/存储过程/存储函数/触发器2.1、视图2.2、存储过程2.3、存储函数2.4、触发器 一、SQL优化 分为&#xff1a;插入数据优化&#xff0c;主键…

一文了解——企业网站为什么需要安装SSL证书 !

企业网站安装SSL证书主要是出于以下几个关键原因&#xff1a; 1. 数据加密&#xff1a;SSL证书能确保网站与用户浏览器之间的数据传输是加密的&#xff0c;保护敏感信息&#xff08;如登录凭据、个人信息、交易数据&#xff09;不被第三方截取或篡改&#xff0c;维护用户隐私安…

Apache Flink:流式数据处理的新典范

在大数据处理领域&#xff0c;Apache Flink以其强大的流式数据处理能力&#xff0c;逐渐成为了业界的新宠。Flink是一个分布式流处理框架&#xff0c;能够处理无界和有界数据流&#xff0c;提供了高吞吐、低延迟的数据处理能力。 Flink的核心优势在于其流处理和批处理的统一模…

968.监控二叉树 树上最小支配集

法一: 动态规划 一个被支配的节点只会有三种状态 1.它本身有摄像头 2.他没有摄像头, 但是它的父节点有摄像头 3.他没有摄像头, 但是它的子节点有摄像头 我们 dfs(node,state) 记录在node节点时(以node为根的子树),状态为state下的所有最小摄像头 // 本身有摄像头就看左右孩子…

Elementplus远程搜索下拉

远程搜索 :remote-method“getAppNumberList” <div class"filter-item"><span>型号:</span><el-select v-model"listQuery.numberId" clearable filterable :remote-method"getAppNumberList" remote placeholder"请…

蓦然回首,追忆那些备战OCM的日子

蓦然回首 前段时间偶然在墨天轮群看到一位在墨天轮轮社区非常活跃的老兄发的《那些年&#xff0c;我们一起追过的OCP》的文章&#xff0c;获悉墨天轮在举办【我的备考经验】的有奖征文活动&#xff0c;打开那篇文章&#xff0c;一下子又把我的思绪拉回到了好几年前&#xff0c;…

数据结构之顺顺顺——顺序表

1.浅谈数据结构 相信我们对数据结构都不陌生&#xff0c;我们之前学过的数组就是最基础的数据结构&#xff0c;它大概就长这样&#xff1a; 数组 而作为最简单的数据结构&#xff0c;数组只能帮助我们实现储存数据这一个功能&#xff0c;随着学习的深入&#xff0c;和问题的日渐…

React | React.cloneElement 的使用

我看到同事的代码里有 cloneElement&#xff0c;于是去了解了一下这个函数。 就跟它的名字一样&#xff0c;克隆元素&#xff0c;可以基于一个元素创建一个新的元素&#xff0c;并且为新元素添加新的属性或者覆盖已有的属性。 下面是一个简单例子&#xff1a; .node1 {backg…

Java集合框架-Collection-queue

目录 一、Deque二、ArrayDequeArrayDeque层次结构图ArrayDeque概述ArrayDeque底层数据结构ArrayDeque常用方法(简略) 三、PriorityQueuePriorityQueue层次结构图PriorityQueue概述PriorityQueue 底层数据结构PriorityQueue常用方法(详细) Java里有一个叫做Stack的类&#xff0c…

【Linux】进程的控制①之进程创建与进程退出

一 、进程的创建 1、fork函数 fork函数功能&#xff1a;从已经存在的进程中创建一个新进程。新进程为子进程&#xff0c;原进程为父进程。 fork函数创建进程过后&#xff0c;父子进程代码和数据是共享的。在前面也讲过。 2.函数的返回值 如果进程创建成功&#xff0c;给父进…

Linux中的vi与vim:编辑器的王者之争与深度探索

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、vi与vim的历史与发展 …

【ARMv9 DSU-120 系列 6 -- Power management】

请阅读【Arm DynamIQ™ Shared Unit-120 专栏 】 文章目录 Power management In DSU-120Power DomainsPDTopPDClusterPDCore<cn>PDComplex<cpxn>PDSlice<slicen>PDL3RAM0 和 PDL3RAM1Cluster power mode在线模式(On)

flutter笔记-webrtc使用1:依赖本地包socket.io-client

文章目录 1. 示例工程2. yaml 修改3. 使用4. socketio 关于自定义服务器自定义签名的问题封装成async和await方式 本文开始介绍webrtc的使用&#xff0c;阅读本文的前提是假设你已经使用过webrtc&#xff0c;了解webrtc的交互机制&#xff0c;不了解的可以看之前的文章&#xf…

springboot实现同时批量新增和批量修改数据

在springboot项目中&#xff0c;实现同时将一批数据进行新增和修改 有时候我们会遇到&#xff0c;用户在前端界面提交一批数据&#xff0c;而这一批数据中&#xff0c;可能有新增的数据也可能存在修改的数据&#xff0c;为了方便同时执行新增和修改的方法&#xff0c;需要调用…

Python轻量级Web框架Flask(12)—— Flask类视图实现前后端分离

0、前言&#xff1a; 在学习类视图之前要了解前后端分离的概念&#xff0c;相对于之前的模板&#xff0c;前后端分离的模板会去除views文件&#xff0c;添加两个新python文件apis和urls&#xff0c;其中apis是用于传输数据和解析数据 的&#xff0c;urls是用于写模板路径的。 …

数据库介绍(Mysql安装)

前言 工程师再在存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 一、什么是数据库&#xff1f; 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问题文件不利于数据查询和管理文件不利于存储海量数据文件在程序中控制不方便 数据库存储介质&#xff1a; 磁…

【UE C++】设置游戏模式

问题 我们都知道如何使用蓝图创建一个游戏模式并且在这个游戏模式蓝图中去设置“默认pawn类”、“HUD类”、“玩家控制器类”、“游戏状态类”、“玩家状态类”、“旁观者类”。那么如何使用C完成该操作呢&#xff1f; 步骤 1. 首先创建“GameMode”、“GameState”、“HUD”…

Arthas:阿里出品,线上问题快速搞定!

前面我们通过JVM线程分析及内存分析来让大家从服务器资源异常情况下排查代码问题&#xff0c;类似这种的解决方式&#xff0c;更多的是在服务器资源占用已经异常显现&#xff0c;我们就可以按照这种方式去排查和解决。 但实际工作中&#xff0c;可能会出现&#xff1a;接口的TP…

惯导中基本的目标参数及其过程量

目标参数过程量(过程噪声&#xff09;目标参数物理含义常用单位过程量物理含义过程量物理对象单位功率谱密度单位(psd)rand walk error过程量目标参数/tunitpsd(unit)^2/hzsqrt(psd)常用单位单位换算速度(m/s)加速度m/s^2m^2/s^3m/s/sqrt(s)m/s/sqrt(hr)ug/sqrt(HZ)角度(rad)角…