spring-cloud-kubernetes与k8s的configmap_spring-cloud-starter-kubernetes-config maven-程序员宅基地

技术标签: kubernetes  spring cloud  k8s  springboot  spring-cloud-kubernetes  

本文是《spring-cloud-kubernetes实战系列》的第六篇,主要内容是在kubernetes上部署一个java web应用,该应用使用了spring-cloud-kubernetes框架,可以使用kubernetes的configmap;

系列文章列表

  1. 《spring-cloud-kubernetes官方demo运行实战》
  2. 《你好spring-cloud-kubernetes》
  3. 《spring-cloud-kubernetes背后的三个关键知识点》
  4. 《spring-cloud-kubernetes的服务发现和轮询实战(含熔断)》
  5. 《spring-cloud-kubernetes与SpringCloud Gateway》
  6. 《spring-cloud-kubernetes与k8s的configmap》
  7. 《spring-cloud-kubernetes自动同步k8s的configmap更新》

关于SpringCloud Config

如果您开发过SpringCloud应用,相信您对SpringCloud Config不会陌生,在微服务环境中,业务应用可以从config server获取所需的配置信息,如下图所示:
在这里插入图片描述

关于kubernetes的configmap

这是kubernetes提供的基本服务之一,创建一个configmap资源,对应着一份配置文件,可以将该资源通过数据卷的形式映射到Pod上,这样Pod就能用上这个配置文件了,如下图:
在这里插入图片描述

spring-cloud-kubernetes带来的礼物

spring-cloud-starter-kubernetes-config是spring-cloud-starter-kubernetes框架下的一个库,作用是将kubernetes的configmap与SpringCloud Config结合起来,通过spring-cloud-starter-kubernetes-config,我们的应用就像在通过SpringCloud Config取得配置信息,只不过这里的配置信息来自kubernetes的configmap,而不是SpringCloud Config server,如下图所示:
在这里插入图片描述

理论上的准备工作已经差不多了,接下来通过实战来展示spring-cloud-starter-kubernetes-config的神奇之处;

源码下载

如果您不打算写代码,也可以从GitHub上下载本次实战的源码,地址和链接信息如下表所示:

名称 链接 备注
项目主页 https://github.com/zq2599/blog_demos 该项目在GitHub上的主页
git仓库地址(https) https://github.com/zq2599/blog_demos.git 该项目源码的仓库地址,https协议
git仓库地址(ssh) [email protected]:zq2599/blog_demos.git 该项目源码的仓库地址,ssh协议

这个git项目中有多个文件夹,本章的应用在springcloudk8sconfigdemo文件夹下,如下图所示:
在这里插入图片描述

环境信息

本次实战的环境和版本信息如下:

  1. 操作系统:CentOS Linux release 7.6.1810
  2. minikube:1.1.1
  3. Java:1.8.0_191
  4. Maven:3.6.0
  5. fabric8-maven-plugin插件:3.5.37
  6. spring-cloud-kubernetes:1.0.1.RELEASE
  7. springboot:2.1.6.RELEASE

准备完毕,可以开始实战啦!

