跳到内容

功能和扩展标志

Knative API 旨在实现可移植性,并抽象出用户部署的具体实现细节。API 的目的是让用户能够展示其所选平台中可能存在的额外功能和扩展。

本文档介绍了两个概念

功能
一种将功能引入 Knative API 的分阶段方式。
扩展
一种将 Knative 扩展到 Knative API 可移植概念之外的方式。

配置标志

功能和扩展由标志控制。

您可以在 knative-serving 命名空间中的 config-features ConfigMap 中定义标志。

标志可以具有以下值

已启用
功能或扩展已启用并正在使用中。
允许
功能或扩展已启用,可以使用,例如,通过为资源使用额外的注释或规范配置。
已禁用
无法使用该功能。

生命周期

当功能和扩展引入 Knative 时,它们遵循三个阶段的生命周期

Alpha 阶段
可能包含错误。
随时可能在不通知的情况下取消对该功能的支持。
API 可能会在以后的软件版本中以与旧版本不兼容的方式更改,恕不另行通知。
由于错误风险增加且缺乏长期支持,建议仅用于短期测试集群。
Beta 阶段
该功能经过良好测试,可以安全启用。
对整个功能的支持不会取消,尽管细节可能会改变。
对象的模式和语义可能会在后续的 beta 或稳定版本中以不兼容的方式更改。如果发生这种情况,将提供迁移到下一版本的说明。这些类型的更改可能需要您删除、修改或重新创建 API 对象,并且可能需要依赖该功能的应用程序停机。
由于后续版本中可能出现不兼容的更改,建议仅用于非业务关键型用途。如果您有多个可以独立升级的集群,您可以放宽此限制。
通用可用性 (GA) 阶段
功能或扩展的稳定版本包含在官方稳定的 Knative 版本中。

功能生命周期阶段

功能使用标志安全地引入 Knative API 的新更改。以下定义解释了不同阶段功能默认实现

Alpha 阶段
该功能默认禁用,但您可以手动启用它。
Beta 阶段
该功能默认启用,但您可以手动禁用它。
GA 阶段
该功能始终启用;您无法禁用它。
相应的特性标志不再需要,并已从 Knative 中删除。

扩展生命周期阶段

扩展显示了特定 Knative 实现的详细信息,或底层环境的功能。

注意

由于缺乏可移植性,扩展永远不会包含在核心 Knative API 中。

每个扩展始终由一个标志控制,并且默认情况下永远不会启用。

Alpha 阶段
该功能默认禁用,但您可以手动启用它。
Beta 阶段
该功能默认允许。
GA 阶段
该功能默认允许。

可用标志

多个容器

  • 类型:功能
  • ConfigMap 键: multi-container

此标志允许在 Knative 服务规范中指定多个用户容器。

只有一个容器可以处理请求,因此必须有一个容器指定 port

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      containers:
        - name: first-container
          image: ghcr.io/knative/helloworld-go:latest
          ports:
            - containerPort: 8080
        - name: second-container
          image: gcr.io/knative-samples/helloworld-java

多容器探测

  • 类型:功能
  • ConfigMap 键: multi-container-probing

此标志允许在 Knative 服务规范中为多个容器指定探测(就绪/活性)。请将此功能标志与上面的多个容器结合使用。

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      containers:
        - name: first-container
          image: ghcr.io/knative/helloworld-go:latest
          ports:
            - containerPort: 8080
          readinessProbe:
            httpGet:
              port: 8080
        - name: second-container
          image: gcr.io/knative-samples/helloworld-java
          readinessProbe:
            httpGet:
              port: 8090

Kubernetes EmptyDir 卷

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-volumes-emptydir

此扩展控制是否可以指定 emptyDir 卷。

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      containers:
          ...
          volumeMounts:
            - name: cache
              mountPath: /cache
      volumes:
        - name: cache
          emptyDir: {}

Kubernetes 卷挂载传播

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-volumes-mount-propagation

此扩展控制是否可以为卷挂载指定 MountPropagation

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
 template:
   spec:
     containers:
         ...
         volumeMounts:
           - mountPath: /data
             name: mydata
             mountPropagation: HostToContainer
     volumes:
       - name: mydata
         persistentVolumeClaim:
           claimName: pv-claim

Kubernetes 持久卷声明 (PVC)

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-persistent-volume-claim
    kubernetes.podspec-persistent-volume-write

此扩展控制是否可以指定 PersistentVolumeClaim (PVC) 以及是否允许对相应卷进行写入访问。

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
 template:
   spec:
     containers:
         ...
         volumeMounts:
           - mountPath: /data
             name: mydata
             readOnly: true
     volumes:
       - name: mydata
         persistentVolumeClaim:
           claimName: minio-pv-claim
           readOnly: true

Kubernetes 节点亲和性

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-affinity

此扩展控制是否可以指定 节点亲和性

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: kubernetes.io/e2e-az-name
                operator: In
                values:
                - e2e-az1
                - e2e-az2

Kubernetes 主机别名

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-hostaliases

此标志控制是否可以指定 主机别名

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      hostAliases:
      - ip: "127.0.0.1"
        hostnames:
        - "foo.local"
        - "bar.local"

Kubernetes 节点选择器

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-nodeselector

此标志控制是否可以指定 节点选择器

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      nodeSelector:
        labelName: labelValue

