4

k8s 新手。

尝试从基于配置文件的配置映射中读取值。我的 configmap 存在于默认命名空间中。但是,弹簧靴没有拾取价值。

配置图如下所示:

apiVersion: v1
kind: ConfigMap
metadata:
    name: example-configmap-overriding-new-01
data:
    application.properties: |-
        globalkey = global key value
    application-qa.properties: |-
        globalkey = global key qa value    
    application-prod.properties: |-
        globalkey = global key prod value

配置映射也在默认命名空间中创建。

kubectl get configmap -n default 

NAME                                  DATA   AGE
example-configmap-overriding-new-01   3      8d

我的部署文件看起来像

apiVersion: apps/v1
kind: Deployment
metadata: 
    name: demo-configmapk8testing
spec:  
    selector:
        matchLabels:
            app: demo-configmapk8testing
replicas: 1
template: 
    metadata:
        labels:
            app: demo-configmapk8testing        
    spec:
        containers:
          - name: demo-configmapk8testing
            image: Path to image
            ports:
            - containerPort: 8080
            args: [
            "--spring.profiles.active=prod",
            "--spring.application.name=example-configmap-overriding-new-01",
            "--spring.cloud.kubernetes.config.name=example-configmap-
            overriding-new-01",
            "--spring.cloud.kubernetes.config.namespace=default",
            "--spring.cloud.kubernetes.config.enabled=true"]
            envFrom:
            - configMapRef:
                name: example-configmap-overriding-new-01

但春季启动日志说: -

2019-07-02 22:10:38.092  WARN 1 --- [           main] 
o.s.c.k.config.ConfigMapPropertySource   : Can't read configMap with name: 
[example-configmap-overriding-new-01] in namespace:[default]. Ignoring

2019-07-02 22:10:38.331  INFO 1 --- [           main] 
b.c.PropertySourceBootstrapConfiguration : Located property source: 
CompositePropertySource {name='composite-configmap', propertySources= 
[ConfigMapPropertySource {name='configmap.example-configmap-overriding-new- 
01.default'}]}

2019-07-02 22:10:38.420  INFO 1 --- [           main] 
b.c.PropertySourceBootstrapConfiguration : Located property source: 
SecretsPropertySource {name='secrets.example-configmap-overriding-new- 
01.default'}

2019-07-02 22:10:38.692  INFO 1 --- [           main] 
c.e.c.ConfigconsumerApplication          : **The following profiles are 
active: prod**

--some logs--

Injection of autowired dependencies failed; nested exception is 
java.lang.IllegalArgumentException: **Could not resolve placeholder 
'globalkey' in value "${globalkey}"**

我的 Spring Boot 配置文件看起来像

@Configuration
public class ConfigConsumerConfig {

    @Value(value = "${globalkey}")
    private String globalkey;

    // with getter and setters 
}

我的 pom.xml 也有以下依赖。

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-kubernetes-config</artifactId>
        <version>1.0.2.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-configuration-processor</artifactId>
        <optional>true</optional>
    </dependency>

我在本地机器上运行 minikube。我在这里错过了什么吗?

有人可以在这里分享一些输入。

4

4 回答 4

13

spring-cloud-kubernetes无权访问 Kubernetes API,因此无法读取 configMap。查看此文档以获取更多详细信息:https ://github.com/spring-cloud/spring-cloud-kubernetes/blob/master/docs/src/main/asciidoc/security-service-accounts.adoc 。

简而言之,应用此配置,它将正常工作:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: YOUR-NAME-SPACE
  name: namespace-reader
rules:
  - apiGroups: ["", "extensions", "apps"]
    resources: ["configmaps", "pods", "services", "endpoints", "secrets"]
    verbs: ["get", "list", "watch"]

---

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: namespace-reader-binding
  namespace: YOUR-NAME-SPACE
subjects:
- kind: ServiceAccount
  name: default
  apiGroup: ""
roleRef:
  kind: Role
  name: namespace-reader
  apiGroup: ""

您可以在此处详细了解角色和角色绑定:https ://kubernetes.io/docs/reference/access-authn-authz/rbac/ 。

注意:您不必创建卷和卷安装。我会说这是它的替代品。如果你想这样,那么你必须spring.cloud.kubernetes.config.paths在 spring boot 应用程序配置中指定(我已经将它写入bootstrap.yaml资源文件)。例如

spring: 
  cloud:
    kubernetes:
      config:
        paths: /etc/config/application.yaml

然后通过 Kubernetes 部署配置创建 ConfigMap 卷并将其挂载到该路径上。在我们的示例中,路径是/etc/config

请让我知道这对你有没有用 :)

于 2019-10-19T21:03:29.520 回答
2

需要更正 configmap 清单。格式不正确

尝试这个

apiVersion: v1
kind: ConfigMap
metadata:
  name: example-configmap-overriding-new-01
data:
  application.properties: |
    globalkey=global-key-value
  application-qa.properties: |
    globalkey=global-key-qa-value
  application-prod.properties: |
    globalkey=global-key-prod-value

您应该将 configmap 挂载为卷以在应用程序中使用配置文件

          volumeMounts:
          - name: config
            mountPath: /config
        volumes:
        - name: config
          configMap:        
            name: example-configmap-overriding-new-01
于 2019-07-03T06:58:08.893 回答
1

只是提示一下,以防有人面临与我相同的根本原因:https_proxy 设置。

我们的项目在部署配置中有 http/https_proxy,并且 spring Kubernetes 客户端对象试图通过 IP 地址访问主 url 以获取配置映射。

虽然 noproxy 设置无法识别通配符“*”(它必须是 v4 IPAddress),但我必须将 spring.cloud.kubernetes.client.masterUrl 设置为 kubernetes.default.svc 以便可以通过 DNS 名称解析。

于 2020-06-08T08:49:07.120 回答
1

您能否也尝试安装您的配置图,可能会有所帮助

volumeMounts:
- mountPath: /app/config
  name: example-configmap-overriding-new-01

volumes:
- name: example-configmap-overriding-new-01
  configMap:
      name: example-configmap-overriding-new-01

请让我知道它是否有效。谢谢

更正了语法错误

于 2019-07-03T06:57:50.190 回答