关于kubernetes:kubernetes部署springboot项目使用configmap尝试

44次阅读

共计 3916 个字符,预计需要花费 10 分钟才能阅读完成。

背景:

我的根底环境 all in kubernetes, 参见:https://cloud.tencent.com/developer/article/1806089,https://cloud.tencent.com/developer/article/1811859 后端大佬们玩 springboot cloud 我的项目. 故要讲 springboot cloud 我的项目部署在 kubernetes 集群中。其实应用 springboot cloud 价格我还是有所拥护的。看过一些文章如:https://www.cnblogs.com/lakeslove/p/10997011.html。springboot 与我的 kubernetes 有很多的重合性能了。原本就是差不多同时衰亡的我的项目 …. 如果用新的货色 我还是比拟想上服务网格:istio 这样的。既然决定 springboot cloud on kubernets 了 那就先这样玩了 ……
对于打包 都是 maven 的原本能够间接接手的。然而程序喜爱本人打,我就只在我的项目外面放 Dockerfile. 只负责镜像层面了:

根本就是这个样子,当然了公布环境的时候我原本想写 configmap 的形式间接让程序去读我的环境变量的 …… 然而程序找我要数据库 redis 的连贯地址 账号密码 说要写在 配置文件 application.yml 中,无果。随他去了。本人拉了一下 t 我的项目试一下是否能够在 springboot 中应用 configmap 的形式。

1. kubernetes 部署 springboot 我的项目应用 configmap

百度顺手搜了一下啊关键词 springboot kubernetes configmap 一堆:

比方图上这个,然而都感觉不是我想要的,我就想简略的整下我的变量。而后无意间看到了:https://capgemini.github.io/engineering/externalising-spring-boot-config-with-kubernetes/ 就依照这个形式来搞一下了:
注:因为就是简略测试下我不想让他们写死文件,其余过程就省了了 我就间接打个包测试下了

1. 将用到的参数变量化

参照原配置文件:


批改后的:
变量名都是本人顺手写的 次要测试成果是否实现。当然了理论的须要和程序对立的还是规范化参数要好的,${}的格局都是。


嗯提取了 8 个参数将其变量化。

2. 生成 jar 包并构建 docker image

docker 打包没有集成在我的 jenkins pipeline 外面(程序的库,我就不做过多参加了),生成 jar 包

将 jar 包上传到我一台有 docker 环境的服务器下面打包成 docker image:
cat Dockerfile

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/game-1.0-SNAPSHOT.jar game-1.0-SNAPSHOT.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/game-1.0-SNAPSHOT.jar"]

docker build -t ccr.ccs.tencentyun.com/xxxx/xxxx:0.2 .
docker push ccr.ccs.tencentyun.com/xxxx/xxxx:0.2

3. 生成 configmap 文件

cat spring-boot.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: spring-config
data:
  dev-config.json:
    '{"redis.database.host":"xxxx","redis.database.port":"xxxx","redis.database.password":"xxxx","mysql.database.url":"jdbc:mysql://xxxx:3306/xxxx","mysql.database.username":"xxxx","mysql.database.password":"xxxxx","cloud.nacos.server-addr":"http://xxxx:8848","cloud.nacos.discovery.server-addr":"http://xxxx:8848"}'


apply 部署 configmap 文件:

kubectl apply -f spring-config.yaml -n qa

describe 一下:

4. 部署 springboot 服务

cat test.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pvp-test
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  selector:
    matchLabels:
      app: pvp-test
  template:
    metadata:
      labels:
        app: pvp-test
    spec:
      containers:
        - name: pvp-test
          image: ccr.ccs.tencentyun.com/xxxx/xxxx:0.2
          env:
          - name: SPRING_PROFILES_ACTIVE
            value: "qa"
          - name: SPRING_APPLICATION_JSON
            valueFrom:
             configMapKeyRef:
              name: spring-config
              key: dev-config.json
          envFrom:
          - configMapRef:
              name: deploy
          ports:
            - containerPort: 8001
              name: game-http
            - containerPort: 8011
              name: game-tcp
          resources:
            requests:
              memory: "512M"
              cpu: "500m"
            limits:
              memory: "512M"
              cpu: "500m" 
      imagePullSecrets:                                              
        - name: tencent
---

apiVersion: v1
kind: Service
metadata:
  name: pvp-test
  labels:
    app: pvp-test
spec:
  ports:
  - port: 8001
    name: game-http
    targetPort: 8001
  - port: 8011
    name: game-tcp
    targetPort: 8011
  selector:
    app: pvp-test
kubectl apply -f 2.yaml -n qa

注:imagePullSecrets 为下载 image 的秘钥。如果你是公开的仓库能够疏忽。我的仓库用的腾讯云的个人版。秘钥本人创立名字就叫 tencent 了.
测试时候比拟仓库 配置文件都起名 1 2 这样的 yaml 文件了见谅

5. 查看部署后果与 nacos 注册情况

kubectl  get pods -n qa
kubectl logs -f pvp-test-7f49fcdb9-dsjlz  -n qa


启动的过程中是有谬误的然而先疏忽这个。因为我看了一下啊 nacos 中 我的服务其实曾经注册上了 ….。初步我想要 后果算是实现了!




6. 对于报错:

字面上的意思吧?
User “system:serviceaccount:qa:default” cannot get resource “configmaps” in API group “” in the namespace “qa”.
这里算是 RBAC clusterrole rolebinding 的一个温习吧。
cat configmap-get.yaml

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: qa
  name: configmap-get
rules:
- apiGroups: [""]
  resources: ["configmap"]
  verbs: ["get"]

与 serviceaccount:qa:default 绑定

kubectl create clusterrolebinding configmap-get-configmap --clusterrole=configmap-get --serviceaccount=qa:default

杀死容器持续查看新的容器 的 log

kubectl delete pods pvp-test-7f49fcdb9-dsjlz -n qa
kubectl logs -f pvp-test-7f49fcdb9-ck9m6 -n qa



仍然报错 … 认真一看日志 …. 嗯 参数应该是 configmaps….,我少写了一个 s 吧?批改 configmap-get.yaml 文件如下:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: qa
  name: configmap-get
rules:
- apiGroups: [""]
  resources: ["configmaps"]
  verbs: ["get"]

apply 重新部署 clusterrole。删除旧 pod 从新查看日志:

kubectl apply -f configmap-get.yaml
kubectl delete pods  pvp-test-7f49fcdb9-ck9m6 -n qa


嗯这次总算胜利了

后记:

明天温习了好几个知识点 ……

  1. configmap
  2. clusterrole rolebinding

正文完
 0