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

server/2024/9/23 4:14:42/

使用 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.ppmy.cn/server/28987.html

相关文章

基于免疫粒子群算法的考虑负荷需求相应的热电联供系统优化调度(MATLAB实现)

1.研究背景 随着“双碳”战略的提出&#xff0c;各种分布式能源的开发和利用收到越来越多的重视。冷热电联供(Combined Cooling Heating and Power, CCHP)系统在发电的同时可以将燃气轮机产生的废热用于制热或制冷&#xff0c;实现能量的梯级利用&#xff0c;并减少系统的污染气…

使用jdbc方式操作ClickHouse

1、创建测试表&#xff0c;和插入测试数据 create table t_order01(id UInt32,sku_id String,total_amount Decimal(16,2),create_time Datetime ) engine MergeTreepartition by toYYYYMMDD(create_time)primary key (id)order by (id,sku_id);insert into t_order01 values …

【webrtc】MessageHandler 9: 基于线程的消息处理:执行Port销毁自己

Port::Port 构造的时候,就触发了一个异步操作,但是这个操作是要在 thread 里执行的,因此要通过post 消息 MSG_DESTROY_IF_DEAD 到thread跑:port的创建并米有要求在thread中 但是port的析构却在thread里 这是为啥呢?

【右一的实操记录】全导航,持续更新...

文章目录 &#x1f4da;大数据管理与分析【实验】&#x1f4da;数据结构【实验】&#x1f4da;机器学习【实验】&#x1f4da;大数据安全【实验】&#x1f4da;信息检索【实验】&#x1f4da;爬虫【小实践】&#x1f4da;AIGC&#x1f4da;杂货铺 大部分是和电子笔记对应的实验…

【研发管理】产品经理知识体系-产品设计与开发工具

导读&#xff1a;产品设计与开发工具的重要性体现在多个方面&#xff0c;它们对于产品的成功开发、质量提升以及市场竞争力都具有至关重要的影响。产品设计工具可以帮助设计师更高效地创建和优化产品原型。开发工具在产品开发过程中发挥着至关重要的作用。产品设计与开发工具还…

2023 广东省大学生程序设计竞赛(部分题解)

目录 A - Programming Contest B - Base Station Construction C - Trading D - New Houses E - New but Nostalgic Problem I - Path Planning K - Peg Solitaire A - Programming Contest 签到题&#xff1a;直接模拟 直接按照题目意思模拟即可&#xff0c;为了好去…

多网卡按进程或目标IP指定使用特定网卡

某些场景下&#xff0c;电脑上有多张网卡&#xff0c;且不同网卡用途不一&#xff0c;默认情况下电脑只会优先使用其中一张。比如一张内网网卡&#xff0c;一张外网网卡&#xff0c;无法同时能上内网和外网。 之前尝试了很多方法都不可行&#xff1a; 1、手动指定路由&#x…

机器学习——过拟合

优质博文&#xff1a;IT-BLOG-CN 一、过拟合得表现 模型在训练过程中&#xff0c;除了会出现过拟合现象&#xff0c;还有可能出现欠拟合的情况。相比而言&#xff0c;后者通常发生在建模前期&#xff0c;只要做好特征工程一般可以解决模型欠拟合问题。下图描述了模型在训练数据…