在部署完注册中心服务后,部署配置中心服务比较简单。注册中心使用k8s 的statefulSet部署,而配置中新只需要使用Deployment方式部署,通过创建Service来对外暴露服务。
配置中新的代码书写,直接参看spring cloud config即可。我们的项目用的是接入DB的方式。需要配置数据源。
配置中新的改造首先想到的也是需要创建一个k8s的application 属性文件。通过在deployment文件中生命使用k8s的profile. k8s profile如下:
这里注意defaultZone, 域名部分,如果只写pod名称则会发现无法连接,这是使用statefulSet后使用域名访问Pod的访问方式。
对应的得deloyment文件和Service文件,如下:
在Service文件中,我们使用了NodePort的类型,方便在node节点,开一个端口测试,实际使用时应该使用ClusterIP方式,拒绝机群外部访问。
Deployment 的spec.template.spec.container[0].command部分定义了启动命令和启用k8sprofile的参数,与部署Eureka相同,这个参数放在args中不起作用,只能放在这个位置,并且需要注释掉Dockerfile的相同参数。
command: ["java", "-jar","config-central.jar","--spring.profiles.active=k8s"]
使用microk8s appliy -f 命令创建Deployment和Service:
microk8s kubectl create -f config-central-deployment.yaml
microk8s kubectl create -f config-central-service.yaml
登陆Eureka的管理页面,查看服务注册:
新开一个命令行,输入: microk8s kubectl port-forward pod/register-central-0 8090:9090, 然后从node节点通过浏览器访问,可以看拿到config-server注册成功了。
使用浏览器调用配置中心接口:
通过浏览访问Node节点30007端口,通过Serice的nodetype方式调用配置中心接口,可以看到数据调用成功。
其中besra是我们通过配置中新数据库配置的一个微服务,dev指明是开发profile。
以上方式已经成功部署了配置中心, 但是还有缺点:需要将生产环境配置和密码需要写在k8s的配置文件中与项目一起打包。所以对于正式产品的运维来说是不够的。我们需要使用secret + 命令行挂在properties文件的方式尝试实现配置中新的部署。
首先创建一个configmap资源的yaml文件,在各configmap资源中,我们定义了application.properties,将所有需要的属性文件(处数据库用户名,密码外),写在了这个Properties文件中。
现在需要修改Deployment文件:
1。首先增加Volumes ,使用Volume的方式挂在configMap资源
Volumes 和 Contianers是在一个等级,缩进时须注意。
volumes:
# You set volumes at the Pod level, then mount them into containers inside that Pod
- name: config
configMap:
# Provide the name of the ConfigMap you want to mount.
name: configcentral-configmap
# An array of keys from the ConfigMap to create as files
items:
- key: "application.properties"
path: "application.properties"
2. 然后将configmap 声明的配置文件,挂在到容器下面
volumeMounts: #volumeMounts 是在具体的容器下面,和Image一个等级
- name: demo-config
mountPath: /opt/application.properties
subPath: application.properties
readOnly: true
3. 增加命令行参数
去掉Command里对profile.active的声明,命令行注入application.properties文件和用户名密码。
这些也可以写在args参数部分。
containers:
- name: wingspan-configcentral
image: com.lifeccp/config-central:1.0.0
#args: ["--spring.datasource.username=devops","--spring.datasource.password= woshidba__1"]
command: ["java", "-jar","config-central.jar","--spring.datasource.username=xxxxxxx","--spring.datasource.password= xxxxxxx","--spring.config.location=/opt/application.properties"]
部分内容截图如下:
现在更新Service中定义的端口好,使用心得9001.
创建完后,使用mirok8s kubectl apply -f 重新更新configMap, deployment, 和service:
microk8s kubectl apply -f conig-central-configmap.yaml
microk8s kubectl apply -f config-central-deployment.yaml
microk8s kubectl apply -f config-central-service.yaml
重新启动浏览器,访问30007端口:
使用ConfigMap通过命令行挂属性文件的方式,解决了k8s上的配置问题,不用每次都打包。
现在剩余密码的明文问题,这里我们尝试使用secret + 环境变量的方式,仍旧通过springboot的命令行参数注入。
1. 对用户名和密码生成base64密文
2. 手动创建secret yaml文件
3. 修改Deloyment文件,增加环境变量,引用secret;同时修改命令行参数,引用环境变量 :
4. 使用Apply 命令创建secret 和 更新Deployment
microk8s kubectl apply -f config-central-secret.yaml
microk8s kubectl apply -f config-central-deployment.yaml
检查Pod可以看到,创建了新的config-cnetral 实例。
5. 从浏览器30007端口访问微服务的配置,工作正常
到这里,通过microk8s 部署springboot的配置中心的工作已经结束,也达到了我们的目标。总共创建了4个配置文件:
1. Deployment 文件 :config-central-deployment.yaml
2. Service文件: config-central-service.yaml
3. config map文件: conig-central-configmap.yaml
4. secret 文件: config-central-secret.yaml
configMap文件和secret文件通过k8s来维护,开发工程师不比要在知道测试与生产环境的配置。
这些配置也不再打包到项目里。