编码

  1. 通过maven创建名为springcloudk8sconfigdemo的springboot工程,pom.xml内容如下,要注意的是新增了依赖spring-cloud-starter-kubernetes-config,这是本次实战的重点:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.bolingcavalry</groupId>
    <artifactId>springcloudk8sconfigdemo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springcloudk8sconfigdemo</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-boot.version>2.1.6.RELEASE</spring-boot.version>
        <maven-checkstyle-plugin.failsOnError>false</maven-checkstyle-plugin.failsOnError>
        <maven-checkstyle-plugin.failsOnViolation>false</maven-checkstyle-plugin.failsOnViolation>
        <maven-checkstyle-plugin.includeTestSourceDirectory>false</maven-checkstyle-plugin.includeTestSourceDirectory>
        <maven-compiler-plugin.version>3.5</maven-compiler-plugin.version>
        <maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
        <maven-failsafe-plugin.version>2.18.1</maven-failsafe-plugin.version>
        <maven-surefire-plugin.version>2.21.0</maven-surefire-plugin.version>
        <fabric8.maven.plugin.version>3.5.37</fabric8.maven.plugin.version>
        <springcloud.kubernetes.version>1.0.1.RELEASE</springcloud.kubernetes.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
            <version>${springcloud.kubernetes.version}</version>
        </dependency>
    </dependencies>
    <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>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>${spring-boot.version}</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <plugin>
                <!--skip deploy -->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <version>${maven-deploy-plugin.version}</version>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven-surefire-plugin.version}</version>
                <configuration>
                    <skipTests>true</skipTests>
                    <!-- Workaround for https://issues.apache.org/jira/browse/SUREFIRE-1588 -->
                    <useSystemClassLoader>false</useSystemClassLoader>
                </configuration>
            </plugin>
            <plugin>
                <groupId>io.fabric8</groupId>
                <artifactId>fabric8-maven-plugin</artifactId>
                <version>${fabric8.maven.plugin.version}</version>
                <executions>
                    <execution>
                        <id>fmp</id>
                        <goals>
                            <goal>resource</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>kubernetes</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>io.fabric8</groupId>
                        <artifactId>fabric8-maven-plugin</artifactId>
                        <version>${fabric8.maven.plugin.version}</version>
                        <executions>
                            <execution>
                                <id>fmp</id>
                                <goals>
                                    <goal>resource</goal>
                                    <goal>build</goal>
                                </goals>
                            </execution>
                        </executions>
                        <configuration>
                            <enricher>
                                <config>
                                    <fmp-service>
                                        <type>NodePort</type>
                                    </fmp-service>
                                </config>
                            </enricher>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>
  1. 项目的src\main\resources路径下不要创建application.yml文件,只创建名为bootstrap.yml的文件,内容如下:
spring:
  application:
    name: springcloudk8sconfigdemo
  cloud:
    kubernetes:
      config:
        sources:
          - name: ${
    spring.application.name}
            namespace: default

可见新增了配置项spring.cloud.kubernetes.config.source.name和spring.cloud.kubernetes.config.source.namespace,用于配置信息来源于kubernetes的哪个namespace下的哪个configmap;
3. 增加一个配置类DummyConfig.java,注解ConfigurationProperties的prefix="greeting"表示该类用到的配置项都是名为"greeting"的配置项的子内容 :

package com.bolingcavalry.springcloudk8sconfigdemo;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Configuration
@ConfigurationProperties(prefix = "greeting")
public class DummyConfig {
    

	private String message = "This is a dummy message";

	public String getMessage() {
    
		return this.message;
	}

	public void setMessage(String message) {
    
		this.message = message;
	}
}
  1. 启动类Springcloudk8sconfigdemoApplication.java,简单起见,将用于验证配置项是否生效的web接口也写在了这里面,即hello方法 :
package com.bolingcavalry.springcloudk8sconfigdemo;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.text.SimpleDateFormat;
import java.util.Date;

@SpringBootApplication
@RestController
@EnableConfigurationProperties(DummyConfig.class)
public class Springcloudk8sconfigdemoApplication {
    

    @Autowired
    private DummyConfig dummyConfig;

    @GetMapping("/hello")
    public String hello() {
    
        return dummyConfig.getMessage()
                + " ["
                + new SimpleDateFormat().format(new Date())
                + "]";
    }

    public static void main(String[] args) {
    
        SpringApplication.run(Springcloudk8sconfigdemoApplication.class, args);
    }
}

以上就是实战工程的所有代码了,仅仅只是引入了spring-cloud-kubernetes-config的依赖,以及在启动配置文件中指定了configmap的信息,即完成了获取配置文件的所有操作,至于代码中用到配置文件的地方,和使用SpringCloud Config并无差别。

解决权限问题

我这里的是minikube,在部署了应用之后,默认的serviceaccount是没有权限访问K8S的API Server资源的,执行以下命令可以提升权限:

kubectl create clusterrolebinding permissive-binding \
  --clusterrole=cluster-admin \
  --user=admin \
  --user=kubelet \
  --group=system:serviceaccounts

