【实战】K8S集群部署nacos并接入Springcloud项目容器化运维

news2025/6/3 23:39:25

文章目录

    • 前言
    • 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: standalone
   mode: cluster

############################nacos###########################
namespace: nacos-cluster  ## 命名空间
nacos:
  image:
    repository: nacos/nacos-server
    tag: latest
    pullPolicy: IfNotPresent
  plugin:
    enable: true
    image:
      repository: nacos/nacos-peer-finder-plugin
      tag: 1.1
      pullPolicy: IfNotPresent
  replicaCount: 3 ## 节点数
  podManagementPolicy: Parallel
  domainName: cluster.local
  preferhostmode: hostname
  serverPort: 8848
  health:
    enabled: true
  storage:
    #type: embedded  
    type: mysql  ## 用mysql保存配置信息
    db:
      host: mysql-cluster-primary.mysql-cluster.svc.cluster.local
      name: nacos
      port: 3306
      username: root
      password: 123456root
      param: characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true


service:
  #type: ClusterIP
  type: NodePort
  port: 8848
  nodePort: 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:

  1. 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= (kubectlgetnamespacenacosclusterojsonpath=".spec.ports[0].nodePort"servicesnacoscs)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
  2. 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-demo
  profiles:
    active: dev
  redis:
    host: 10.10.22.91
    port: 30617
    password: 123456pw
    timeout: 5000
    database: 0
    jedis:
      pool:
        max-active: 1000
        max-idle: 50
        min-idle: 4
  cloud:
    nacos:
      config:
        server-addr: 10.10.22.82:30040,10.10.22.91:30040,10.10.22.199:30040
        username: nacos
        password: nacos
        file-extension: yaml
      discovery:
        server-addr: 10.10.22.82:30040,10.10.22.91:30040,10.10.22.199:30040
        username: nacos
        password: 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-demo
  profiles:
    active: dev
  redis:
    host: 10.10.22.91
    port: 30617
    password: 123456pw
    timeout: 5000
    database: 0
    jedis:
      pool:
        max-active: 1000
        max-idle: 50
        min-idle: 4
  cloud:
    nacos:
      config:
        server-addr: nacos-cs.nacos-cluster.svc.cluster.local:8848
        username: nacos
        password: nacos
        file-extension: yaml
      discovery:
        server-addr: nacos-cs.nacos-cluster.svc.cluster.local:8848
        username: nacos
        password: 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 {

    @Override
    public 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;

    @Resource
    private 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;
            //调用feign
            String 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个数是3
  selector:   # 通过标签选择被控制的pod
    matchLabels:
      app: myapp
  template:   # 在template中定义pod
    metadata:
      labels: # 给pod打上标签app=myapp
        app: myapp
    spec:
      containers:
        - name: myapp  # 声明容器名称,注意不是pod名称,pod名称应该定义在metadata中
          image: registry.cn-hangzhou.aliyuncs.com/senfel/k8s-demo-nacos:v1.0.0
          ports:
            - name: http
              containerPort: 9999
--- # 在一个yaml文件中通过---分割多个资源对象
apiVersion: v1
kind: Service # 声明一个Service资源对象
metadata:
  name: service-myapp
spec:
  type: NodePort
  selector: # service-myapp将选择标签包含app=myapp的pod
    app: myapp
  ports:
    - name: http
      port: 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配置和查询服务集群。

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

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

相关文章

『操作系统OS笔记』MAC(m1芯片)电脑安装FFmpeg

MAC(m1芯片)电脑安装FFmpeg mac电脑安装ffmpeg两种方法 文章目录 1. brew安装FFmpeg2. 官网下载FFmpeg压缩包3. 使用FFmpeg将音频和视频合并 1. brew安装FFmpeg brew install ffmpeg # 需要等比较久的时间&#xff0c;安装很多东西&#xff0c;安装过程中如果遇到报错对应解决…

Unity性能优化篇(十二) 音频优化之导入音频后的属性设置

Unity支持后缀为.wav、.ogg、.mp3的音频文件&#xff0c;但建议使用.wav&#xff0c;因为Unity对它的支持特别好。 注意&#xff1a;Unity在构建项目时总是会自动重新压缩音频文件&#xff0c;因此无需刻意提前压缩一个音频文件再导入Unity&#xff0c;因为这样只会降低该音频文…

C++性能优化 —— TCMalloc的原理与使用

一、TCMalloc简介 1、TCMalloc简介 TCMalloc(Thread-Caching Malloc&#xff0c;线程缓存的malloc&#xff09;是Google开发的内存分配算法库&#xff0c;最初作为Google性能工具库 perftools 的一部分&#xff0c;提供高效的多线程内存管理实现&#xff0c;用于替代操作系统…

进制之间的转换

文章目录 编译过程进制转换1、进制的概念1.1 二进制1.2 八进制1.3 十六进制 进制在程序中的表现方式十进制转二进制将十进制转换成二进制&#xff08;除2反序取余法&#xff09;二进制转十进制&#xff08;权值法&#xff09; 八进制转十进制将十进制转换成八进制(除8反序取余法…

JAVA方法概述

一.方法的定义 public class MethodDemo1 {public static void main(String[] args) {// 目标&#xff1a;掌握定义方法的完整格式&#xff0c;搞清楚使用方法的好处// 需求&#xff1a;假如现在很多程序员都要进行2个整数求和的操作// 王程序员int rs sum(10,20);System.out.…

哪款洗地机值得买?希亦、追觅、米博、美的谁才是行业标杆?

在家庭清洁中&#xff0c;最让我们苦恼的便是厨房垃圾了&#xff0c;油渍跟食物残渣&#xff0c;用扫把扫了后&#xff0c;要反反复复的湿拖五六次&#xff0c;期间不停的手洗拖把&#xff0c;这套流程下来&#xff0c;往往容易腰酸背痛&#xff0c;手指皱巴巴的&#xff0c;这…

Docker 配置阿里云镜像加速器

一、首先需要创建一个阿里云账号 二、登录阿里云账号 三、进入控制台 四、搜索容器镜像服务&#xff0c;并选择 五、选择镜像工具中的镜像加速 六 、配置镜像源 注意&#xff1a;有/etc/docker文件夹的直接从第二个命令开始

Stable Diffusion 提示词语法(Prompt)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 大家好&#xff0c;我是水滴~~ 本篇文章主要讲述 Stable Diffusion 提示词语法&#xff0c;主要包括&#xff1a;提示词的概念、提示词的长度、权重、分步绘制、交替绘制、组合绘制等&#x…

品鉴民俗 巧手绘梦--2024年海淀区元宵节主题文化活动圆满举办

为深入挖掘传统节日的文化内涵和历史意义,引导人民群众弘扬中华优秀文化和传统美德,让广大群众过一个热热闹闹、红红火火、充满文化气息的元宵佳节,2024年2月24日上午,由北京市海淀区文化和旅游局主办、海淀区文化馆承办的“品鉴民俗 巧手绘梦”——2024年海淀区元宵节主题文化…

● 121. 买卖股票的最佳时机 ● 122.买卖股票的最佳时机II

● 121. 买卖股票的最佳时机 因为只能买卖一次&#xff0c;所以左边找一个最小的&#xff0c;右边找一个最大的&#xff0c;相减的差就是最大的利润。那么用贪心来做&#xff1a; class Solution { public:int maxProfit(vector<int>& prices) {int nprices.size()…

在 echarts 的 rich 中使用 iconfont 图标库图标作为 backgroundColor.image 值的方法

实现步骤 1、引入 iconfont.js。该脚本执行时&#xff0c;会在 body 下插入一个 svg 标签&#xff0c;标签下包含了图标库中的 svg 图标 path。 <script src"your/iconfont/path/iconfont.js"></script>或者 import your/iconfont/path/iconfont.js2、…

如何禁止员工在上班时间利用电脑打游戏逛娱乐网站?

在现代化的工作环境中&#xff0c;电脑已成为员工日常工作的必需品。然而&#xff0c;一些员工可能在上班时间利用电脑进行非工作相关的活动&#xff0c;如打游戏或浏览娱乐网站。这不仅影响个人的工作效率&#xff0c;也可能对团队的整体绩效和公司的文化产生负面影响。因此&a…

饮料换购 刷题笔记

直接开个计数器mask 每当饮料现存数-1&#xff1b; cnt;且mask; 一旦mask达到3 饮料现存数 计数器清零3 代码 #include <iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int main(){ int n; …

火爆全网,软件测试数据库常用 SQL 语句总结,你要的我都有......

前言 直接上干货 数据定义语言(DDL) 主要负责数据库、数据表、视图、键、索引等结构化的操作 常用的语句有&#xff1a;CREATE DATABASE、CREATE TABLE、ALTER TABLE等 字段的常用约束有&#xff1a;PRIMARY KEY、FOREIGN KEY、NOT NULL、UNIQUE、AUTO_INCREMENT、DEFAULT 常…

使用nginx输入端口号显示404

输入对应的端口号显示404 先检查当前nginx文件夹的路径是没有中文的查看是否没有开启nginx&#xff1a;ctrlaltdelete打开任务管理器&#xff0c;看看有没有nginx.exe进程&#xff08;一般是有两个进程&#xff09;如果没有进程说明没有打开nginx&#xff0c;查看端口号是否被…

菜鸟笔记-14散点图标记形状

大家在学习Python科研绘图中&#xff0c;总会涉及散点图标记形状&#xff0c;为了方便大家学习应用&#xff0c;博主通过学习搜集&#xff0c;将这部分技巧总结如下。 14.1默认散点图 14.1.1图像呈现 14.1.2绘图代码 import numpy as np # 导入numpy库&#xff0c;用于处理…

创建RAID0,RAID5并管理,热备盘,模拟故障

目录 1. RAID介绍以及mdadm安装 1.1 安装mdadm工具 2. 创建raid0 2.1 环境准备 2.2 使用两个磁盘创建RAID0 2.3 查看RAID0信息 2.4 对创建的RAID0进行格式化并挂载 2.5 设置成开机挂载 2.6 删除RAID0 3. 创建raid5 3.1 环境准备 3.2 用3个磁盘来模拟R…

Spring boot2.7整合jetcache 远程redis缓存方案

前文 java Spring boot简述jetcache 并叙述后续文章安排 我们讲述了 jetcache 的基本概念 那么 本文 我们现在开始 直接开工 首先 要保证 redis启动 而且 要将其中全部的键值对清空掉 pom.xml中 加入坐标 <!-- https://mvnrepository.com/artifact/com.alicp.jetcache/je…

C++初阶 类(上)

目录 1. 什么是类 2. 如何定义出一个类 3. 类的访问限定符 4. 类的作用域 5. 类的实例化 6. 类的大小 7. this指针 1.this指针的引出 2. this指针的特性 8. 面试题 1. 什么是类 在C语言中&#xff0c;不同类型的数据集合体是结构体。为了方便管理结构体&#xff0c;我…

HCIP---IS-IS协议

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.IS-IS协议概述 IS-IS是一种基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;它使用最短路径优先算法&#xff08;SPF或Dijkstra&#xff09;进行路由计算。这种协议在自治…