跳至内容

功能和扩展标志

Knative API 旨在可移植,并且抽象了用户部署的特定实现细节。API 的目的是赋予用户能力,以便在他们选择的平台中提供可能的额外功能和扩展。

本文档介绍了两个概念

特征
一种将功能引入 Knative API 的方式。
扩展
一种超越 Knative API 可移植概念的扩展 Knative 的方式。

配置标志

功能和扩展由标志控制。

您可以在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 Service 规范中指定多个用户容器。

只有一个容器可以处理请求,因此必须恰好一个容器具有指定的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 Service 规范中指定多个容器的探测(就绪/存活)。请将此特征标志与上面的多个容器结合使用。

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 持久卷声明 (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 下行 API

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

此标志控制是否可以指定下行 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-dryrun

此标志控制 Knative 是否尝试通过在接受对象之前使用 Kubernetes API 服务器来验证从 Knative Service 规范派生的 Pod 规范。

当此扩展为enabled时,服务器始终运行此验证。

当此扩展为allowed时,服务器默认情况下不会运行此验证。

当此扩展为allowed时,您可以通过添加features.knative.dev/podspec-dryrun: enabled注释为单个服务运行此验证

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  annotations: features.knative.dev/podspec-dryrun: enabled
...

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 或您的服务网格的非用户侧车容器。

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 初始化容器

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

此标志控制是否可以使用 初始化容器

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

此标志控制是否可以指定 拓扑传播约束

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 调度器名称

  • 类型:扩展
  • 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 共享,用于该目的。 了解更多。