注意:以上办法只能用于开发和测试环境,不要用在生产环境,生产环境应参考Kubernetes的RBAC授权相关设置来处理,步骤如下:

  1. 创建role:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: default
  name: pod-reader
rules:
  - apiGroups: [""]
    resources: ["pods","configmaps"]
    verbs: ["get", "watch", "list"]
  1. 创建ServiceAccount:
apiVersion: v1
kind: ServiceAccount
metadata:
  name: config-reader
  namespace: default
  1. 绑定Role和ServiceAccount:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pod-reader
  namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pod-reader
subjects:
  - kind: ServiceAccount
    name: config-reader
    namespace: default
  1. 在deployment中指定上面的ServiceAccount;

验证

接下来我们在kubernetes环境创建configmap,再将springcloudk8sconfigdemo在kubernetes部署和启动,通过springcloudk8sconfigdemo提供的http接口验证应用是否已经从configmap中取得指定的配置;

  1. 在kubernetes环境新建名为springcloudk8sconfigdemo.yml的文件,内容如下:
kind: ConfigMap
apiVersion: v1
metadata:
  name: springcloudk8sconfigdemo
data:
  application.yml: |-
    greeting:
      message: Say Hello to the World
    farewell:
      message: Say Goodbye
    ---
    spring:
      profiles: development
    greeting:
      message: Say Hello to the Developers
    farewell:
      message: Say Goodbye to the Developers
    ---
    spring:
      profiles: production
    greeting:
      message: Say Hello to the Ops
  1. 在springcloudk8sconfigdemo.yml文件所在目录执行以下命令,即可在kubernetes创建名为的configmap的资源:
kubectl apply -f springcloudk8sconfigdemo.yml
  1. 在springcloudk8sconfigdemo项目的pom.xml文件所在目录,执行以下命令,即可编译构建部署全部完成:
mvn clean install fabric8:deploy -Dfabric8.generator.from=fabric8/java-jboss-openjdk8-jdk -Pkubernetes

操作成功后的控制台信息如下:

[INFO] Installing /usr/local/work/k8s/springcloudk8sconfigdemo/target/classes/META-INF/fabric8/kubernetes.json to /root/.m2/repository/com/bolingcavalry/springcloudk8sconfigdemo/0.0.1-SNAPSHOT/springcloudk8sconfigdemo-0.0.1-SNAPSHOT-kubernetes.json
[INFO] 
[INFO] <<< fabric8-maven-plugin:3.5.37:deploy (default-cli) < install @ springcloudk8sconfigdemo <<<
[INFO] 
[INFO] 
[INFO] --- fabric8-maven-plugin:3.5.37:deploy (default-cli) @ springcloudk8sconfigdemo ---
[INFO] F8: Using Kubernetes at https://192.168.121.133:8443/ in namespace default with manifest /usr/local/work/k8s/springcloudk8sconfigdemo/target/classes/META-INF/fabric8/kubernetes.yml 
[INFO] Using namespace: default
[INFO] Updating a Service from kubernetes.yml
[INFO] Updated Service: target/fabric8/applyJson/default/service-springcloudk8sconfigdemo.json
[INFO] Using namespace: default
[INFO] Updating Deployment from kubernetes.yml
[INFO] Updated Deployment: target/fabric8/applyJson/default/deployment-springcloudk8sconfigdemo.json
[INFO] F8: HINT: Use the command `kubectl get pods -w` to watch your pods start up
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  13.538 s
[INFO] Finished at: 2019-07-14T17:06:25+08:00
[INFO] ------------------------------------------------------------------------
  1. 如果您的环境也是minikube,可以执行以下命令查看服务地址:
minikube service springcloudk8sconfigdemo --url

得到服务地址是:http://192.168.121.133:31646
5. 浏览器访问地址:http://192.168.121.133:31646/hello ,得到响应如下图,可见已经从configmap取得了配置文件,并且加载成功:
在这里插入图片描述

修改profile

前面的实战没有指定springboot工程的profile,接下来指定profile为development,看能否加载到配置文件中指定的配置,如下图红框所示:
在这里插入图片描述

  1. 修改项目的src\main\resources路径下的bootstrap.yml文件,增加配置项spring.profiles.active,修改后的完整内容如下:
