功能和扩展标志¶
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
此标志控制是否可以使用 安全上下文 的子集。
当设置为 enabled
或 allowed
时,允许以下 PodSecurityContext
属性:
- FSGroup
- RunAsGroup
- RunAsNonRoot
- SupplementalGroups
- RunAsUser
当设置为 enabled
或 allowed
时,允许以下容器 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
上添加功能。
当设置为 enabled
或 allowed
时,允许将 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
...
警告
shareProcessNamespace
和 hostPID
不能同时设置。
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
...