【实战】K8S集群部署nacos并接入Springcloud项目容器化运维
文章目录
- 前言
- Nacos集群搭建
- Spring cloud配置nacos
- 将Springcloud项目部署在k8s
- 写在最后
前言
相信很多同学都开发过以微服务为架构的系统,开发微服务必不可少要使用注册中心,比如nacos\consul等等。当然在自动化运维流行的今天,我们也会将注册中心部署在k8s集群中。今天我们就分享一期使用helm部署nacos到k8s集群并接入soringcloud项目,各位大大敬请鉴赏。值得注意的是使用helm在k8s部署中间件应用,真的比原始部署简单太多。
Nacos集群搭建
首先我们先从官网把nacos helm相关的代码down下来
git clone https://github.com/nacos-group/nacos-k8s.git
然后进入到helm目录,修改values.yaml文件,下面是我的:
# Default values for nacos.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.global:#mode: standalonemode: cluster############################nacos###########################
namespace: nacos-cluster ## 命名空间
nacos:image:repository: nacos/nacos-servertag: latestpullPolicy: IfNotPresentplugin:enable: trueimage:repository: nacos/nacos-peer-finder-plugintag: 1.1pullPolicy: IfNotPresentreplicaCount: 3 ## 节点数podManagementPolicy: ParalleldomainName: cluster.localpreferhostmode: hostnameserverPort: 8848health:enabled: truestorage:#type: embedded type: mysql ## 用mysql保存配置信息db:host: mysql-cluster-primary.mysql-cluster.svc.cluster.localname: nacosport: 3306username: rootpassword: 123456rootparam: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=trueservice:#type: ClusterIPtype: NodePortport: 8848nodePort: 30000############################nacos###########################
接着我们来安装nacos,如下所示:
#数据库增加nacos库
#创建命名空间
[root@master helm]# kubectl create ns nacos-cluster
namespace/nacos-cluster created
#安装nacos
[root@master helm]# helm install nacos-cluster -n nacos-cluster .
NAME: nacos-cluster
LAST DEPLOYED: Tue Sep 5 10:16:46 2023
NAMESPACE: nacos-cluster
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
- Get the application URL by running these commands:
export NODE_PORT= ( k u b e c t l g e t − − n a m e s p a c e n a c o s − c l u s t e r − o j s o n p a t h = " . s p e c . p o r t s [ 0 ] . n o d e P o r t " s e r v i c e s n a c o s − c s ) e x p o r t N O D E I P = (kubectl get --namespace nacos-cluster -o jsonpath="{.spec.ports[0].nodePort}" services nacos-cs) export NODE_IP= (kubectlget−−namespacenacos−cluster−ojsonpath=".spec.ports[0].nodePort"servicesnacos−cs)exportNODEIP=(kubectl get nodes --namespace nacos-cluster -o jsonpath=“{.items[0].status.addresses[0].address}”)
echo http:// N O D E I P : NODE_IP: NODEIP:NODE_PORT/nacos - MODE:
standalone: you need to modify replicaCount in the values.yaml, .Values.replicaCount=1
cluster: kubectl scale sts nacos-cluster-nacos --replicas=3
#重新部署 的命令是 helm upgrade nacos-cluster -n nacos-cluster .
安装好了之后,我们查看控制台显示是不是安装好了,如下所示:
[root@master helm]# kubectl get pods,svc -n nacos-cluster
NAME READY STATUS RESTARTS AGE
pod/nacos-cluster-0 0/1 Running 0 67s
pod/nacos-cluster-1 0/1 Running 0 67s
pod/nacos-cluster-2 0/1 Running 0 67s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nacos-cs NodePort 10.98.1.221 8848:30040/TCP,9848:31784/TCP,9849:30165/TCP,7848:30000/TCP 67s
service/nacos-hs ClusterIP None 8848/TCP,9848/TCP,9849/TCP,7848/TCP
很显然安装成功了!然后我们获取一下ip和port
[root@node2 ~]# export NODE_PORT=$(kubectl get --namespace nacos-cluster -o jsonpath="{.spec.ports[0].nodePort}" services nacos-cs)export NODE_IP=$(kubectl get nodes --namespace nacos-cluster -o jsonpath="{.items[0].status.addresses[0].address}")echo http://$NODE_IP:$NODE_PORT/nacos[root@node2 ~]# export NODE_IP=$(kubectl get nodes --namespace nacos-cluster -o jsonpath="{.items[0].status.addresses[0].address}")
http://10.10.22.91:31673/nacos
这里说明一下,因为nacos ui是通过http协议访问的,而且8848端口是提供web访问的,所以这里的8848对外的端口就是31673,然后我们在浏览器中输入:xxx.xxx.xxx.xxx:31673就可以访问了,如下所示:
Spring cloud配置nacos
nacos安装成功之后,我们可以在springcloud中配置并使用,下面是我的配置步骤:
1、引入依赖包
<modelVersion>4.0.0</modelVersion>
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>k8s-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>k8s-demo</name>
<description>Demo project for Spring Boot</description>
<properties><java.version>8</java.version><spring-cloud.version>Hoxton.SR10</spring-cloud.version>
</properties><!-- nacos start -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2.2.3.RELEASE</version>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.3.RELEASE</version>
</dependency>
<!-- nacos end --><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
2、配置启动类
/*** K8sDemoApplication* @return a* @author senfel* @date 2023/9/5 15:02*/
@SpringBootApplication
@EnableDiscoveryClient
public class K8sDemoApplication {public static void main(String[] args) {SpringApplication.run(K8sDemoApplication.class, args);}}
3、配置bootstrap.yaml
注意,nacos在springcloud中对应的端口是暴露外网端口30040
server:port: 9999
spring:application:name: test-demoprofiles:active: devredis:host: 10.10.22.91port: 30617password: 123456pwtimeout: 5000database: 0jedis:pool:max-active: 1000max-idle: 50min-idle: 4cloud:nacos:config:server-addr: 10.10.22.82:30040,10.10.22.91:30040,10.10.22.199:30040username: nacospassword: nacosfile-extension: yamldiscovery:server-addr: 10.10.22.82:30040,10.10.22.91:30040,10.10.22.199:30040username: nacospassword: nacos
设置完成启动正常。
注意:如果新增配置报参数异常
1.删掉config_info 和 his_config_info 表中的encrypted_data_key字段
2.config_info 和 his_config_info 表中非空encrypted_data_key字段设置为可以为空
将Springcloud项目部署在k8s
在上述配置的基础上
在k8s集群中用域名进行配置
server:port: 9999
spring:application:name: test-demoprofiles:active: devredis:host: 10.10.22.91port: 30617password: 123456pwtimeout: 5000database: 0jedis:pool:max-active: 1000max-idle: 50min-idle: 4cloud:nacos:config:server-addr: nacos-cs.nacos-cluster.svc.cluster.local:8848username: nacospassword: nacosfile-extension: yamldiscovery:server-addr: nacos-cs.nacos-cluster.svc.cluster.local:8848username: nacospassword: nacos
注意:headless 服务没有负载均衡,一般集群我们都访问普通svc
增加配置:
pom.xml
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
启动类开启feign client
@EnableFeignClients
增加测试feign代码
DemoService
/*** test feign* @author senfel* @version 1.0* @date 2023/9/5 16:18*/
@Service
@FeignClient(value = "k8s-demo",fallback = FailDemoService.class)
public interface DemoService {/*** test feign*/@GetMapping("/feign")String feign(@RequestParam String str);
}
FailDemoService
/*** FailDemoService* @author senfel* @version 1.0* @date 2023/9/5 16:20*/
@Slf4j
@Service
public class FailDemoService implements DemoService {@Overridepublic String feign(String str) {log.error("调用feign传入参数{},已降级。",str);return null;}
}
AppController
/*** AppController {* @author senfel* @version 1.0* @date 2023/9/5 16:25*/
@Slf4j
@RestController
public class AppController {@Value("${app.name}")private String appName;@Resourceprivate DemoService demoService;/*** getRedisValueByKey* @param key* @author senfel* @date 2023/8/31 16:22* @return java.lang.String*/@GetMapping("/getRedisValueByKey")public String getRedisValueByKey(String key){try{if(null == key){return null;}String str = RedisUtil.getString(key);log.error("获取redis中key:{}的数据为:{}",key,str);log.error("测试nacos配置,app.name:{}",appName);str = "redis-"+key+":"+str+",nacos-appName:"+appName;//调用feignString feign = demoService.feign(str);return feign;}catch (Exception e){e.printStackTrace();return e.getMessage();}}/*** feign* @param str* @author senfel* @date 2023/9/5 16:26* @return java.lang.String*/@GetMapping("feign")public String feign(@RequestParam String str){try{InetAddress address = InetAddress.getLocalHost();System.out.println(address.getHostName());//主机名System.out.println(address.getCanonicalHostName());//主机别名System.out.println(address.getHostAddress());//获取IP地址}catch (Exception e){e.printStackTrace();}return str+"-feign-success";}
}
制作app镜像
Dockerfile
# version 1.0
# 基础镜像
FROM openjdk:8-jre
# 维护人
MAINTAINER senfel<187@sina.cn>
# 创建目录
RUN mkdir -p /home/app
# 拷贝项目jar
COPY ./target/k8s-demo-0.0.1-SNAPSHOT.jar /home/app/app.jar
# 执行命令启动jar
ENTRYPOINT ["java","-jar","/home/app/app.jar"]
# 暴露端口
EXPOSE 9999
将本地jar打包成镜像并提交到云仓库
docker build -t k8s-demo-nacos:v1.0.0 .
编写kube执行文件
kube-k8s-demo-nacos.yaml
apiVersion: apps/v1
kind: Deployment # 声明一个Deployment资源对象
metadata:name: deployment-myapp
spec:replicas: 3 # 通过replicas声明pod个数是3selector: # 通过标签选择被控制的podmatchLabels:app: myapptemplate: # 在template中定义podmetadata:labels: # 给pod打上标签app=myappapp: myappspec:containers:- name: myapp # 声明容器名称,注意不是pod名称,pod名称应该定义在metadata中image: registry.cn-hangzhou.aliyuncs.com/senfel/k8s-demo-nacos:v1.0.0ports:- name: httpcontainerPort: 9999
--- # 在一个yaml文件中通过---分割多个资源对象
apiVersion: v1
kind: Service # 声明一个Service资源对象
metadata:name: service-myapp
spec:type: NodePortselector: # service-myapp将选择标签包含app=myapp的podapp: myappports:- name: httpport: 9999 # Service监听端口targetPort: 9999 # 转发到后端Pod的端口号protocol: TCP # tcp协议nodePort: 30999 # 外网访问端口,范围:30000-32767
执行kube
kubectl apply -f kube-k8s-demo-nacos.yaml
查看执行结果
[root@master k8s]# kubectl get pods,svc | grep app
pod/deployment-myapp-9c6fb8dd9-jvmwl 1/1 Running 0 14m
pod/deployment-myapp-9c6fb8dd9-z64zj 1/1 Running 0 14m
pod/deployment-myapp-9c6fb8dd9-zklpc 1/1 Running 0 14m
service/service-myapp NodePort 10.102.62.181 9999:30999/TCP 14m
#删除pod svc
kubectl delete -f kube-k8s-demo-nacos.yaml
查看nacos情况
配置列表:
服务集群:
测试app集群是否正常服务
posman测试
写在最后
在k8s中部署nacos还是使用helm比较简单,直接下载安装包修改配置文件安装即可。我们在Springcloud、Springboot项目中集成nacos需要注意需要使用集群内部地址,当我们将项目部署在k8s集群中可以直接使用nacos配置和查询服务集群。
相关文章:

【实战】K8S集群部署nacos并接入Springcloud项目容器化运维
文章目录 前言Nacos集群搭建Spring cloud配置nacos将Springcloud项目部署在k8s写在最后 前言 相信很多同学都开发过以微服务为架构的系统,开发微服务必不可少要使用注册中心,比如nacos\consul等等。当然在自动化运维流行的今天,我们也会将注…...

prometheus监控zookeeper方案
这里要求zookeeper版本必须达到3.6或以上,用的是官方自带的监控信息。 官方下载地址 https://zookeeper.apache.org/releases.html#download 然后在zookeeper的配置文件,比如zoo.cfg最后面加上这一段 metricsProvider.classNameorg.apache.zookeeper.…...

智能照明控制系统的优点有哪些
智能照明控制系统在会展中心中应用的功能和优点: 1实现照明控制智能化 在使用智能照明控制系统之后,能够将系统工作在全自动的状态下,系统能够预先设置好若干个基本切换状态,并且还能够根据预先设定的时间自动的在展馆各种工作状…...

Cent OS 安装 vmware tools
一、先挂载iso镜像 二、使用blkid命令,可看到/dev/sr0 blkid 创建一个目录并挂载cdrom mkdir /mnt/cdrom mount -t iso9660 /dev/cdrom /mnt/cdrom/ 挂载完成后,在/mnt/cdrom/目录即可看到一个.tar.gz的包VMwareTools-10.1.7-5541682.tar.gz&#x…...

写一个关于RN的分秒毫秒组件(组件状态由同一个父组件控制)
介绍一下,就一个界面会一直跑时间,项目有个需求需要用到毫秒级计时器,那我肯定想到用组件了塞,但是组件的状态和组件的数据都是不互通的都是独立的,因此我写了下面这个组件,组件的状态会由父组件控制切记,必须是同一个父组件,因为状态是父组件控制的&…...

javascript中字符串处理,常用的方法汇总
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属专栏:前端泛海 景天的主页:景天科技苑 文章目录 字符串对象的的相关方法1.获取字符串长度 length2.通过索引获取元素 …...

STM32CubeMX学习笔记14 ---SPI总线
1. 简介 1.1 SPI总线介绍 SPI 是英语Serial Peripheral interface的缩写,顾名思义就是串行外围设备接口。是Motorola(摩托罗拉)首先在其MC68HCXX系列处理器上定义的。 SPI,是一种高速的,全双工,同步的通信总线,并且在…...

Gson(List<Object>转String 、String转List<Object>)
要在Java项目中使用Gson库,你需要添加相应的依赖项。以下是在Maven项目的pom.xml文件中添加Gson依赖的示例: <dependencies><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId>&l…...

uniapp路由跳转的方式
1. uniapp路由跳转的方式 1.1. uni.navigateTo保留当前页面,跳转到应用内的某个页面,使用uni.navigateBack可以返回到原页面。 uni.navigateTo({url:./index/index });注意: (1)页面跳转路径有层级限制,不…...

使用Python模拟绘制自由落体运动过程中的抛物线
目录 一、引言 二、自由落体运动的基本原理 三、使用Python模拟自由落体运动 四、扩展功能:添加速度曲线和动画效果 五、总结与展望 一、引言 自由落体运动是物理学中最基础的运动形式之一,它描述了一个物体在仅受重力作用下的运动轨迹。在这个…...

批量爬取网站图片脚本
不分文件夹 import requests from bs4 import BeautifulSoup import os from concurrent.futures import ThreadPoolExecutordef download_image(img_url):# 检查图片后缀是否为.jpg或.jpegif img_url.lower().endswith((.jpg, .jpeg)):try:img_response requests.get(img_ur…...

scrapy 爬虫:多线程爬取去微博热搜排行榜数据信息,进入详情页面拿取第一条微博信息,保存到本地text文件、保存到excel
如果想要保存到excel中可以看我的这个爬虫 使用Scrapy 框架开启多进程爬取贝壳网数据保存到excel文件中,包括分页数据、详情页数据,新手保护期快来看!!仅供学习参考,别乱搞_爬取贝壳成交数据c端用户登录-CSDN博客 最终…...

网络、UDP编程
1.网络协议模型: OSI协议模型 应用层 实际发送的数据 表示层 发送的数据是否加密 会话层 是否建立会话连接 传输层 数据传输的方式(数据报、流式) 网络层 …...

VSCode安装与使用
1、下载地址:Documentation for Visual Studio Code 在 VS Code 中使用 Python - 知乎 (zhihu.com) 自动补全和智能感知检测、调试和单元测试在Python环境(包括虚拟环境和 conda 环境)之间轻松切换 在 VS Code 中安装插件非常的简单,只需要打开 VS Code…...

进程和线程的区别与联系
进程和线程是计算机系统中两个重要的概念,它们在操作系统中扮演着不同的角色,并有着不同的特点和用途。以下是详细信息: 进程。进程是操作系统中资源分配的基本单位,它包括程序、数据和进程控制块。每个进程都有自己的地址空间&a…...

6、Redis-KV设计、全局命令和安全性
目录 一、value设计 二、Key设计 三、全局命令——针对所有key 四、安全性 一、value设计 ①是否需要排序?需要:Zset ②需要缓存的数据是单个值还是多个值? 单个值:简单值---String;对象值---Hash多个值&#x…...

python之海龟绘图
海龟绘图(turtle)是一个Python内置的绘图库,也被称为“Turtle Graphics”或简称“Turtles”。它采用了一种有趣的绘图方式,模拟一只小海龟在屏幕上爬行,而小海龟爬行的路径就形成了绘制的图形。这种绘图方式最初源自20…...

Java实战:Spring Boot 实现异步记录复杂日志
日志记录是软件开发中非常重要的一环,它可以帮助我们快速定位问题、监控程序运行状态等。在 Spring Boot 应用中,异步记录日志是一种常见的需求。本文将详细介绍如何在 Spring Boot 中实现异步记录复杂日志,包括异步日志的基本原理、实现方式…...

“色狼”用英语怎么说?柯桥日常英语,成人英语口语学习
最近有粉丝问我"色狼"英文翻译是啥 首先声明不是"colour wolf"哈 关于“色狼”的英文表达有很多 快和C姐一起来看看吧! 1.pervert 这个单词的意思是变态、色狼 是对性变态者最直观的描述 He is such a pervert! I saw him lo…...

Docker前后端项目部署
目录 一、搭建项目部署的局域网 二、redis安装 三、MySQL安装 四、若依后端项目搭建 4.1 使用Dockerfile自定义镜像 五、若依前端项目搭建 一、介绍前后端项目 一张图带你看懂ruoyi的前后端项目部署 得出结论:需要4台服务器,都处于同一个局域网中…...

如何快速的搭建一个小程序
要快速搭建一个小程序,你可以按照以下步骤进行: 明确目标和需求:在开始搭建小程序之前,首先明确你的小程序的主要功能、目标用户以及希望实现的业务需求。这将帮助你更好地规划和设计小程序。选择小程序平台:根据你的…...

STM32自学☞AD多通道
涉及到的硬件有:光敏传感器,热敏传感器,红外对射传感器,电位器 通过adc将他们采集的模拟信号转换为数值 ad.c文件 #include "stm32f10x.h" #include "stm32f10x_adc.h" #include "ad.h" #inc…...

微服务之商城系统
一、商城系统建立之前的一些配置 1、nacos Nacos是一个功能丰富的开源平台,用于配置管理、服务发现和注册、健康检查等,帮助构建和管理分布式系统。 在linux上安装nacos容器的命令: docker run --name nacos-standalone -e MODEstandalone …...

安卓玩机工具推荐----高通芯片9008端口读写分区 备份分区 恢复分区 制作线刷包 工具操作解析
上期解析了下adb端口备份分区的有关操作 安卓玩机工具推荐----ADB状态读写分区 备份分区 恢复分区 查看分区号 工具操作解析 在以往的博文中对于高通芯片机型的分区读写已经分享了很多。相关类似博文 安卓备份分区----手动查询安卓系统分区信息 导出系统分区的一些基本操作 …...

全量知识系统问题及SmartChat给出的答复 之16 币圈生态链和行为模式
Q.42 币圈生态链和行为模式 我认为,上面和“币”有关的一系列概念和技术,按设计模式的划分 ,整体应该都属于行为模式,而且应该囊括行为模式的所有各个方面。 而行为又可以按照三种不同的导向(以目的或用途为导向、过…...

【MOMO_Tips】批量将word转换为PDF格式
批量将word转换为PDF格式 1.打开文件–>选项–>自定义功能区–>开发工具–>确定 2.点开开发工具,选择第一个visual basic 3.进入页面后找到插入–>模块,就可以看到这样的画面之后将下列vba代码复制粘贴到模块中 Sub ConvertWordsToPd…...

【JSON2WEB】08 Amis的事件和校验
【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…...

抖店类目报白什么意思?什么类目需要报白?这次给你讲明白!
我是电商珠珠 不少新手在选择类目的时候,有些类目却无法选择,系统显示需要报白才可以。那什么是报白?怎么报白?今天我就一次性给你们讲清楚。 抖店类目报白什么意思? 根据官方的说法,报白就是针对一些比…...

<C++>【继承篇】
✨前言✨ 🎓作者:【 教主 】 📜文章推荐: ☕博主水平有限,如有错误,恳请斧正。 📌机会总是留给有准备的人,越努力,越幸运! 💦导航助手…...

size_t 和double相乘怎么转换size_t
在C中,size_t和double可以直接相乘,结果会自动转换为double类型。如果你想要得到的结果是size_t类型,你需要进行显式类型转换。但是要注意,double转size_t可能会丢失小数部分,只保留整数部分。 以下是一个例子&#x…...