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: 3306
          nodePort: 30306
      selector:
        app: mysql
      type: NodePort
    
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mysql
    spec:
      serviceName: "mysql"
      replicas: 1 # 虽然您要求不要副本,但StatefulSet通常需要至少一个副本
      selector:
        matchLabels:
          app: mysql
      template:
        metadata:
          labels:
            app: mysql
        spec:
          containers:
          - name: mysql
            image: mysql:8.0.36
            env:
            - name: MYSQL_ROOT_PASSWORD
              value: "password"
            ports:
            - containerPort: 3306
              name: mysql
            volumeMounts:
            - name: mysql-config
              mountPath: /etc/mysql/conf.d
            - name: mysql-data
              mountPath: /var/lib/mysql
          volumes:
          - name: mysql-config
            hostPath:
              path: /tmp/mysql/conf.d
              type: DirectoryOrCreate
          - name: mysql-data
            hostPath:
              path: /tmp/mysql/data
              type: 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          27s
    
    NAME                     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   27s
    
    NAME                     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 - GPL
    
    Copyright (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: HTML
      profiles:
        active: dev
    
    comment.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.Driver
        url: jdbc:mysql://${MYSQL_SERVER:localhost}:${MYSQL_PORT:3306}/${MYSQL_DB_NAME_TEST:blogDB}?useUnicode=true&characterEncoding=utf-8
        username: ${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: k8sblog
      type: NodePort
      ports:
      - port: 5000
        targetPort: 5000
        nodePort: 30002
        
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: k8sblog
    spec:
      selector:
        matchLabels:
          app: k8sblog
      template:
        metadata:
          labels:
            app: k8sblog
        spec:
          hostAliases:
          - ip: "10.211.10.2"
            hostnames:
            - "art.local" # 这里是我们的私有镜像中心
          containers:
          - name: k8sblog
            image: 10.211.10.2:8081/docker-local/k8sblog:1.1
            ports:
            - containerPort: 5000
            env:
              - name: MYSQL_PORT
                value: "30306"
              - name: MYSQL_SERVER
                value: "node1.k8s"
              - name: MYSQL_DB_NAME_TEST
                value: blogDB
              - name: MYSQL_USER_TEST
                value: "root"
              - name: MYSQL_PASSWORD_TEST
                valueFrom:
                    secretKeyRef:
                      name: mysql-password-test
                      key: MYSQL_PASSWORD_TEST
          imagePullSecrets:
          - 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.mfbz.cn/a/581760.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

伪装目标检测论文阅读 SAM大模型之参数微调:Conv LoRA

paper&#xff1a;link code&#xff1a;还没公开 摘要 任意分割模型(SAM)是图像分割的基本框架。虽然它在典型场景中表现出显著的零镜头泛化&#xff0c;但当应用于医学图像和遥感等专门领域时&#xff0c;其优势就会减弱。针对这一局限性&#xff0c;本文提出了一种简单有效…

Java进阶-JavaStreamAPI的使用

本文全面介绍了 Java Stream API 的概念、功能以及如何在 Java 中有效地使用它进行集合和数据流的处理。通过详细解释和示例&#xff0c;文章展示了 Java Stream API 在简化代码、提高效率以及支持函数式编程方面的优势。文中还比较了 Java Stream API 与其他集合处理库的异同&…

Django之搭配内网穿透

一&#xff0c;安装coplar 二&#xff0c;开启8087的内网穿透 三&#xff0c;setting.py中加入如下配置&#xff1a; ALLOWED_HOSTS [*]CSRF_TRUSTED_ORIGINS ["https://localhost:8087", "http://localhost:8087"]四&#xff0c;启动项目 五&#xff…

比较美观即将跳转html源码

源码介绍 比较美观即将跳转html源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面 源码截图 比较美观的一个跳转界面&#xff0c;修改方法如上&…

MATLAB实现果蝇算法优化BP神经网络预测分类(FOA-BP)

果蝇算法&#xff08;Fruit Fly Optimization Algorithm, FFOA&#xff09;是一种启发式优化算法&#xff0c;受果蝇觅食行为的启发。将其应用于优化BP神经网络&#xff0c;主要是为了寻找BP神经网络中的最佳权重和偏置值。以下是一个基本的流程&#xff1a; 初始化&#xff1a…

Ubuntu20.04 [Ros Noetic]版本——在catkin_make编译时出现报错的解决方案

今天在新的笔记本电脑上进行catkin_make的编译过程中遇到了报错&#xff0c;这个报错在之前也遇到过&#xff0c;但是&#xff0c;我却忘了怎么解决。很是头痛&#xff01; 经过多篇博客的查询&#xff0c;特此解决了这个编译报错的问题&#xff0c;于此特地记录&#xff01;&…

【bug已解决】发生错误,导致虚拟 CPU 进入关闭状态。如果虚拟机外部发生此错误,则可能已导致物理计算机重新启动......

本bug报错已找到原因,并成功解决。 项目场景: vmware安装ubuntu报错。 如下: 发生错误,导致虚拟 CPU 进入关闭状态。如果虚拟机外部发生此错误,则可能已导致物理计算机重新启动。错误配置虚拟机、客户机操作系统中的错误或 VMware Workstation 中的问题都可以导致关闭状…

kaggle(4) Regression with an Abalone Dataset 鲍鱼数据集的回归

kaggle&#xff08;4&#xff09; Regression with an Abalone Dataset 鲍鱼数据集的回归 import pandas as pd import numpy as npimport xgboost import lightgbm import optuna import catboostfrom sklearn.model_selection import train_test_split from sklearn.metrics …

C++之list模拟实现

1、定义 定义一个结点&#xff1a; 在list类中的定义&#xff1a; 2、push_back() 3、迭代器 3.1迭代器的构造和定义 3.2、迭代器中的取值 3.3、迭代器的迭代(前置或前置--) 3.4、迭代器的迭代(后置或后置--) 3.5、迭代器的判断 3.6、在类list的定义 4.begin()和end() 5.con…

Nodejs 第六十九章(杀毒)

杀毒 杀毒&#xff08;Antivirus&#xff09;是指一类计算机安全软件&#xff0c;旨在检测、阻止和清除计算机系统中的恶意软件&#xff0c;如病毒、蠕虫、木马、间谍软件和广告软件等。这些恶意软件可能会对计算机系统和用户数据造成损害&#xff0c;包括数据丢失、系统崩溃、…

⑥ - 后端工程师通识指南

&#x1f4d6; 该文隶属 程序员&#xff1a;职场关键角色通识宝典 ✍️ 作者&#xff1a;哈哥撩编程&#xff08;视频号同名&#xff09; 博客专家全国博客之星第四名超级个体COC上海社区主理人特约讲师谷歌亚马逊演讲嘉宾科技博主极星会首批签约作者 &#x1f3c6; 推荐专栏…

windows下git提交修改文件名大小写提交无效问题

windows系统不区分大小写&#xff0c;以及git提交忽略大小写&#xff0c;git仓库已存在文件A.js&#xff0c;本地修改a.js一般是没有提交记录的&#xff0c;需要手动copy一份出来A.js&#xff0c;再删除A.js文件提交仓库删除后&#xff0c;再提交修改后的a.js文件。 windows决…

岚图汽车与东软睿驰签署战略合作协议

4月26日,东软睿驰与岚图汽车正式签署战略合作协议,双方将结合在各自领域拥有的产业资源、技术研发和资本运作等优势,聚焦智能化产品和应用,建立长期共赢的战略合作伙伴关系,通过不断探索未来新技术、新产业、新业态和新模式,围绕用户需求共同打造极致的智能出行体验。 图为岚图…

【AIGC调研系列】llama3微调具体案例

Llama3的微调可以通过多种方式进行&#xff0c;具体案例包括&#xff1a; 使用XTuner进行微调&#xff0c;尝试让Llama3具有"它是SmartFlowAI打造的人工智能助手"的自我认知。这涉及到准备自我认知训练数据集&#xff0c;并通过脚本生成数据[2][8]。利用Unsloth和Go…

GD32E103C8T6 封装LQFP-48 GigaDevice(兆易创新) 单片机

GD32E103C8T6 是由GigaDevice&#xff08;兆易创新&#xff09;公司生产的一款基于ARM Cortex-M4内核的32位MCU&#xff08;微控制器&#xff09;。以下是GD32E103C8T6的一些主要功能和参数介绍&#xff1a; 主要功能&#xff1a; 高性能ARM Cortex-M4内核: 采用120MHz的ARM …

求解素数环问题

注&#xff1a;这里我的代码是以第一位为最大数n为首元素不动的 思路&#xff1a; 首先我们分析问题要以较小规模的样例进行分析&#xff0c;例如n3时 第一步&#xff1a;深入搜索 我们先不管后面怎么样&#xff0c;当前的首要目标是先确定第一个元素的值&#xff0c;可知有…

paddlehub的简单应用

1、下载安装 pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple 报错&#xff1a; Collecting onnx<1.9.0 (from paddle2onnx>0.5.1->paddlehub)Using cached https://pypi.tuna.tsinghua.edu.cn/packages/73/e9/5b953497c0e36df589fc60cc6c6b35…

Java中集合概述(补充ing)

一、集合分类 Java中的集合框架提供了多种类型的集合&#xff0c;主要分为两大类&#xff1a;单列集合&#xff08;只保存单一类型的对象&#xff09;和双列集合&#xff08;保存具有键值对关系的对象&#xff09;。下面对这些集合进行分类介绍&#xff0c;但由于源码分析会涉…

开源相机管理库Aravis例程学习(五)——camera-api

开源相机管理库Aravis例程学习&#xff08;五&#xff09;——camera-api 简介例程代码函数说明arv_camera_get_regionarv_camera_get_pixel_format_as_stringarv_camera_get_pixel_formatARV_PIXEL_FORMAT_BIT_PER_PIXEL 简介 本文针对官方例程中的&#xff1a;03-camera-api…

沉浸式翻译 chrome 插件 Immersive Translate - Translate Website PDF

免费翻译网站&#xff0c;翻译PDF和Epub电子书&#xff0c;双语翻译视频字幕 &#x1f4e3; 网络上口碑爆炸的网站翻译扩展工具【沉浸式翻译】⭐⭐⭐⭐⭐ &#x1f4bb; 功能特点如下&#xff1a; &#x1f4f0; 网站翻译 &#x1f680; 提供双语网站翻译&#xff0c;智能识…
最新文章