spring:
  application:
    name: springcloudk8sconfigdemo
  profiles:
    active: development
  cloud:
    kubernetes:
      config:
        sources:
          - name: ${
    spring.application.name}
            namespace: default
  1. 在springcloudk8sconfigdemo项目的pom.xml文件所在目录,执行以下命令,即可编译构建部署全部完成:
mvn clean install fabric8:deploy -Dfabric8.generator.from=fabric8/java-jboss-openjdk8-jdk -Pkubernetes
  1. 如果您的环境也是minikube,可以执行以下命令查看服务地址:
minikube service springcloudk8sconfigdemo --url

得到服务地址是:http://192.168.121.133:30659
4. 浏览器访问地址:http://192.168.121.133:30659/hello ,得到响应如下图,可见已经从configmap取得了指定profile的配置文件,并且加载成功:
在这里插入图片描述
至此,spring-cloud-kubernetes与k8s的configmap的实战就完成了,我们可以发现借助spring-cloud-kubernetes-config的神奇能力,曾经使用SpringCloud Config来配置的应用几乎不用修改代码,仅仅调整了配置和依赖,就能顺利迁移到kubernetes之上,直接使用原生的配置服务,并且SpringCloud Config Server也可以不用在kubernetes上部署了,再次感受到SpringCloud设计的前瞻性。

一点遗憾

虽然我们的应用已经成功从configmap取得配置信息,但遗憾的是,configmap的配置信息被修改后,这些修改是无法实时同步到我们的应用的,只能重启应用来重现获取配置,为了解决这个问题,请参考本系列的下一篇 《spring-cloud-kubernetes自动同步k8s的configmap更新》

欢迎关注我的公众号:程序员欣宸

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/boling_cavalry/article/details/95804909

智能推荐

MM自动过账-库存科目与抵消类科目GBB配置_sap gbb-程序员宅基地

文章浏览阅读8.3k次,点赞8次,收藏56次。一. 自动过账原理 在MM模块的许多操作都能实现在FI模块自动过账,如PO收货、发票验证(LIV)、工单发料、向生产车间发料等等。不用说,一定需要在IMG中进行配置才可以实现自动处理。但SAP实现的这种自动配置的机制是怎样的呢?其实也并不复杂,让我们先以一种最简单的情况来了解实现原理和实现流程,然后就可以轻松对各种情况作出配置。 如果我们使用SAP系统,初始化库存一定必不可少。大家都知_sap gbb

没有画的画册-程序员宅基地

文章浏览阅读537次。前 记  说起来也真奇怪!当我感觉得最温暖和最愉快的时候,我的双手和舌头就好像有了束缚,使我不能表达和说出我内心所起的思想。然而我却是一个画家呢。我的眼睛这样告诉我;看到过我的速写和画的人也都这样承认。  我是一个穷苦的孩子。我的住..._天才的荣誉中会被埋入尘土只有平庸的材料获得称赞这是一个古老的故事不过这故

安卓ROM开发入门到精通-程序员宅基地

文章浏览阅读1w次,点赞10次,收藏44次。包含内容:第一期主要为ROM开发,ROM定制技术资料,提供一些工具为主 ,让你学会简单做包,和基本的ROM DIY技巧,偶尔附加一些必要的教程。第二期针对ROM技术教程,细分知识点,重点剖析、解释,形成一系列的知识文档供查阅,目前大纲已列出,可以教你从零开始做包。1.第一期---技术资料(维护更新):更新日志:1.书籍-Android系统级深入开发——移植与调试2.开发工具-And..._安卓rom开发

SCIP | 数学规划求解器SCIP超详细的使用教程_混合整数规划求解器——scip-程序员宅基地

文章浏览阅读1w次,点赞4次,收藏33次。前言小伙伴们大家好呀!继上次lp_solve规划求解器的推文出来以后,大家都期待着更多求解器的具体介绍和用法。小编哪敢偷懒,这不,赶在考试周之际,又在忙里偷闲中给大家送上一篇SCIP规划求解的推文教程。快一起来看看吧。Part1 惯例科普篇What is SCIP?官方的介绍:SCIP is currently one of the fastest non-commerci..._混合整数规划求解器——scip

