代码之家  ›  专栏  ›  技术社区  ›  user84592

Kubernetes和Spring引导变量解析冲突

  •  2
  • user84592  · 技术社区  · 7 年前

    我有一个kubernetes和spring boot的env变量冲突错误。具体如下:

    创建zipkin服务器pod时,我需要设置env变量 RABBITMQ_HOST=http://172.16.100.83,RABBITMQ_PORT=5672 .

    最初我定义zipkin_pod.yaml如下:

    apiVersion: v1
    kind: Pod
    metadata:
      name: gearbox-rack-zipkin-server
      labels:
        app: gearbox-rack-zipkin-server
        purpose: platform-demo
    spec:
      containers:
      - name:  gearbox-rack-zipkin-server
        image: 192.168.1.229:5000/gearboxrack/gearbox-rack-zipkin-server
        ports:
        - containerPort: 9411
        env:
          - name: EUREKA_SERVER
            value: http://172.16.100.83:31501
          - name: RABBITMQ_HOST
            value: http://172.16.100.83
          - name: RABBITMQ_PORT
            value: 31503
    

    使用这个配置,当我执行命令时

    kubectl apply -f zipkin_pod.yaml
    

    控制台引发错误:

    [root@master3 sup]# kubectl apply -f zipkin_pod.yaml
    Error from server (BadRequest): error when creating "zipkin_pod.yaml": Pod in version "v1" cannot be handled as a Pod: v1.Pod: Spec: v1.PodSpec: Containers: []v1.Container: v1.Container: Env: []v1.EnvVar: v1.EnvVar: Value: ReadString: expects " or n, parsing 1018 ...,"value":3... at {"apiVersion":"v1","kind":"Pod","metadata":{"annotations":{"kubectl.kubernetes.io/last-applied-configuration":"{\"apiVersion\":\"v1\",\"kind\":\"Pod\",\"metadata\":{\"annotations\":{},\"labels\":{\"app\":\"gearbox-rack-zipkin-server\",\"purpose\":\"platform-demo\"},\"name\":\"gearbox-rack-zipkin-server\",\"namespace\":\"default\"},\"spec\":{\"containers\":[{\"env\":[{\"name\":\"EUREKA_SERVER\",\"value\":\"http://172.16.100.83:31501\"},{\"name\":\"RABBITMQ_HOST\",\"value\":\"http://172.16.100.83\"},{\"name\":\"RABBITMQ_PORT\",\"value\":31503}],\"image\":\"192.168.1.229:5000/gearboxrack/gearbox-rack-zipkin-server\",\"name\":\"gearbox-rack-zipkin-server\",\"ports\":[{\"containerPort\":9411}]}]}}\n"},"labels":{"app":"gearbox-rack-zipkin-server","purpose":"platform-demo"},"name":"gearbox-rack-zipkin-server","namespace":"default"},"spec":{"containers":[{"env":[{"name":"EUREKA_SERVER","value":"http://172.16.100.83:31501"},{"name":"RABBITMQ_HOST","value":"http://172.16.100.83"},{"name":"RABBITMQ_PORT","value":31503}],"image":"192.168.1.229:5000/gearboxrack/gearbox-rack-zipkin-server","name":"gearbox-rack-zipkin-server","ports":[{"containerPort":9411}]}]}}
    

    所以我修改了zipkin pod.yaml文件的最后一行,如下所示:或者使用蛮力将端口号设置为int。

    apiVersion: v1
    kind: Pod
    metadata:
      name: gearbox-rack-zipkin-server
      labels:
        app: gearbox-rack-zipkin-server
        purpose: platform-demo
    spec:
      containers:
      - name:  gearbox-rack-zipkin-server
        image: 192.168.1.229:5000/gearboxrack/gearbox-rack-zipkin-server
        ports:
        - containerPort: 9411
        env:
          - name: EUREKA_SERVER
            value: http://172.16.100.83:31501
          - name: RABBITMQ_HOST
            value: http://172.16.100.83
          - name: RABBITMQ_PORT
            value: !!31503
    

    然后pod成功创建,但spring getproperties抛出异常。

    [root@master3 sup]# kubectl apply -f zipkin_pod.yaml
    pod "gearbox-rack-zipkin-server" created
    

    当我检查日志时:

    [root@master3 sup]# kubectl logs gearbox-rack-zipkin-server
    2018-05-28 07:56:26.792  INFO [zipkin-server,,,] 1 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@4ac68d3e: startup date [Mon May 28 07:56:26 UTC 2018]; root of context hierarchy
    
    ...
    
    ***************************
    APPLICATION FAILED TO START
    ***************************
    Description:
    Binding to target org.springframework.boot.autoconfigure.amqp.RabbitProperties@324c64cd failed:
        Property: spring.rabbitmq.port
        Value:
        Reason: Failed to convert property value of type 'java.lang.String' to required type 'int' for property 'port'; nested exception is org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type [int]
    Action:
    Update your application's configuration
    

    我的问题是,如何让kubernetes将端口号理解为int,而不破坏从字符串到int的SpringBoot转换规则?因为弹簧套不能转换 !!31503 to int 31503

    1 回复  |  直到 7 年前
        1
  •  1
  •   Artem Golenyaev    7 年前

    正如@bal chua和@p·r nilsson所提到的,对于环境变量,您只能使用字符串变量,因为Linux环境变量只能是字符串。

    所以,如果您使用yaml,您需要将值放入引号中,以强制kubernetes使用字符串。

    例如:

    - name: RABBITMQ_PORT
      value: '31503'
    
    推荐文章