【问题标题】:Why is the YAML of "kubectl get" so different from the YAML of "kubectl apply" in GKE?为什么“kubectl get”的 YAML 与 GKE 中的“kubectl apply”的 YAML 如此不同?
【发布时间】:2021-12-14 16:03:44
【问题描述】:

我有一个 GKE 集群。

我使用kubectl apply 从本地机器应用以下 YAML:

apiVersion: v1
kind: Service
metadata:
  name: flask-app-svc
  namespace: myapp
spec:
  ports:
  - port: 5000
    targetPort: 5000
  selector:
    component: flask-app

已申请。都好。 ✅


然后我使用kubectl get service 从集群中取回 YAML。它返回了这个:

apiVersion: v1
kind: Service
metadata:
  annotations:
    cloud.google.com/neg: '{"ingress":true}'
    cloud.google.com/neg-status: '{"network_endpoint_groups":{"5000":"k8s1-5fe0c3c1-myapp-flask-app-svc-5000-837dba94"},"zones":["asia-southeast1-a"]}'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"flask-app-svc","namespace":"myapp"},"spec":{"ports":[{"port":5000,"targetPort":5000}],"selector":{"component":"flask-app"}}}
  creationTimestamp: "2021-10-29T14:40:49Z"
  name: flask-app-svc
  namespace: myapp
  resourceVersion: "242820340"
  uid: ad80f634-5aab-4147-8f71-11ccc44fd867
spec:
  clusterIP: 10.22.52.180
  clusterIPs:
  - 10.22.52.180
  ports:
  - port: 5000
    protocol: TCP
    targetPort: 5000
  selector:
    component: flask-app
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

1。什么 kubernetes “概念”在这里起作用?

2。为什么这 2 个 YAML 彼此如此不同?

3。幕后发生了什么?

4。这是 GKE 特有的,还是任何 k8s 集群都会这样?

5。我在哪里可以找到一些信息/文章来了解有关此概念的更多信息?


提前谢谢你。

一段时间以来,我一直在努力解决这个问题。感谢您在此处提供建议和建议的任何帮助。

【问题讨论】:

  • 看起来您有一些东西可以在 Google Cloud 中为“neg”添加两个注释。会不会和这个有关? github.com/GoogleCloudPlatform/gke-autoneg-controller
  • @jonas 你也许是对的。这个特殊的注释添加可能是由 AutoNEG 引入的。但正如您所见,添加的不仅仅是注释。还有很多东西。我试图更深入地了解 GKE 如何(以及为什么)决定添加一些属性和值,以及它是如何不添加的。
  • 所有其他添加都是有意义的,并且在 Kubernetes 中很常见。
  • 我理解自动添加的行是有意义的,并且对于 kubernetes 来说很常见。我试图了解,k8s 如何知道要自动添加哪些行,因为这些行不是我添加的。有没有api?是否有任何 k8s 查找自动添加任何缺失行的词汇表。是否有任何已知的包结构可以告诉 GKE 缺少哪些行以便它可以添加这些行?等等

标签: kubernetes yaml google-kubernetes-engine manifest kubectl


【解决方案1】:

Kubernetes API 服务器验证和配置 API 对象的数据,包括 pod、服务、复制控制器等。 API Server 为 REST 操作提供服务,并为集群的共享状态提供前端,所有其他组件通过该前端进行交互。 API 服务器采用用户提供的定义来创建创建所需对象所需的所有详细定义。在this document 中,您可以找到 GKE API 服务器引擎的概述。

您可以找到example on this document about a create operation。在那里,您可以在请求输入和为 API 服务器生成的响应之间切换,以创建所需对象、其参数、元数据以及您在原始 yaml 文件的“扩展”版本中看到的所有相关配置参数的完整定义. 在同一文档中,您可以找到有关此主题的更多信息。

【讨论】:

    【解决方案2】:

    service in GKE 是一种向目标最终用户公开的方式,这些应用程序在一组 pod 中运行。所有这些元素构成了 GKE 集群的一部分。 如果您应用 YAML 来创建服务,则需要几个额外的精简才能使您的用户可以访问应用程序。 Kubernetes 和 GKE 的特性之一是自动创建、设置和维护所需的资源,在这种情况下,例如创建服务。 GKE 所做的所有这些额外设置和定义都记录在一个 YAML 文件中。

    如果您可以了解更多有关此概念的信息,可以从Google Kubernetes Engine product page 开始,或在同一页面中咨询GKE documentation。另一个很好的起点是阅读此GKE overview

    【讨论】:

    • 亲爱的@JesusHuesca。感谢回复。您分享的文档链接是 GKE 集群的一般营销介绍 - 谷歌中的 kubernetes。它们不涉及 GKE 自身自动添加 YAML 内容的原因和方式的技术。
    猜你喜欢
    • 2021-11-05
    • 2019-11-18
    • 2018-08-19
    • 2019-04-16
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2021-07-25
    • 2018-05-02
    相关资源
    最近更新 更多