怎么拍照翻译外语?几款工具让你轻松get韩语-程序员宅基地

文章浏览阅读1.2k次,点赞48次,收藏12次。别担心,现在有了韩语拍照翻译的软件,一切都变得简单啦!,使得在没有网络连接的情况下也能使用翻译服务,这对于经常出国或在网络不稳定区域的用户来说是一个巨大的优势。只需打开应用,选择拍照翻译,对准需要翻译的文字,即可获得翻译结果。你还不知道有哪些好用的拍照翻译工具?它提供了图片翻译功能,可以在编辑文档时直接翻译图片中的文字。,只需选择拍照翻译,对准文本即可获得翻译结果,非常适合需要快速翻译的场合。它的图片翻译功能界面直观,可以轻松上传图片进行翻译。,它都能迅速得到翻译结果,极大地方便了多语言环境下的沟通。

【逗老师带你学IT】Kiwi Syslog Web Access与Active Directory集成认证-程序员宅基地

文章浏览阅读4.1k次。Kiwi是windows平台下一个不错的syslog软件。_kiwi syslog web access

随便推点

被90%中国人误解了12年的斜杠-程序员宅基地

文章浏览阅读3.2k次。10月20日,世界第六届互联网大会。阿里巴巴旗下的罗汉堂发布:中国9成年轻人,同时拥有两种以上职业或线上身份。如今是斜杠青年当道。今年,伴随着“副业刚需”的热议,围绕“斜杠青年”的讨论越来越多,但是含混模糊。我在几个微信群里,询问“提到斜杠青年,你脑中浮现的第一印象是什么”,收集到的关键词如下。褒义:跨界、天才、高大上、厉害、有天赋、多项技能、复合型人才、多面手、综合能力强、旧技能延伸到新..._斜杠职业什么意思

一个SQL语句引发的ORA-00600错误排查(二)-程序员宅基地

文章浏览阅读267次。继昨天一个SQL语句导致的ORA-00600错误之后,我给出了背景和初步的分析结果,今天来给出我的结论,当然说明原因不是我的本意,还有反思。首先语句类似这样的形式:MERGE INTO (SELECT * FROM TE..._merge into超过四个值就报错ora00600

aria2c 的基本配置,附带傻瓜式源码_aria2本地连接已断开小白羊-程序员宅基地

文章浏览阅读3.6k次。新年好呀。经常需要配置,但是 每次都需要查找配置项的意义,所以索性写在这里,以便有个记录,下次无需查找。aria2c -d/Users/blueboz/Downloads -c -D -laria.log -j5 -k1M -x16 -s16 –file-allocation=none –enable-rpc –load-cookies=aria.cookie –save-..._aria2本地连接已断开小白羊

undefined reference to ‘cv::imread问题调查_undefined reference to `cv::imread-程序员宅基地

文章浏览阅读4.7k次,点赞2次,收藏2次。Android ndk 编译报错:error: undefined reference to 'cv::imread(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, int)' #include <opencv2/core.hpp> #include <openc_undefined reference to `cv::imread

Vite 的好与坏,你怎么看?-程序员宅基地

文章浏览阅读7.6k次,点赞4次,收藏2次。全文 3000 字,欢迎点赞关注转发一、Vite 是什么2020年4月,尤大大发了这么一个推:随后,2021年2月,Vite 2.0 它来了,上来就是一套组合拳:基于 esbuild 实现..._怎么评价vite

python基础之运算符(五)_python使用赋值运算符将num1增加5-程序员宅基地

文章浏览阅读245次。文章目录- 算术运算符- 赋值运算符- 复合赋值运算符- 位运算符- 比较运算符- 逻辑运算符- 成员运算符- 身份运算符- 算符优先级运算符python支持以下几种运算符- 算术运算符下面以a=10 ,b=20为例进行计算运算符描述实例+加两个对象相加 a + b 输出结果 30-减得到负数或是一个数减去另一个数 a - b 输出结果 -10*..._python使用赋值运算符将num1增加5

推荐文章

热门文章

相关标签