0

我有一个 Kubernetes 部署文件user.yaml -

apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-deployment
  namespace: stage
spec:
  replicas: 1
  selector:
    matchLabels:
      app: user
  template:
    metadata:
      labels:
        app: user
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '9022'
    spec:
      nodeSelector:
        env: stage
      containers:
        - name: user
          image: <docker image path>
          imagePullPolicy: Always
          resources:
            limits:
              memory: "512Mi"
              cpu: "250m"
            requests:
              memory: "256Mi"
              cpu: "200m"
          ports:
            - containerPort: 8080
          env:
            - name: MODE
              value: "local"
            - name: PORT
              value: ":8080"
            - name: REDIS_HOST
              value: "xxx"
            - name: KAFKA_ENABLED
              value: "true"
            - name: BROKERS
              value: "xxx"
      imagePullSecrets:
        - name: regcred

---
apiVersion: v1
kind: Service
metadata:
  namespace: stage
  name: user
spec:
  selector:
    app: user
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: user
  namespace: stage
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: user-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 50
    - type: Resource
      resource:
        name: memory
        target:
          type: AverageValue
          averageValue: 300Mi

此部署已使用注入命令的 linkerd 运行cat user.yaml | linkerd inject - | kubectl apply -f -

现在我想添加链接器注入注释(如此所述)并使用命令kubectl apply -f user.yaml,就像我用于没有链接器注入的部署一样。

但是,使用修改后的user.yaml(在部署中添加linkerd.io/inject注释后) -

apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-deployment
  namespace: stage
spec:
  replicas: 1
  selector:
    matchLabels:
      app: user
  template:
    metadata:
      labels:
        app: user
      annotations:
        prometheus.io/scrape: 'true'
        prometheus.io/port: '9022'
        linkerd.io/inject: enabled
    spec:
      nodeSelector:
        env: stage
      containers:
        - name: user
          image: <docker image path>
          imagePullPolicy: Always
          resources:
            limits:
              memory: "512Mi"
              cpu: "250m"
            requests:
              memory: "256Mi"
              cpu: "200m"
          ports:
            - containerPort: 8080
          env:
            - name: MODE
              value: "local"
            - name: PORT
              value: ":8080"
            - name: REDIS_HOST
              value: "xxx"
            - name: KAFKA_ENABLED
              value: "true"
            - name: BROKERS
              value: "xxx"
      imagePullSecrets:
        - name: regcred

---
apiVersion: v1
kind: Service
metadata:
  namespace: stage
  name: user
spec:
  selector:
    app: user
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080

---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: user
  namespace: stage
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: user-deployment
  minReplicas: 1
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 50
    - type: Resource
      resource:
        name: memory
        target:
          type: AverageValue
          averageValue: 300Mi

当我运行时kubectl apply -f user.yaml,它会抛出错误 -

service/user unchanged
horizontalpodautoscaler.autoscaling/user configured
Error from server (BadRequest): error when creating "user.yaml": Deployment in version "v1" cannot be handled as a Deployment: v1.Deployment.Spec: v1.DeploymentSpec.Template: v1.PodTemplateSpec.Spec: v1.PodSpec.Containers: []v1.Container: v1.Container.Env: []v1.EnvVar: v1.EnvVar.v1.EnvVar.Value: ReadString: expects " or n, but found 1, error found in #10 byte of ...|,"value":1},{"name":|..., bigger context ...|ue":":8080"}

谁能指出我在添加注释时出错的地方?

谢谢

4

2 回答 2

2

除了@Harsh Manvar 的回答,我还想简要介绍一些要点:

注释中的元数据可以是大的或小的,结构化的或非结构化的,并且可以包含标签不允许的字符。注释,如标签,是键/值映射:

"metadata": {
  "annotations": {
    "key1" : "value1",
    "key2" : "value2"
  }
}

映射中的键和值必须是字符串。换句话说,您不能对键或值使用数字、布尔值、列表或其他类型。

检查一些语法和字符集的注释。

此外,简单地添加注释不会自动网格化现有的 pod。设置注释后,您将需要重新创建或更新任何资源(例如使用 kubectl rollout restart)来触发代理注入。(通常,可以执行滚动更新以将代理注入到实时服务中而不会中断。)

有关更多详细信息,请查看Meshing a service with annotations

于 2021-10-29T06:13:26.463 回答
0

尝试使用如下双引号

annotations:
        prometheus.io/scrape: "true"
        prometheus.io/port: "9022"
        linkerd.io/inject: enabled
于 2021-10-29T04:39:21.890 回答