Kubernetes 容忍度

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-tolerations

此标志控制是否可以指定 容忍度

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      tolerations:
      - key: "example-key"
        operator: "Exists"
        effect: "NoSchedule"

Kubernetes Downward API

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-fieldref

此标志控制是否可以指定 Downward API(基于环境变量)

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      containers:
        - name: user-container
          image: ghcr.io/knative/helloworld-go:latest
          env:
            - name: MY_NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName

Kubernetes 优先级类名称

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-priorityclassname

此标志控制是否可以指定 priorityClassName

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      priorityClassName: high-priority
...

Kubernetes 运行时类

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-runtimeclassname

此标志控制是否可以使用 运行时类

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      runtimeClassName: myclass
...

Kubernetes 安全上下文

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-securitycontext

此标志控制是否可以使用 安全上下文 的子集。

当设置为 enabledallowed 时,允许以下 PodSecurityContext 属性

  • FSGroup
  • RunAsGroup
  • RunAsNonRoot
  • SupplementalGroups
  • RunAsUser

当设置为 enabledallowed 时,允许以下容器 SecurityContext 属性

  • RunAsNonRoot(仅当设置为 true 时,即使没有此标志也允许)
  • RunAsGroup
  • RunAsUser(即使没有此标志也已允许)

警告

请谨慎使用此标志。PodSecurityContext 属性可能会影响来自 Knative 或您的服务网格的非用户 sidecar 容器。

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      securityContext:
        runAsUser: 1000
...

Kubernetes 安全上下文功能

  • 类型:扩展
  • ConfigMap 键kubernetes.containerspec-addcapabilities

此标志控制用户是否可以在容器的 securityContext 上添加功能。

当设置为 enabledallowed 时,它允许将 Linux 功能 添加到容器中。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
spec:
 template:
  spec:
   containers:
     - image: ghcr.io/knative/helloworld-go:latest
       env:
         - name: TARGET
           value: "Go Sample v1"
       securityContext:
         capabilities:
           add:
             - NET_BIND_SERVICE

基于标签头的路由

  • 类型:扩展
  • ConfigMap 键: tag-header-based-routing

此标志控制是否启用 基于标签头的路由

Kubernetes init 容器

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-init-containers

此标志控制是否可以使用 init 容器

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      ...
      initContainers:
        - name: init-myservice
          image: busybox
          command: ['sh', '-c', "service_setup.sh"]
...

队列代理 Pod 信息

  • 类型:扩展
  • ConfigMap 键: queueproxy.mount-podinfo

使用 QPOptions 时,您必须将此功能设置为“enabled”或“allowed”。此标志控制 Knative 是否将 pod-info 卷挂载到 queue-proxy 容器。

挂载 pod-info 卷允许使用 QPOptions 的扩展通过读取 /etc/podinfo/annnotations 文件来访问服务注释。有关详细信息,请参阅使用 QPOptions 扩展队列代理镜像

当此功能为 enabled 时,pod-info 卷始终挂载。这在所有或大多数集群服务都需要使用依赖 QPOptions 的扩展时很有用。

当此功能为 allowed 时,pod-info 卷默认不挂载。相反,仅当服务添加如下所示的 features.knative.dev/queueproxy-podinfo: enabled 注释时,才会挂载该卷。

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations: features.knative.dev/queueproxy-podinfo: enabled
...

Kubernetes 拓扑分布约束

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-topologyspreadconstraints

此标志控制是否可以指定 topology spread constraints

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      ...
      topologySpreadConstraints:
      - maxSkew: 1
        topologyKey: node
        whenUnsatisfiable: DoNotSchedule
        labelSelector:
          matchLabels:
            foo: bar
...

Kubernetes DNS 策略

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-dnspolicy

此标志控制是否可以指定 DNS 策略

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      dnsPolicy: ClusterFirstWithHostNet
...

Kubernetes DNS 配置

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-dnsconfig

此标志控制是否可以指定 DNS 配置

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      dnsPolicy: "None"
      dnsConfig:
        nameservers:
          - 1.2.3.4
        searches:
          - ns1.svc.cluster-domain.example
          - my.dns.search.suffix
        options:
          - name: ndots
            value: "2"
          - name: edns0
...

Kubernetes 调度器名称

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-schedulername

此标志控制是否可以指定 调度器名称

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      ...
      schedulerName: custom-scheduler-example
...

Kubernetes 共享进程命名空间

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-shareprocessnamespace

此标志控制是否可以使用 共享进程命名空间

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      ...
      shareProcessNamespace: true
...

警告

shareProcessNamespacehostPID 不能同时设置。

Kubernetes 主机 IPC

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-hostipc

此标志控制是否可以使用主机的 ipc 命名空间。

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      ...
      hostIPC: true
...

Kubernetes 主机 PID

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-hostpid

此标志控制是否可以使用主机的 pid。

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      ...
      hostPID: true
...

Kubernetes 主机网络

  • 类型:扩展
  • ConfigMap 键: kubernetes.podspec-hostnetwork

此标志控制是否可以使用主机的网络命名空间。

apiVersion: serving.knative.dev/v1
kind: Service
...
spec:
  template:
    spec:
      ...
      hostNetwork: true
...

我们使用分析和 cookie 来了解网站流量。有关您使用我们网站的信息会与 Google 共享以达到此目的。了解更多。