功能和扩展标志¶
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
此标志控制是否可以使用 安全上下文 的子集。
当设置为 enabled 或 allowed 时,允许以下 PodSecurityContext 属性
- FSGroup
- RunAsGroup
- RunAsNonRoot
- SupplementalGroups
- RunAsUser
当设置为 enabled 或 allowed 时,允许以下容器 SecurityContext 属性
RunAsNonRoot(仅当设置为 true 时,即使没有此标志也允许)RunAsGroupRunAsUser(即使没有此标志也已允许)
警告
请谨慎使用此标志。PodSecurityContext 属性可能会影响来自 Knative 或您的服务网格的非用户 sidecar 容器。
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 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
...
警告
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
...