From 7077d20aecc91b6cc17aeef3bf3c779c8ea62bd8 Mon Sep 17 00:00:00 2001 From: Michael Fritch Date: Thu, 8 Feb 2024 16:18:05 -0700 Subject: [PATCH] make charts Signed-off-by: Michael Fritch --- .../sriov-crd/sriov-crd-102.2.0+up0.1.0.tgz | Bin 0 -> 3469 bytes assets/sriov/sriov-102.2.0+up0.1.0.tgz | Bin 0 -> 19475 bytes charts/sriov-crd/102.2.0+up0.1.0/Chart.yaml | 12 + ...vnetwork.openshift.io_sriovibnetworks.yaml | 79 +++ ...openshift.io_sriovnetworknodepolicies.yaml | 136 +++++ ...k.openshift.io_sriovnetworknodestates.yaml | 159 ++++++ ....openshift.io_sriovnetworkpoolconfigs.yaml | 66 +++ ...iovnetwork.openshift.io_sriovnetworks.yaml | 111 ++++ ...ork.openshift.io_sriovoperatorconfigs.yaml | 91 ++++ charts/sriov/102.2.0+up0.1.0/.helmignore | 23 + charts/sriov/102.2.0+up0.1.0/Chart.yaml | 29 ++ charts/sriov/102.2.0+up0.1.0/README.md | 73 +++ charts/sriov/102.2.0+up0.1.0/app-README.md | 13 + .../charts/rancher-nfd/.helmignore | 23 + .../charts/rancher-nfd/Chart.yaml | 14 + .../charts/rancher-nfd/README.md | 10 + .../charts/rancher-nfd/crds/nfd-api-crds.yaml | 363 +++++++++++++ .../charts/rancher-nfd/templates/_helpers.tpl | 107 ++++ .../templates/cert-manager-certs.yaml | 67 +++ .../templates/cert-manager-issuer.yaml | 42 ++ .../rancher-nfd/templates/clusterrole.yaml | 97 ++++ .../templates/clusterrolebinding.yaml | 52 ++ .../charts/rancher-nfd/templates/master.yaml | 145 ++++++ .../templates/nfd-master-conf.yaml | 10 + .../templates/nfd-topologyupdater-conf.yaml | 10 + .../templates/nfd-worker-conf.yaml | 10 + .../charts/rancher-nfd/templates/role.yaml | 18 + .../rancher-nfd/templates/rolebinding.yaml | 17 + .../charts/rancher-nfd/templates/service.yaml | 18 + .../rancher-nfd/templates/serviceaccount.yaml | 58 +++ .../rancher-nfd/templates/topology-gc.yaml | 64 +++ .../templates/topologyupdater-crds.yaml | 278 ++++++++++ .../templates/topologyupdater.yaml | 142 +++++ .../charts/rancher-nfd/templates/worker.yaml | 144 ++++++ .../charts/rancher-nfd/values.yaml | 484 ++++++++++++++++++ .../sriov/102.2.0+up0.1.0/templates/NOTES.txt | 17 + .../102.2.0+up0.1.0/templates/_helpers.tpl | 85 +++ .../templates/_webhook-certs.tpl | 31 ++ .../templates/certmanagercerts.yaml | 41 ++ .../templates/clusterrole.yaml | 109 ++++ .../templates/clusterrolebinding.yaml | 29 ++ .../102.2.0+up0.1.0/templates/configmap.yaml | 25 + .../102.2.0+up0.1.0/templates/operator.yaml | 98 ++++ .../sriov/102.2.0+up0.1.0/templates/role.yaml | 125 +++++ .../templates/rolebinding.yaml | 44 ++ .../102.2.0+up0.1.0/templates/secrets.yaml | 20 + .../templates/serviceaccount.yaml | 15 + .../templates/validate-install-crd.yaml | 19 + charts/sriov/102.2.0+up0.1.0/values.yaml | 64 +++ index.yaml | 49 ++ 50 files changed, 3736 insertions(+) create mode 100644 assets/sriov-crd/sriov-crd-102.2.0+up0.1.0.tgz create mode 100644 assets/sriov/sriov-102.2.0+up0.1.0.tgz create mode 100644 charts/sriov-crd/102.2.0+up0.1.0/Chart.yaml create mode 100644 charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovibnetworks.yaml create mode 100644 charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworknodepolicies.yaml create mode 100644 charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworknodestates.yaml create mode 100644 charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworkpoolconfigs.yaml create mode 100644 charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworks.yaml create mode 100644 charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovoperatorconfigs.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/.helmignore create mode 100644 charts/sriov/102.2.0+up0.1.0/Chart.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/README.md create mode 100644 charts/sriov/102.2.0+up0.1.0/app-README.md create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/.helmignore create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/Chart.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/README.md create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/crds/nfd-api-crds.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/_helpers.tpl create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/cert-manager-certs.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/cert-manager-issuer.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/clusterrole.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/clusterrolebinding.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/master.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-master-conf.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-topologyupdater-conf.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-worker-conf.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/role.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/rolebinding.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/service.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/serviceaccount.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topology-gc.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topologyupdater-crds.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topologyupdater.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/worker.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/values.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/NOTES.txt create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/_helpers.tpl create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/_webhook-certs.tpl create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/certmanagercerts.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/clusterrole.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/clusterrolebinding.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/configmap.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/operator.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/role.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/rolebinding.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/secrets.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/serviceaccount.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/templates/validate-install-crd.yaml create mode 100644 charts/sriov/102.2.0+up0.1.0/values.yaml diff --git a/assets/sriov-crd/sriov-crd-102.2.0+up0.1.0.tgz b/assets/sriov-crd/sriov-crd-102.2.0+up0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..dd35cdca495933d5f0f23a27d7b18075df877ea3 GIT binary patch literal 3469 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 literal 0 HcmV?d00001 diff --git a/assets/sriov/sriov-102.2.0+up0.1.0.tgz b/assets/sriov/sriov-102.2.0+up0.1.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..2e5e7480b74548b904b6e8b2c1299e9b7309e295 GIT binary patch literal 19475 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 literal 0 HcmV?d00001 diff --git a/charts/sriov-crd/102.2.0+up0.1.0/Chart.yaml b/charts/sriov-crd/102.2.0+up0.1.0/Chart.yaml new file mode 100644 index 00000000000..31329c8e7be --- /dev/null +++ b/charts/sriov-crd/102.2.0+up0.1.0/Chart.yaml @@ -0,0 +1,12 @@ +annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/experimental: "true" + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: cattle-sriov-system + catalog.cattle.io/permits-os: linux + catalog.cattle.io/release-name: sriov-crd +apiVersion: v2 +description: Installs the CRDs for rke2-sriov. +name: sriov-crd +type: application +version: 102.2.0+up0.1.0 diff --git a/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovibnetworks.yaml b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovibnetworks.yaml new file mode 100644 index 00000000000..6137e52c7b4 --- /dev/null +++ b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovibnetworks.yaml @@ -0,0 +1,79 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: sriovibnetworks.sriovnetwork.openshift.io +spec: + group: sriovnetwork.openshift.io + names: + kind: SriovIBNetwork + listKind: SriovIBNetworkList + plural: sriovibnetworks + singular: sriovibnetwork + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: SriovIBNetwork is the Schema for the sriovibnetworks API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SriovIBNetworkSpec defines the desired state of SriovIBNetwork + properties: + capabilities: + description: 'Capabilities to be configured for this network. Capabilities + supported: (infinibandGUID), e.g. ''{"infinibandGUID": true}''' + type: string + ipam: + description: IPAM configuration to be used for this network. + type: string + linkState: + description: VF link state (enable|disable|auto) + enum: + - auto + - enable + - disable + type: string + metaPlugins: + description: MetaPluginsConfig configuration to be used in order to + chain metaplugins to the sriov interface returned by the operator. + type: string + networkNamespace: + description: Namespace of the NetworkAttachmentDefinition custom resource + type: string + resourceName: + description: SRIOV Network device plugin endpoint resource name + type: string + required: + - resourceName + type: object + status: + description: SriovIBNetworkStatus defines the observed state of SriovIBNetwork + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworknodepolicies.yaml b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworknodepolicies.yaml new file mode 100644 index 00000000000..f9b7ecfdfe0 --- /dev/null +++ b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworknodepolicies.yaml @@ -0,0 +1,136 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: sriovnetworknodepolicies.sriovnetwork.openshift.io +spec: + group: sriovnetwork.openshift.io + names: + kind: SriovNetworkNodePolicy + listKind: SriovNetworkNodePolicyList + plural: sriovnetworknodepolicies + singular: sriovnetworknodepolicy + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: SriovNetworkNodePolicy is the Schema for the sriovnetworknodepolicies + API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SriovNetworkNodePolicySpec defines the desired state of SriovNetworkNodePolicy + properties: + deviceType: + description: The driver type for configured VFs. Allowed value "netdevice", + "vfio-pci". Defaults to netdevice. + enum: + - netdevice + - vfio-pci + type: string + eSwitchMode: + description: NIC Device Mode. Allowed value "legacy","switchdev". + enum: + - legacy + - switchdev + type: string + isRdma: + description: RDMA mode. Defaults to false. + type: boolean + linkType: + description: NIC Link Type. Allowed value "eth", "ETH", "ib", and + "IB". + enum: + - eth + - ETH + - ib + - IB + type: string + mtu: + description: MTU of VF + minimum: 1 + type: integer + needVhostNet: + description: mount vhost-net device. Defaults to false. + type: boolean + nicSelector: + description: NicSelector selects the NICs to be configured + properties: + deviceID: + description: The device hex code of SR-IoV device. Allowed value + "0d58", "1572", "158b", "1013", "1015", "1017", "101b". + type: string + netFilter: + description: Infrastructure Networking selection filter. Allowed + value "openstack/NetworkID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" + type: string + pfNames: + description: Name of SR-IoV PF. + items: + type: string + type: array + rootDevices: + description: PCI address of SR-IoV PF. + items: + type: string + type: array + vendor: + description: The vendor hex code of SR-IoV device. Allowed value + "8086", "15b3". + type: string + type: object + nodeSelector: + additionalProperties: + type: string + description: NodeSelector selects the nodes to be configured + type: object + numVfs: + description: Number of VFs for each PF + minimum: 0 + type: integer + priority: + description: Priority of the policy, higher priority policies can + override lower ones. + maximum: 99 + minimum: 0 + type: integer + resourceName: + description: SRIOV Network device plugin endpoint resource name + type: string + required: + - nicSelector + - nodeSelector + - numVfs + - resourceName + type: object + status: + description: SriovNetworkNodePolicyStatus defines the observed state of + SriovNetworkNodePolicy + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworknodestates.yaml b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworknodestates.yaml new file mode 100644 index 00000000000..8ccd4ef294c --- /dev/null +++ b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworknodestates.yaml @@ -0,0 +1,159 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: sriovnetworknodestates.sriovnetwork.openshift.io +spec: + group: sriovnetwork.openshift.io + names: + kind: SriovNetworkNodeState + listKind: SriovNetworkNodeStateList + plural: sriovnetworknodestates + singular: sriovnetworknodestate + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: SriovNetworkNodeState is the Schema for the sriovnetworknodestates + API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SriovNetworkNodeStateSpec defines the desired state of SriovNetworkNodeState + properties: + dpConfigVersion: + type: string + interfaces: + items: + properties: + eSwitchMode: + type: string + linkType: + type: string + mtu: + type: integer + name: + type: string + numVfs: + type: integer + pciAddress: + type: string + vfGroups: + items: + properties: + deviceType: + type: string + isRdma: + type: boolean + mtu: + type: integer + policyName: + type: string + resourceName: + type: string + vfRange: + type: string + type: object + type: array + required: + - pciAddress + type: object + type: array + type: object + status: + description: SriovNetworkNodeStateStatus defines the observed state of + SriovNetworkNodeState + properties: + interfaces: + items: + properties: + Vfs: + items: + properties: + Vlan: + type: integer + assigned: + type: string + deviceID: + type: string + driver: + type: string + mac: + type: string + mtu: + type: integer + name: + type: string + pciAddress: + type: string + vendor: + type: string + vfID: + type: integer + required: + - pciAddress + - vfID + type: object + type: array + deviceID: + type: string + driver: + type: string + eSwitchMode: + type: string + linkSpeed: + type: string + linkType: + type: string + mac: + type: string + mtu: + type: integer + name: + type: string + netFilter: + type: string + numVfs: + type: integer + pciAddress: + type: string + totalvfs: + type: integer + vendor: + type: string + required: + - pciAddress + type: object + type: array + lastSyncError: + type: string + syncStatus: + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworkpoolconfigs.yaml b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworkpoolconfigs.yaml new file mode 100644 index 00000000000..275f23773c2 --- /dev/null +++ b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworkpoolconfigs.yaml @@ -0,0 +1,66 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: sriovnetworkpoolconfigs.sriovnetwork.openshift.io +spec: + group: sriovnetwork.openshift.io + names: + kind: SriovNetworkPoolConfig + listKind: SriovNetworkPoolConfigList + plural: sriovnetworkpoolconfigs + singular: sriovnetworkpoolconfig + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: SriovNetworkPoolConfig is the Schema for the sriovnetworkpoolconfigs + API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SriovNetworkPoolConfigSpec defines the desired state of SriovNetworkPoolConfig + properties: + ovsHardwareOffloadConfig: + description: OvsHardwareOffloadConfig describes the OVS HWOL configuration + for selected Nodes + properties: + name: + description: 'Name is mandatory and must be unique. On Kubernetes: + Name is the name of OvsHardwareOffloadConfig On OpenShift: Name + is the name of MachineConfigPool to be enabled with OVS hardware + offload' + type: string + type: object + type: object + status: + description: SriovNetworkPoolConfigStatus defines the observed state of + SriovNetworkPoolConfig + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworks.yaml b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworks.yaml new file mode 100644 index 00000000000..b0c84e17a2f --- /dev/null +++ b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovnetworks.yaml @@ -0,0 +1,111 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: sriovnetworks.sriovnetwork.openshift.io +spec: + group: sriovnetwork.openshift.io + names: + kind: SriovNetwork + listKind: SriovNetworkList + plural: sriovnetworks + singular: sriovnetwork + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: SriovNetwork is the Schema for the sriovnetworks API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SriovNetworkSpec defines the desired state of SriovNetwork + properties: + capabilities: + description: 'Capabilities to be configured for this network. Capabilities + supported: (mac|ips), e.g. ''{"mac": true}''' + type: string + ipam: + description: IPAM configuration to be used for this network. + type: string + linkState: + description: VF link state (enable|disable|auto) + enum: + - auto + - enable + - disable + type: string + maxTxRate: + description: Maximum tx rate, in Mbps, for the VF. Defaults to 0 (no + rate limiting) + minimum: 0 + type: integer + metaPlugins: + description: MetaPluginsConfig configuration to be used in order to + chain metaplugins to the sriov interface returned by the operator. + type: string + minTxRate: + description: Minimum tx rate, in Mbps, for the VF. Defaults to 0 (no + rate limiting). min_tx_rate should be <= max_tx_rate. + minimum: 0 + type: integer + networkNamespace: + description: Namespace of the NetworkAttachmentDefinition custom resource + type: string + resourceName: + description: SRIOV Network device plugin endpoint resource name + type: string + spoofChk: + description: VF spoof check, (on|off) + enum: + - "on" + - "off" + type: string + trust: + description: VF trust mode (on|off) + enum: + - "on" + - "off" + type: string + vlan: + description: VLAN ID to assign for the VF. Defaults to 0. + maximum: 4096 + minimum: 0 + type: integer + vlanQoS: + description: VLAN QoS ID to assign for the VF. Defaults to 0. + maximum: 7 + minimum: 0 + type: integer + required: + - resourceName + type: object + status: + description: SriovNetworkStatus defines the observed state of SriovNetwork + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovoperatorconfigs.yaml b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovoperatorconfigs.yaml new file mode 100644 index 00000000000..04f3143cca9 --- /dev/null +++ b/charts/sriov-crd/102.2.0+up0.1.0/templates/sriovnetwork.openshift.io_sriovoperatorconfigs.yaml @@ -0,0 +1,91 @@ + +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.4.1 + creationTimestamp: null + name: sriovoperatorconfigs.sriovnetwork.openshift.io +spec: + group: sriovnetwork.openshift.io + names: + kind: SriovOperatorConfig + listKind: SriovOperatorConfigList + plural: sriovoperatorconfigs + singular: sriovoperatorconfig + scope: Namespaced + versions: + - name: v1 + schema: + openAPIV3Schema: + description: SriovOperatorConfig is the Schema for the sriovoperatorconfigs + API + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: SriovOperatorConfigSpec defines the desired state of SriovOperatorConfig + properties: + configDaemonNodeSelector: + additionalProperties: + type: string + description: NodeSelector selects the nodes to be configured + type: object + disableDrain: + description: Flag to disable nodes drain during debugging + type: boolean + enableInjector: + description: Flag to control whether the network resource injector + webhook shall be deployed + type: boolean + enableOperatorWebhook: + description: Flag to control whether the operator admission controller + webhook shall be deployed + type: boolean + enableOvsOffload: + description: Flag to enable OVS hardware offload. Set to 'true' to + provision switchdev-configuration.service and enable OpenvSwitch + hw-offload on nodes. + type: boolean + logLevel: + description: Flag to control the log verbose level of the operator. + Set to '0' to show only the basic logs. And set to '2' to show all + the available logs. + maximum: 2 + minimum: 0 + type: integer + type: object + status: + description: SriovOperatorConfigStatus defines the observed state of SriovOperatorConfig + properties: + injector: + description: Show the runtime status of the network resource injector + webhook + type: string + operatorWebhook: + description: Show the runtime status of the operator admission controller + webhook + type: string + type: object + type: object + served: true + storage: true + subresources: + status: {} +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] diff --git a/charts/sriov/102.2.0+up0.1.0/.helmignore b/charts/sriov/102.2.0+up0.1.0/.helmignore new file mode 100644 index 00000000000..0e8a0eb36f4 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/sriov/102.2.0+up0.1.0/Chart.yaml b/charts/sriov/102.2.0+up0.1.0/Chart.yaml new file mode 100644 index 00000000000..1097444fbbf --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/Chart.yaml @@ -0,0 +1,29 @@ +annotations: + catalog.cattle.io/auto-install: sriov-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/experimental: "true" + catalog.cattle.io/kube-version: '>= 1.16.0-0 < 1.28.0-0' + catalog.cattle.io/namespace: cattle-sriov-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux + catalog.cattle.io/rancher-version: '>= 2.7.0-0 < 2.8.0-0' + catalog.cattle.io/release-name: sriov + catalog.cattle.io/upstream-version: 1.2.0 +apiVersion: v2 +appVersion: 1.2.0 +description: SR-IOV network operator configures and manages SR-IOV networks in the + kubernetes cluster +home: https://github.com/k8snetworkplumbingwg/sriov-network-operator +icon: https://charts.rancher.io/assets/logos/sr-iov.svg +keywords: +- sriov +- Networking +kubeVersion: '>= 1.16.0' +maintainers: +- email: charts@rancher.com + name: Rancher Labs +name: sriov +sources: +- https://github.com/rancher/charts +type: application +version: 102.2.0+up0.1.0 diff --git a/charts/sriov/102.2.0+up0.1.0/README.md b/charts/sriov/102.2.0+up0.1.0/README.md new file mode 100644 index 00000000000..b34d479bd03 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/README.md @@ -0,0 +1,73 @@ +# SR-IOV Network Operator Helm Chart + +SR-IOV Network Operator Helm Chart provides an easy way to install, configure and manage +the lifecycle of SR-IOV network operator. + +## SR-IOV Network Operator +SR-IOV Network Operator leverages [Kubernetes CRDs](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/custom-resources/) +and [Operator SDK](https://github.com/operator-framework/operator-sdk) to configure and manage SR-IOV networks in a Kubernetes cluster. + +SR-IOV Network Operator features: +- Initialize the supported SR-IOV NIC types on selected nodes. +- Provision/upgrade SR-IOV device plugin executable on selected node. +- Provision/upgrade SR-IOV CNI plugin executable on selected nodes. +- Manage configuration of SR-IOV device plugin on host. +- Generate net-att-def CRs for SR-IOV CNI plugin +- Supports operation in a virtualized Kubernetes deployment + - Discovers VFs attached to the Virtual Machine (VM) + - Does not require attached of associated PFs + - VFs can be associated to SriovNetworks by selecting the appropriate PciAddress as the RootDevice in the SriovNetworkNodePolicy + +## QuickStart + +### Prerequisites + +- Kubernetes v1.17+ +- Helm v3 + +### Install Helm + +Helm provides an install script to copy helm binary to your system: +``` +$ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 +$ chmod 500 get_helm.sh +$ ./get_helm.sh +``` + +For additional information and methods for installing Helm, refer to the official [helm website](https://helm.sh/) + +### Deploy SR-IOV Network Operator + +``` +# Install Operator +$ helm install -n sriov-network-operator --create-namespace --wait sriov-network-operator ./ + +# View deployed resources +$ kubectl -n sriov-network-operator get pods +``` + +## Chart parameters + +In order to tailor the deployment of the network operator to your cluster needs +We have introduced the following Chart parameters. + +### Operator parameters + +| Name | Type | Default | description | +| ---- | ---- | ------- | ----------- | +| `operator.resourcePrefix` | string | `openshift.io` | Device plugin resource prefix | +| `operator.enableAdmissionController` | bool | `false` | Enable SR-IOV network resource injector and operator webhook | +| `operator.cniBinPath` | string | `/opt/cni/bin` | Path for CNI binary | +| `operator.clusterType` | string | `kubernetes` | Cluster environment type | + +### Images parameters + +| Name | description | +| ---- | ----------- | +| `images.operator` | Operator controller image | +| `images.sriovConfigDaemon` | Daemon node agent image | +| `images.sriovCni` | SR-IOV CNI image | +| `images.ibSriovCni` | InfiniBand SR-IOV CNI image | +| `images.sriovDevicePlugin` | SR-IOV device plugin image | +| `images.resourcesInjector` | Resources Injector image | +| `images.webhook` | Operator Webhook image | diff --git a/charts/sriov/102.2.0+up0.1.0/app-README.md b/charts/sriov/102.2.0+up0.1.0/app-README.md new file mode 100644 index 00000000000..4dda94a833c --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/app-README.md @@ -0,0 +1,13 @@ +# Rancher SR-IOV Network Operator + +This chart is based on the upstream [k8snetworkplumbingwg/sriov-network-operator](https://github.com/k8snetworkplumbingwg/sriov-network-operator) project. The chart deploys the SR-IOV Operator and its CRDs, which are designed to help the user provision and configure the SR-IOV CNI in a cluster that uses [Multus CNI](https://github.com/k8snetworkplumbingwg/multus-cni), to provide high performing extra network interfaces to pods. This chart is expected to be deployed on an RKE2 cluster and only meant for advanced use cases where multiple CNI plugins and high performing network interfaces on pods are required. Users who do not need these features are not advised to install this chart. + +The chart installs the following components: + + - SR-IOV Operator - An operator that helps provision and configure the SR-IOV CNI plugin and SR-IOV Device plugin + - SR-IOV Network Config Daemon - A Daemon deployed by the Operator that discovers SR-IOV NICs on each node + +Note that SR-IOV requires NICs that support SR-IOV and the activation of specific configuration options in the operating system. Nodes that fulfill these requirements should be labeled with: `feature.node.kubernetes.io/network-sriov.capable=true`. + +The SR-IOV Network Config Daemon will be deployed on such capable nodes. For more information on how to use this feature, refer to our RKE2 networking docs. + diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/.helmignore b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/.helmignore new file mode 100644 index 00000000000..0e8a0eb36f4 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/.helmignore @@ -0,0 +1,23 @@ +# Patterns to ignore when building packages. +# This supports shell glob matching, relative path matching, and +# negation (prefixed with !). Only one pattern per line. +.DS_Store +# Common VCS dirs +.git/ +.gitignore +.bzr/ +.bzrignore +.hg/ +.hgignore +.svn/ +# Common backup files +*.swp +*.bak +*.tmp +*.orig +*~ +# Various IDEs +.project +.idea/ +*.tmproj +.vscode/ diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/Chart.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/Chart.yaml new file mode 100644 index 00000000000..d9d4151d9a2 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/Chart.yaml @@ -0,0 +1,14 @@ +apiVersion: v2 +appVersion: v0.13.2 +description: 'Detects hardware features available on each node in a Kubernetes cluster, + and advertises those features using node labels. ' +home: https://github.com/kubernetes-sigs/node-feature-discovery +keywords: +- feature-discovery +- feature-detection +- node-labels +name: rancher-nfd +sources: +- https://github.com/kubernetes-sigs/node-feature-discovery +type: application +version: 0.13.2 diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/README.md b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/README.md new file mode 100644 index 00000000000..628ac6a36d8 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/README.md @@ -0,0 +1,10 @@ +# Node Feature Discovery + +Node Feature Discovery (NFD) is a Kubernetes add-on for detecting hardware +features and system configuration. Detected features are advertised as node +labels. NFD provides flexible configuration and extension points for a wide +range of vendor and application specific node labeling needs. + +See +[NFD documentation](https://kubernetes-sigs.github.io/node-feature-discovery/v0.13/deployment/helm.html) +for deployment instructions. diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/crds/nfd-api-crds.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/crds/nfd-api-crds.yaml new file mode 100644 index 00000000000..775536f2803 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/crds/nfd-api-crds.yaml @@ -0,0 +1,363 @@ +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null + name: nodefeatures.nfd.k8s-sigs.io +spec: + group: nfd.k8s-sigs.io + names: + kind: NodeFeature + listKind: NodeFeatureList + plural: nodefeatures + singular: nodefeature + scope: Namespaced + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: NodeFeature resource holds the features discovered for one node + in the cluster. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: NodeFeatureSpec describes a NodeFeature object. + properties: + features: + description: Features is the full "raw" features data that has been + discovered. + properties: + attributes: + additionalProperties: + description: AttributeFeatureSet is a set of features having + string value. + properties: + elements: + additionalProperties: + type: string + type: object + required: + - elements + type: object + description: Attributes contains all the attribute-type features + of the node. + type: object + flags: + additionalProperties: + description: FlagFeatureSet is a set of simple features only + containing names without values. + properties: + elements: + additionalProperties: + description: Nil is a dummy empty struct for protobuf + compatibility + type: object + type: object + required: + - elements + type: object + description: Flags contains all the flag-type features of the + node. + type: object + instances: + additionalProperties: + description: InstanceFeatureSet is a set of features each of + which is an instance having multiple attributes. + properties: + elements: + items: + description: InstanceFeature represents one instance of + a complex features, e.g. a device. + properties: + attributes: + additionalProperties: + type: string + type: object + required: + - attributes + type: object + type: array + required: + - elements + type: object + description: Instances contains all the instance-type features + of the node. + type: object + type: object + labels: + additionalProperties: + type: string + description: Labels is the set of node labels that are requested to + be created. + type: object + type: object + required: + - spec + type: object + served: true + storage: true +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + controller-gen.kubebuilder.io/version: v0.9.2 + creationTimestamp: null + name: nodefeaturerules.nfd.k8s-sigs.io +spec: + group: nfd.k8s-sigs.io + names: + kind: NodeFeatureRule + listKind: NodeFeatureRuleList + plural: nodefeaturerules + shortNames: + - nfr + singular: nodefeaturerule + scope: Cluster + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: NodeFeatureRule resource specifies a configuration for feature-based + customization of node objects, such as node labeling. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + spec: + description: NodeFeatureRuleSpec describes a NodeFeatureRule. + properties: + rules: + description: Rules is a list of node customization rules. + items: + description: Rule defines a rule for node customization such as + labeling. + properties: + extendedResources: + additionalProperties: + type: string + description: ExtendedResources to create if the rule matches. + type: object + labels: + additionalProperties: + type: string + description: Labels to create if the rule matches. + type: object + labelsTemplate: + description: LabelsTemplate specifies a template to expand for + dynamically generating multiple labels. Data (after template + expansion) must be keys with an optional value ([=]) + separated by newlines. + type: string + matchAny: + description: MatchAny specifies a list of matchers one of which + must match. + items: + description: MatchAnyElem specifies one sub-matcher of MatchAny. + properties: + matchFeatures: + description: MatchFeatures specifies a set of matcher + terms all of which must match. + items: + description: FeatureMatcherTerm defines requirements + against one feature set. All requirements (specified + as MatchExpressions) are evaluated against each element + in the feature set. + properties: + feature: + type: string + matchExpressions: + additionalProperties: + description: "MatchExpression specifies an expression + to evaluate against a set of input values. It + contains an operator that is applied when matching + the input and an array of values that the operator + evaluates the input against. \n NB: CreateMatchExpression + or MustCreateMatchExpression() should be used + for creating new instances. \n NB: Validate() + must be called if Op or Value fields are modified + or if a new instance is created from scratch + without using the helper functions." + properties: + op: + description: Op is the operator to be applied. + enum: + - In + - NotIn + - InRegexp + - Exists + - DoesNotExist + - Gt + - Lt + - GtLt + - IsTrue + - IsFalse + type: string + value: + description: Value is the list of values that + the operand evaluates the input against. + Value should be empty if the operator is + Exists, DoesNotExist, IsTrue or IsFalse. + Value should contain exactly one element + if the operator is Gt or Lt and exactly + two elements if the operator is GtLt. In + other cases Value should contain at least + one element. + items: + type: string + type: array + required: + - op + type: object + description: MatchExpressionSet contains a set of + MatchExpressions, each of which is evaluated against + a set of input values. + type: object + required: + - feature + - matchExpressions + type: object + type: array + required: + - matchFeatures + type: object + type: array + matchFeatures: + description: MatchFeatures specifies a set of matcher terms + all of which must match. + items: + description: FeatureMatcherTerm defines requirements against + one feature set. All requirements (specified as MatchExpressions) + are evaluated against each element in the feature set. + properties: + feature: + type: string + matchExpressions: + additionalProperties: + description: "MatchExpression specifies an expression + to evaluate against a set of input values. It contains + an operator that is applied when matching the input + and an array of values that the operator evaluates + the input against. \n NB: CreateMatchExpression or + MustCreateMatchExpression() should be used for creating + new instances. \n NB: Validate() must be called if + Op or Value fields are modified or if a new instance + is created from scratch without using the helper functions." + properties: + op: + description: Op is the operator to be applied. + enum: + - In + - NotIn + - InRegexp + - Exists + - DoesNotExist + - Gt + - Lt + - GtLt + - IsTrue + - IsFalse + type: string + value: + description: Value is the list of values that the + operand evaluates the input against. Value should + be empty if the operator is Exists, DoesNotExist, + IsTrue or IsFalse. Value should contain exactly + one element if the operator is Gt or Lt and exactly + two elements if the operator is GtLt. In other + cases Value should contain at least one element. + items: + type: string + type: array + required: + - op + type: object + description: MatchExpressionSet contains a set of MatchExpressions, + each of which is evaluated against a set of input values. + type: object + required: + - feature + - matchExpressions + type: object + type: array + name: + description: Name of the rule. + type: string + taints: + description: Taints to create if the rule matches. + items: + description: The node this Taint is attached to has the "effect" + on any pod that does not tolerate the Taint. + properties: + effect: + description: Required. The effect of the taint on pods + that do not tolerate the taint. Valid effects are NoSchedule, + PreferNoSchedule and NoExecute. + type: string + key: + description: Required. The taint key to be applied to + a node. + type: string + timeAdded: + description: TimeAdded represents the time at which the + taint was added. It is only written for NoExecute taints. + format: date-time + type: string + value: + description: The taint value corresponding to the taint + key. + type: string + required: + - effect + - key + type: object + type: array + vars: + additionalProperties: + type: string + description: Vars is the variables to store if the rule matches. + Variables do not directly inflict any changes in the node + object. However, they can be referenced from other rules enabling + more complex rule hierarchies, without exposing intermediary + output values as labels. + type: object + varsTemplate: + description: VarsTemplate specifies a template to expand for + dynamically generating multiple variables. Data (after template + expansion) must be keys with an optional value ([=]) + separated by newlines. + type: string + required: + - name + type: object + type: array + required: + - rules + type: object + required: + - spec + type: object + served: true + storage: true diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/_helpers.tpl b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/_helpers.tpl new file mode 100644 index 00000000000..5a0a5c97f7b --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/_helpers.tpl @@ -0,0 +1,107 @@ +{{/* vim: set filetype=mustache: */}} +{{/* +Expand the name of the chart. +*/}} +{{- define "node-feature-discovery.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "node-feature-discovery.fullname" -}} +{{- if .Values.fullnameOverride -}} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- $name := default .Chart.Name .Values.nameOverride -}} +{{- if contains $name .Release.Name -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" -}} +{{- else -}} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}} +{{- end -}} +{{- end -}} +{{- end -}} + +{{/* +Allow the release namespace to be overridden for multi-namespace deployments in combined charts +*/}} +{{- define "node-feature-discovery.namespace" -}} + {{- if .Values.namespaceOverride -}} + {{- .Values.namespaceOverride -}} + {{- else -}} + {{- .Release.Namespace -}} + {{- end -}} +{{- end -}} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "node-feature-discovery.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" -}} +{{- end -}} + +{{/* +Common labels +*/}} +{{- define "node-feature-discovery.labels" -}} +helm.sh/chart: {{ include "node-feature-discovery.chart" . }} +{{ include "node-feature-discovery.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end -}} + +{{/* +Selector labels +*/}} +{{- define "node-feature-discovery.selectorLabels" -}} +app.kubernetes.io/name: {{ include "node-feature-discovery.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end -}} + +{{/* +Create the name of the service account which the nfd master will use +*/}} +{{- define "node-feature-discovery.master.serviceAccountName" -}} +{{- if .Values.master.serviceAccount.create -}} + {{ default (include "node-feature-discovery.fullname" .) .Values.master.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.master.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the service account which the nfd worker will use +*/}} +{{- define "node-feature-discovery.worker.serviceAccountName" -}} +{{- if .Values.worker.serviceAccount.create -}} + {{ default (printf "%s-worker" (include "node-feature-discovery.fullname" .)) .Values.worker.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.worker.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the service account which topologyUpdater will use +*/}} +{{- define "node-feature-discovery.topologyUpdater.serviceAccountName" -}} +{{- if .Values.topologyUpdater.serviceAccount.create -}} + {{ default (printf "%s-topology-updater" (include "node-feature-discovery.fullname" .)) .Values.topologyUpdater.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.topologyUpdater.serviceAccount.name }} +{{- end -}} +{{- end -}} + +{{/* +Create the name of the service account which topologyGC will use +*/}} +{{- define "node-feature-discovery.topologyGC.serviceAccountName" -}} +{{- if .Values.topologyGC.serviceAccount.create -}} + {{ default (printf "%s-topology-gc" (include "node-feature-discovery.fullname" .)) .Values.topologyGC.serviceAccount.name }} +{{- else -}} + {{ default "default" .Values.topologyGC.serviceAccount.name }} +{{- end -}} +{{- end -}} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/cert-manager-certs.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/cert-manager-certs.yaml new file mode 100644 index 00000000000..ac2e51fc11c --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/cert-manager-certs.yaml @@ -0,0 +1,67 @@ +{{- if .Values.tls.certManager }} +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: nfd-master-cert + namespace: {{ include "node-feature-discovery.namespace" . }} +spec: + secretName: nfd-master-cert + subject: + organizations: + - node-feature-discovery + commonName: nfd-master + dnsNames: + # must match the service name + - {{ include "node-feature-discovery.fullname" . }}-master + # first one is configured for use by the worker; below are for completeness + - {{ include "node-feature-discovery.fullname" . }}-master.{{ include "node-feature-discovery.namespace" . }}.svc + - {{ include "node-feature-discovery.fullname" . }}-master.{{ include "node-feature-discovery.namespace" . }}.svc.cluster.local + # localhost needed for grpc_health_probe + - localhost + issuerRef: + name: nfd-ca-issuer + kind: Issuer + group: cert-manager.io + +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: nfd-worker-cert + namespace: {{ include "node-feature-discovery.namespace" . }} +spec: + secretName: nfd-worker-cert + subject: + organizations: + - node-feature-discovery + commonName: nfd-worker + dnsNames: + - {{ include "node-feature-discovery.fullname" . }}-worker.{{ include "node-feature-discovery.namespace" . }}.svc.cluster.local + issuerRef: + name: nfd-ca-issuer + kind: Issuer + group: cert-manager.io + +{{- if .Values.topologyUpdater.enable }} +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: nfd-topology-updater-cert + namespace: {{ include "node-feature-discovery.namespace" . }} +spec: + secretName: nfd-topology-updater-cert + subject: + organizations: + - node-feature-discovery + commonName: nfd-topology-updater + dnsNames: + - {{ include "node-feature-discovery.fullname" . }}-topology-updater.{{ include "node-feature-discovery.namespace" . }}.svc.cluster.local + issuerRef: + name: nfd-ca-issuer + kind: Issuer + group: cert-manager.io +{{- end }} + +{{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/cert-manager-issuer.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/cert-manager-issuer.yaml new file mode 100644 index 00000000000..f3c57acea18 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/cert-manager-issuer.yaml @@ -0,0 +1,42 @@ +{{- if .Values.tls.certManager }} +# See https://cert-manager.io/docs/configuration/selfsigned/#bootstrapping-ca-issuers +# - Create a self signed issuer +# - Use this to create a CA cert +# - Use this to now create a CA issuer +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: nfd-ca-bootstrap + namespace: {{ include "node-feature-discovery.namespace" . }} +spec: + selfSigned: {} + +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: nfd-ca-cert + namespace: {{ include "node-feature-discovery.namespace" . }} +spec: + isCA: true + secretName: nfd-ca-cert + subject: + organizations: + - node-feature-discovery + commonName: nfd-ca-cert + issuerRef: + name: nfd-ca-bootstrap + kind: Issuer + group: cert-manager.io + +--- +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: nfd-ca-issuer + namespace: {{ include "node-feature-discovery.namespace" . }} +spec: + ca: + secretName: nfd-ca-cert +{{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/clusterrole.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/clusterrole.yaml new file mode 100644 index 00000000000..84b32644f51 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/clusterrole.yaml @@ -0,0 +1,97 @@ +{{- if .Values.master.rbac.create }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "node-feature-discovery.fullname" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +rules: +- apiGroups: + - "" + resources: + - nodes + - nodes/status + verbs: + - get + - patch + - update + - list +- apiGroups: + - nfd.k8s-sigs.io + resources: + - nodefeatures + - nodefeaturerules + verbs: + - get + - list + - watch +{{- end }} + +--- +{{- if and .Values.topologyUpdater.enable .Values.topologyUpdater.rbac.create }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-topology-updater + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +rules: +- apiGroups: + - "" + resources: + - nodes + verbs: + - get + - list +- apiGroups: + - "" + resources: + - nodes/proxy + verbs: + - get +- apiGroups: + - "" + resources: + - pods + verbs: + - get +- apiGroups: + - topology.node.k8s.io + resources: + - noderesourcetopologies + verbs: + - create + - get + - update +{{- end }} + +--- +{{- if and .Values.topologyGC.enable .Values.topologyGC.rbac.create .Values.topologyUpdater.enable }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-topology-gc + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +rules: +- apiGroups: + - "" + resources: + - nodes + verbs: + - list + - watch +- apiGroups: + - "" + resources: + - nodes/proxy + verbs: + - get +- apiGroups: + - topology.node.k8s.io + resources: + - noderesourcetopologies + verbs: + - delete + - list +{{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/clusterrolebinding.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/clusterrolebinding.yaml new file mode 100644 index 00000000000..b0a69012fd5 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/clusterrolebinding.yaml @@ -0,0 +1,52 @@ +{{- if .Values.master.rbac.create }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "node-feature-discovery.fullname" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "node-feature-discovery.fullname" . }} +subjects: +- kind: ServiceAccount + name: {{ include "node-feature-discovery.master.serviceAccountName" . }} + namespace: {{ include "node-feature-discovery.namespace" . }} +{{- end }} + +--- +{{- if and .Values.topologyUpdater.enable .Values.topologyUpdater.rbac.create }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-topology-updater + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "node-feature-discovery.fullname" . }}-topology-updater +subjects: +- kind: ServiceAccount + name: {{ include "node-feature-discovery.topologyUpdater.serviceAccountName" . }} + namespace: {{ include "node-feature-discovery.namespace" . }} +{{- end }} + +--- +{{- if and .Values.topologyGC.enable .Values.topologyGC.rbac.create .Values.topologyUpdater.enable }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-topology-gc + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: {{ include "node-feature-discovery.fullname" . }}-topology-gc +subjects: +- kind: ServiceAccount + name: {{ .Values.topologyGC.serviceAccount.name | default "nfd-topology-gc" }} + namespace: {{ include "node-feature-discovery.namespace" . }} +{{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/master.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/master.yaml new file mode 100644 index 00000000000..418ac089ddc --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/master.yaml @@ -0,0 +1,145 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-master + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} + role: master + annotations: + {{- toYaml .Values.master.deploymentAnnotations | nindent 4 }} +spec: + replicas: {{ .Values.master.replicaCount }} + selector: + matchLabels: + {{- include "node-feature-discovery.selectorLabels" . | nindent 6 }} + role: master + template: + metadata: + labels: + {{- include "node-feature-discovery.selectorLabels" . | nindent 8 }} + role: master + annotations: + {{- toYaml .Values.master.annotations | nindent 8 }} + spec: + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "node-feature-discovery.master.serviceAccountName" . }} + enableServiceLinks: false + securityContext: + {{- toYaml .Values.master.podSecurityContext | nindent 8 }} + containers: + - name: master + securityContext: + {{- toYaml .Values.master.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + livenessProbe: + exec: + command: + - "/usr/bin/grpc_health_probe" + - "-addr=:{{ .Values.master.port | default "8080" }}" + {{- if .Values.tls.enable }} + - "-tls" + - "-tls-ca-cert=/etc/kubernetes/node-feature-discovery/certs/ca.crt" + - "-tls-client-key=/etc/kubernetes/node-feature-discovery/certs/tls.key" + - "-tls-client-cert=/etc/kubernetes/node-feature-discovery/certs/tls.crt" + {{- end }} + initialDelaySeconds: 10 + periodSeconds: 10 + readinessProbe: + exec: + command: + - "/usr/bin/grpc_health_probe" + - "-addr=:{{ .Values.master.port | default "8080" }}" + {{- if .Values.tls.enable }} + - "-tls" + - "-tls-ca-cert=/etc/kubernetes/node-feature-discovery/certs/ca.crt" + - "-tls-client-key=/etc/kubernetes/node-feature-discovery/certs/tls.key" + - "-tls-client-cert=/etc/kubernetes/node-feature-discovery/certs/tls.crt" + {{- end }} + initialDelaySeconds: 5 + periodSeconds: 10 + failureThreshold: 10 + ports: + - containerPort: {{ .Values.master.port | default "8080" }} + name: grpc + env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + command: + - "nfd-master" + resources: + {{- toYaml .Values.master.resources | nindent 12 }} + args: + {{- if .Values.master.instance | empty | not }} + - "-instance={{ .Values.master.instance }}" + {{- end }} + - "-port={{ .Values.master.port | default "8080" }}" + {{- if .Values.enableNodeFeatureApi }} + - "-enable-nodefeature-api" + {{- end }} + {{- if .Values.master.extraLabelNs | empty | not }} + - "-extra-label-ns={{- join "," .Values.master.extraLabelNs }}" + {{- end }} + {{- if .Values.master.denyLabelNs | empty | not }} + - "-deny-label-ns={{- join "," .Values.master.denyLabelNs }}" + {{- end }} + {{- if .Values.master.resourceLabels | empty | not }} + - "-resource-labels={{- join "," .Values.master.resourceLabels }}" + {{- end }} + {{- if .Values.master.enableTaints }} + - "-enable-taints" + {{- end }} + {{- if .Values.master.crdController | kindIs "invalid" | not }} + - "-crd-controller={{ .Values.master.crdController }}" + {{- else }} + ## By default, disable crd controller for other than the default instances + - "-featurerules-controller={{ .Values.master.instance | empty }}" + {{- end }} + {{- if .Values.master.featureRulesController | kindIs "invalid" | not }} + - "-featurerules-controller={{ .Values.master.featureRulesController }}" + {{- end }} + {{- if .Values.tls.enable }} + - "-ca-file=/etc/kubernetes/node-feature-discovery/certs/ca.crt" + - "-key-file=/etc/kubernetes/node-feature-discovery/certs/tls.key" + - "-cert-file=/etc/kubernetes/node-feature-discovery/certs/tls.crt" + {{- end }} + volumeMounts: + {{- if .Values.tls.enable }} + - name: nfd-master-cert + mountPath: "/etc/kubernetes/node-feature-discovery/certs" + readOnly: true + {{- end }} + - name: nfd-master-conf + mountPath: "/etc/kubernetes/node-feature-discovery" + readOnly: true + volumes: + {{- if .Values.tls.enable }} + - name: nfd-master-cert + secret: + secretName: nfd-master-cert + {{- end }} + - name: nfd-master-conf + configMap: + name: {{ include "node-feature-discovery.fullname" . }}-master-conf + items: + - key: nfd-master.conf + path: nfd-master.conf + + {{- with .Values.master.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.master.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.master.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-master-conf.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-master-conf.yaml new file mode 100644 index 00000000000..c806a8e5d92 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-master-conf.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-master-conf + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +data: + nfd-master.conf: |- + {{- .Values.master.config | toYaml | nindent 4 }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-topologyupdater-conf.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-topologyupdater-conf.yaml new file mode 100644 index 00000000000..9867f5089cd --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-topologyupdater-conf.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-topology-updater-conf + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +data: + nfd-topology-updater.conf: |- + {{- .Values.topologyUpdater.config | toYaml | nindent 4 }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-worker-conf.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-worker-conf.yaml new file mode 100644 index 00000000000..61d2a481aa3 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/nfd-worker-conf.yaml @@ -0,0 +1,10 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-worker-conf + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +data: + nfd-worker.conf: |- + {{- .Values.worker.config | toYaml | nindent 4 }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/role.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/role.yaml new file mode 100644 index 00000000000..f63cb8ff4fe --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/role.yaml @@ -0,0 +1,18 @@ +{{- if .Values.worker.rbac.create }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-worker + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +rules: +- apiGroups: + - nfd.k8s-sigs.io + resources: + - nodefeatures + verbs: + - create + - get + - update +{{- end }} + diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/rolebinding.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/rolebinding.yaml new file mode 100644 index 00000000000..30a00381f05 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/rolebinding.yaml @@ -0,0 +1,17 @@ +{{- if .Values.worker.rbac.create }} +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-worker + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: {{ include "node-feature-discovery.fullname" . }}-worker +subjects: +- kind: ServiceAccount + name: {{ include "node-feature-discovery.worker.serviceAccountName" . }} + namespace: {{ include "node-feature-discovery.namespace" . }} +{{- end }} + diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/service.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/service.yaml new file mode 100644 index 00000000000..0d4789818fd --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/service.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Service +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-master + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} + role: master +spec: + type: {{ .Values.master.service.type }} + ports: + - port: {{ .Values.master.service.port | default "8080" }} + targetPort: grpc + protocol: TCP + name: grpc + selector: + {{- include "node-feature-discovery.selectorLabels" . | nindent 4 }} + role: master diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/serviceaccount.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/serviceaccount.yaml new file mode 100644 index 00000000000..03211e7c497 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/serviceaccount.yaml @@ -0,0 +1,58 @@ +{{- if .Values.master.serviceAccount.create -}} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "node-feature-discovery.master.serviceAccountName" . }} + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} + {{- with .Values.master.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} + +--- +{{- if and .Values.topologyUpdater.enable .Values.topologyUpdater.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "node-feature-discovery.topologyUpdater.serviceAccountName" . }} + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} + {{- with .Values.topologyUpdater.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} + +--- +{{- if and .Values.topologyGC.enable .Values.topologyGC.serviceAccount.create .Values.topologyUpdater.enable }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ .Values.topologyGC.serviceAccount.name | default "nfd-topology-gc" }} + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} + {{- with .Values.topologyUpdater.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} + +--- +{{- if .Values.worker.serviceAccount.create }} +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "node-feature-discovery.worker.serviceAccountName" . }} + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} + {{- with .Values.worker.serviceAccount.annotations }} + annotations: + {{- toYaml . | nindent 4 }} + {{- end }} +{{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topology-gc.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topology-gc.yaml new file mode 100644 index 00000000000..642fec45591 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topology-gc.yaml @@ -0,0 +1,64 @@ +{{- if and .Values.topologyGC.enable .Values.topologyUpdater.enable -}} +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-topology-gc + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} + role: topology-gc +spec: + replicas: {{ .Values.topologyGC.replicaCount | default 1 }} + selector: + matchLabels: + {{- include "node-feature-discovery.selectorLabels" . | nindent 6 }} + role: topology-gc + template: + metadata: + labels: + {{- include "node-feature-discovery.selectorLabels" . | nindent 8 }} + role: topology-gc + annotations: + {{- toYaml .Values.topologyGC.annotations | nindent 8 }} + spec: + serviceAccountName: {{ .Values.topologyGC.serviceAccountName | default "nfd-topology-gc" }} + dnsPolicy: ClusterFirstWithHostNet + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: + {{- toYaml .Values.topologyGC.podSecurityContext | nindent 8 }} + containers: + - name: topology-gc + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + command: + - "nfd-topology-gc" + args: + {{- if .Values.topologyGC.interval | empty | not }} + - "-gc-interval={{ .Values.topologyGC.interval }}" + {{- end }} + resources: + {{- toYaml .Values.topologyGC.resources | nindent 12 }} + securityContext: + {{- toYaml .Values.topologyGC.securityContext | nindent 12 }} + + {{- with .Values.topologyGC.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologyGC.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologyGC.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topologyupdater-crds.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topologyupdater-crds.yaml new file mode 100644 index 00000000000..b6b919689ce --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topologyupdater-crds.yaml @@ -0,0 +1,278 @@ +{{- if and .Values.topologyUpdater.enable .Values.topologyUpdater.createCRDs -}} +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + annotations: + api-approved.kubernetes.io: https://github.com/kubernetes/enhancements/pull/1870 + controller-gen.kubebuilder.io/version: v0.11.2 + creationTimestamp: null + name: noderesourcetopologies.topology.node.k8s.io +spec: + group: topology.node.k8s.io + names: + kind: NodeResourceTopology + listKind: NodeResourceTopologyList + plural: noderesourcetopologies + shortNames: + - node-res-topo + singular: noderesourcetopology + scope: Cluster + versions: + - name: v1alpha1 + schema: + openAPIV3Schema: + description: NodeResourceTopology describes node resources and their topology. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + topologyPolicies: + items: + type: string + type: array + zones: + description: ZoneList contains an array of Zone objects. + items: + description: Zone represents a resource topology zone, e.g. socket, + node, die or core. + properties: + attributes: + description: AttributeList contains an array of AttributeInfo objects. + items: + description: AttributeInfo contains one attribute of a Zone. + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + costs: + description: CostList contains an array of CostInfo objects. + items: + description: CostInfo describes the cost (or distance) between + two Zones. + properties: + name: + type: string + value: + format: int64 + type: integer + required: + - name + - value + type: object + type: array + name: + type: string + parent: + type: string + resources: + description: ResourceInfoList contains an array of ResourceInfo + objects. + items: + description: ResourceInfo contains information about one resource + type. + properties: + allocatable: + anyOf: + - type: integer + - type: string + description: Allocatable quantity of the resource, corresponding + to allocatable in node status, i.e. total amount of this + resource available to be used by pods. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + available: + anyOf: + - type: integer + - type: string + description: Available is the amount of this resource currently + available for new (to be scheduled) pods, i.e. Allocatable + minus the resources reserved by currently running pods. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + capacity: + anyOf: + - type: integer + - type: string + description: Capacity of the resource, corresponding to capacity + in node status, i.e. total amount of this resource that + the node has. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + name: + description: Name of the resource. + type: string + required: + - allocatable + - available + - capacity + - name + type: object + type: array + type: + type: string + required: + - name + - type + type: object + type: array + required: + - topologyPolicies + - zones + type: object + served: true + storage: false + - name: v1alpha2 + schema: + openAPIV3Schema: + description: NodeResourceTopology describes node resources and their topology. + properties: + apiVersion: + description: 'APIVersion defines the versioned schema of this representation + of an object. Servers should convert recognized schemas to the latest + internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' + type: string + attributes: + description: AttributeList contains an array of AttributeInfo objects. + items: + description: AttributeInfo contains one attribute of a Zone. + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + kind: + description: 'Kind is a string value representing the REST resource this + object represents. Servers may infer this from the endpoint the client + submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' + type: string + metadata: + type: object + topologyPolicies: + description: 'DEPRECATED (to be removed in v1beta1): use top level attributes + if needed' + items: + type: string + type: array + zones: + description: ZoneList contains an array of Zone objects. + items: + description: Zone represents a resource topology zone, e.g. socket, + node, die or core. + properties: + attributes: + description: AttributeList contains an array of AttributeInfo objects. + items: + description: AttributeInfo contains one attribute of a Zone. + properties: + name: + type: string + value: + type: string + required: + - name + - value + type: object + type: array + costs: + description: CostList contains an array of CostInfo objects. + items: + description: CostInfo describes the cost (or distance) between + two Zones. + properties: + name: + type: string + value: + format: int64 + type: integer + required: + - name + - value + type: object + type: array + name: + type: string + parent: + type: string + resources: + description: ResourceInfoList contains an array of ResourceInfo + objects. + items: + description: ResourceInfo contains information about one resource + type. + properties: + allocatable: + anyOf: + - type: integer + - type: string + description: Allocatable quantity of the resource, corresponding + to allocatable in node status, i.e. total amount of this + resource available to be used by pods. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + available: + anyOf: + - type: integer + - type: string + description: Available is the amount of this resource currently + available for new (to be scheduled) pods, i.e. Allocatable + minus the resources reserved by currently running pods. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + capacity: + anyOf: + - type: integer + - type: string + description: Capacity of the resource, corresponding to capacity + in node status, i.e. total amount of this resource that + the node has. + pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$ + x-kubernetes-int-or-string: true + name: + description: Name of the resource. + type: string + required: + - allocatable + - available + - capacity + - name + type: object + type: array + type: + type: string + required: + - name + - type + type: object + type: array + required: + - zones + type: object + served: true + storage: true +status: + acceptedNames: + kind: "" + plural: "" + conditions: [] + storedVersions: [] +{{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topologyupdater.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topologyupdater.yaml new file mode 100644 index 00000000000..cd3fca051e2 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/topologyupdater.yaml @@ -0,0 +1,142 @@ +{{- if .Values.topologyUpdater.enable -}} +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-topology-updater + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} + role: topology-updater +spec: + selector: + matchLabels: + {{- include "node-feature-discovery.selectorLabels" . | nindent 6 }} + role: topology-updater + template: + metadata: + labels: + {{- include "node-feature-discovery.selectorLabels" . | nindent 8 }} + role: topology-updater + annotations: + {{- toYaml .Values.topologyUpdater.annotations | nindent 8 }} + spec: + serviceAccountName: {{ include "node-feature-discovery.topologyUpdater.serviceAccountName" . }} + dnsPolicy: ClusterFirstWithHostNet + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + securityContext: + {{- toYaml .Values.topologyUpdater.podSecurityContext | nindent 8 }} + containers: + - name: topology-updater + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: "{{ .Values.image.pullPolicy }}" + env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + command: + - "nfd-topology-updater" + args: + - "-podresources-socket=/host-var/lib/kubelet-podresources/kubelet.sock" + {{- if .Values.topologyUpdater.updateInterval | empty | not }} + - "-sleep-interval={{ .Values.topologyUpdater.updateInterval }}" + {{- else }} + - "-sleep-interval=3s" + {{- end }} + {{- if .Values.topologyUpdater.watchNamespace | empty | not }} + - "-watch-namespace={{ .Values.topologyUpdater.watchNamespace }}" + {{- else }} + - "-watch-namespace=*" + {{- end }} + {{- if .Values.tls.enable }} + - "-ca-file=/etc/kubernetes/node-feature-discovery/certs/ca.crt" + - "-key-file=/etc/kubernetes/node-feature-discovery/certs/tls.key" + - "-cert-file=/etc/kubernetes/node-feature-discovery/certs/tls.crt" + {{- end }} + {{- if .Values.topologyUpdater.podSetFingerprint }} + - "-pods-fingerprint" + {{- end }} + {{- if .Values.topologyUpdater.kubeletConfigPath | empty | not }} + - "-kubelet-config-uri=file:///host-var/kubelet-config" + {{- end }} + {{- if .Values.topologyUpdater.kubeletStateDir | empty }} + # Disable kubelet state tracking by giving an empty path + - "-kubelet-state-dir=" + {{- end }} + volumeMounts: + {{- if .Values.topologyUpdater.kubeletConfigPath | empty | not }} + - name: kubelet-config + mountPath: /host-var/kubelet-config + {{- end }} + - name: kubelet-podresources-sock + mountPath: /host-var/lib/kubelet-podresources/kubelet.sock + - name: host-sys + mountPath: /host-sys + {{- if .Values.topologyUpdater.kubeletStateDir | empty | not }} + - name: kubelet-state-files + mountPath: /host-var/lib/kubelet + readOnly: true + {{- end }} + {{- if .Values.tls.enable }} + - name: nfd-topology-updater-cert + mountPath: "/etc/kubernetes/node-feature-discovery/certs" + readOnly: true + {{- end }} + - name: nfd-topology-updater-conf + mountPath: "/etc/kubernetes/node-feature-discovery" + readOnly: true + + resources: + {{- toYaml .Values.topologyUpdater.resources | nindent 12 }} + securityContext: + {{- toYaml .Values.topologyUpdater.securityContext | nindent 12 }} + volumes: + - name: host-sys + hostPath: + path: "/sys" + {{- if .Values.topologyUpdater.kubeletConfigPath | empty | not }} + - name: kubelet-config + hostPath: + path: {{ .Values.topologyUpdater.kubeletConfigPath }} + {{- end }} + - name: kubelet-podresources-sock + hostPath: + {{- if .Values.topologyUpdater.kubeletPodResourcesSockPath | empty | not }} + path: {{ .Values.topologyUpdater.kubeletPodResourcesSockPath }} + {{- else }} + path: /var/lib/kubelet/pod-resources/kubelet.sock + {{- end }} + {{- if .Values.topologyUpdater.kubeletStateDir | empty | not }} + - name: kubelet-state-files + hostPath: + path: {{ .Values.topologyUpdater.kubeletStateDir }} + {{- end }} + - name: nfd-topology-updater-conf + configMap: + name: {{ include "node-feature-discovery.fullname" . }}-topology-updater-conf + items: + - key: nfd-topology-updater.conf + path: nfd-topology-updater.conf + {{- if .Values.tls.enable }} + - name: nfd-topology-updater-cert + secret: + secretName: nfd-topology-updater-cert + {{- end }} + + + {{- with .Values.topologyUpdater.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologyUpdater.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.topologyUpdater.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} +{{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/worker.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/worker.yaml new file mode 100644 index 00000000000..c1240bdc935 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/templates/worker.yaml @@ -0,0 +1,144 @@ +apiVersion: apps/v1 +kind: DaemonSet +metadata: + name: {{ include "node-feature-discovery.fullname" . }}-worker + namespace: {{ include "node-feature-discovery.namespace" . }} + labels: + {{- include "node-feature-discovery.labels" . | nindent 4 }} + role: worker + annotations: + {{- toYaml .Values.worker.daemonsetAnnotations | nindent 4 }} +spec: + selector: + matchLabels: + {{- include "node-feature-discovery.selectorLabels" . | nindent 6 }} + role: worker + template: + metadata: + labels: + {{- include "node-feature-discovery.selectorLabels" . | nindent 8 }} + role: worker + annotations: + {{- toYaml .Values.worker.annotations | nindent 8 }} + spec: + dnsPolicy: ClusterFirstWithHostNet + {{- with .Values.imagePullSecrets }} + imagePullSecrets: + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccountName: {{ include "node-feature-discovery.worker.serviceAccountName" . }} + securityContext: + {{- toYaml .Values.worker.podSecurityContext | nindent 8 }} + containers: + - name: worker + securityContext: + {{- toYaml .Values.worker.securityContext | nindent 12 }} + image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}" + imagePullPolicy: {{ .Values.image.pullPolicy }} + env: + - name: NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + resources: + {{- toYaml .Values.worker.resources | nindent 12 }} + command: + - "nfd-worker" + args: + - "-server={{ include "node-feature-discovery.fullname" . }}-master:{{ .Values.master.service.port }}" + {{- if .Values.enableNodeFeatureApi }} + - "-enable-nodefeature-api" + {{- end }} +{{- if .Values.tls.enable }} + - "-ca-file=/etc/kubernetes/node-feature-discovery/certs/ca.crt" + - "-key-file=/etc/kubernetes/node-feature-discovery/certs/tls.key" + - "-cert-file=/etc/kubernetes/node-feature-discovery/certs/tls.crt" +{{- end }} + volumeMounts: + - name: host-boot + mountPath: "/host-boot" + readOnly: true + - name: host-os-release + mountPath: "/host-etc/os-release" + readOnly: true + - name: host-sys + mountPath: "/host-sys" + readOnly: true + - name: host-usr-lib + mountPath: "/host-usr/lib" + readOnly: true + - name: host-lib + mountPath: "/host-lib" + readOnly: true + {{- if .Values.worker.mountUsrSrc }} + - name: host-usr-src + mountPath: "/host-usr/src" + readOnly: true + {{- end }} + - name: source-d + mountPath: "/etc/kubernetes/node-feature-discovery/source.d/" + readOnly: true + - name: features-d + mountPath: "/etc/kubernetes/node-feature-discovery/features.d/" + readOnly: true + - name: nfd-worker-conf + mountPath: "/etc/kubernetes/node-feature-discovery" + readOnly: true +{{- if .Values.tls.enable }} + - name: nfd-worker-cert + mountPath: "/etc/kubernetes/node-feature-discovery/certs" + readOnly: true +{{- end }} + volumes: + - name: host-boot + hostPath: + path: "/boot" + - name: host-os-release + hostPath: + path: "/etc/os-release" + - name: host-sys + hostPath: + path: "/sys" + - name: host-usr-lib + hostPath: + path: "/usr/lib" + - name: host-lib + hostPath: + path: "/lib" + {{- if .Values.worker.mountUsrSrc }} + - name: host-usr-src + hostPath: + path: "/usr/src" + {{- end }} + - name: source-d + hostPath: + path: "/etc/kubernetes/node-feature-discovery/source.d/" + - name: features-d + hostPath: + path: "/etc/kubernetes/node-feature-discovery/features.d/" + - name: nfd-worker-conf + configMap: + name: {{ include "node-feature-discovery.fullname" . }}-worker-conf + items: + - key: nfd-worker.conf + path: nfd-worker.conf +{{- if .Values.tls.enable }} + - name: nfd-worker-cert + secret: + secretName: nfd-worker-cert +{{- end }} + {{- with .Values.worker.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.worker.affinity }} + affinity: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.worker.tolerations }} + tolerations: + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.worker.priorityClassName }} + priorityClassName: {{ . | quote }} + {{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/values.yaml b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/values.yaml new file mode 100644 index 00000000000..d16d19d1ff0 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/charts/rancher-nfd/values.yaml @@ -0,0 +1,484 @@ +image: + repository: rancher/hardened-node-feature-discovery + # This should be set to 'IfNotPresent' for released version + pullPolicy: IfNotPresent + # tag, if defined will use the given image tag, else Chart.AppVersion will be used + tag: v0.13.2-build20230605 +imagePullSecrets: [] + +nameOverride: "" +fullnameOverride: "" +namespaceOverride: "" + +enableNodeFeatureApi: false + +master: + config: ### + # noPublish: false + # extraLabelNs: ["added.ns.io","added.kubernets.io"] + # denyLabelNs: ["denied.ns.io","denied.kubernetes.io"] + # resourceLabels: ["vendor-1.com/feature-1","vendor-2.io/feature-2"] + # enableTaints: false + # labelWhiteList: "foo" + ### + # The TCP port that nfd-master listens for incoming requests. Default: 8080 + port: 8080 + instance: + featureApi: + denyLabelNs: [] + extraLabelNs: [] + resourceLabels: [] + enableTaints: false + crdController: null + featureRulesController: null + deploymentAnnotations: {} + replicaCount: 1 + + podSecurityContext: {} + # fsGroup: 2000 + + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: [ "ALL" ] + readOnlyRootFilesystem: true + runAsNonRoot: true + # runAsUser: 1000 + + serviceAccount: + # Specifies whether a service account should be created + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: + + rbac: + create: true + + service: + type: ClusterIP + port: 8080 + + resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + nodeSelector: {} + + tolerations: + - key: "node-role.kubernetes.io/master" + operator: "Equal" + value: "" + effect: "NoSchedule" + - key: "node-role.kubernetes.io/control-plane" + operator: "Equal" + value: "" + effect: "NoSchedule" + + annotations: {} + + affinity: + nodeAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - weight: 1 + preference: + matchExpressions: + - key: "node-role.kubernetes.io/master" + operator: In + values: [""] + - weight: 1 + preference: + matchExpressions: + - key: "node-role.kubernetes.io/control-plane" + operator: In + values: [""] + +worker: + config: ### + #core: + # labelWhiteList: + # noPublish: false + # sleepInterval: 60s + # featureSources: [all] + # labelSources: [all] + # klog: + # addDirHeader: false + # alsologtostderr: false + # logBacktraceAt: + # logtostderr: true + # skipHeaders: false + # stderrthreshold: 2 + # v: 0 + # vmodule: + ## NOTE: the following options are not dynamically run-time configurable + ## and require a nfd-worker restart to take effect after being changed + # logDir: + # logFile: + # logFileMaxSize: 1800 + # skipLogHeaders: false + #sources: + # cpu: + # cpuid: + ## NOTE: whitelist has priority over blacklist + # attributeBlacklist: + # - "BMI1" + # - "BMI2" + # - "CLMUL" + # - "CMOV" + # - "CX16" + # - "ERMS" + # - "F16C" + # - "HTT" + # - "LZCNT" + # - "MMX" + # - "MMXEXT" + # - "NX" + # - "POPCNT" + # - "RDRAND" + # - "RDSEED" + # - "RDTSCP" + # - "SGX" + # - "SSE" + # - "SSE2" + # - "SSE3" + # - "SSE4" + # - "SSE42" + # - "SSSE3" + # attributeWhitelist: + # kernel: + # kconfigFile: "/path/to/kconfig" + # configOpts: + # - "NO_HZ" + # - "X86" + # - "DMI" + # pci: + # deviceClassWhitelist: + # - "0200" + # - "03" + # - "12" + # deviceLabelFields: + # - "class" + # - "vendor" + # - "device" + # - "subsystem_vendor" + # - "subsystem_device" + # usb: + # deviceClassWhitelist: + # - "0e" + # - "ef" + # - "fe" + # - "ff" + # deviceLabelFields: + # - "class" + # - "vendor" + # - "device" + # local: + # hooksEnabled: true + # custom: + # # The following feature demonstrates the capabilities of the matchFeatures + # - name: "my custom rule" + # labels: + # my-ng-feature: "true" + # # matchFeatures implements a logical AND over all matcher terms in the + # # list (i.e. all of the terms, or per-feature matchers, must match) + # matchFeatures: + # - feature: cpu.cpuid + # matchExpressions: + # AVX512F: {op: Exists} + # - feature: cpu.cstate + # matchExpressions: + # enabled: {op: IsTrue} + # - feature: cpu.pstate + # matchExpressions: + # no_turbo: {op: IsFalse} + # scaling_governor: {op: In, value: ["performance"]} + # - feature: cpu.rdt + # matchExpressions: + # RDTL3CA: {op: Exists} + # - feature: cpu.sst + # matchExpressions: + # bf.enabled: {op: IsTrue} + # - feature: cpu.topology + # matchExpressions: + # hardware_multithreading: {op: IsFalse} + # + # - feature: kernel.config + # matchExpressions: + # X86: {op: Exists} + # LSM: {op: InRegexp, value: ["apparmor"]} + # - feature: kernel.loadedmodule + # matchExpressions: + # e1000e: {op: Exists} + # - feature: kernel.selinux + # matchExpressions: + # enabled: {op: IsFalse} + # - feature: kernel.version + # matchExpressions: + # major: {op: In, value: ["5"]} + # minor: {op: Gt, value: ["10"]} + # + # - feature: storage.block + # matchExpressions: + # rotational: {op: In, value: ["0"]} + # dax: {op: In, value: ["0"]} + # + # - feature: network.device + # matchExpressions: + # operstate: {op: In, value: ["up"]} + # speed: {op: Gt, value: ["100"]} + # + # - feature: memory.numa + # matchExpressions: + # node_count: {op: Gt, value: ["2"]} + # - feature: memory.nv + # matchExpressions: + # devtype: {op: In, value: ["nd_dax"]} + # mode: {op: In, value: ["memory"]} + # + # - feature: system.osrelease + # matchExpressions: + # ID: {op: In, value: ["fedora", "centos"]} + # - feature: system.name + # matchExpressions: + # nodename: {op: InRegexp, value: ["^worker-X"]} + # + # - feature: local.label + # matchExpressions: + # custom-feature-knob: {op: Gt, value: ["100"]} + # + # # The following feature demonstrates the capabilities of the matchAny + # - name: "my matchAny rule" + # labels: + # my-ng-feature-2: "my-value" + # # matchAny implements a logical IF over all elements (sub-matchers) in + # # the list (i.e. at least one feature matcher must match) + # matchAny: + # - matchFeatures: + # - feature: kernel.loadedmodule + # matchExpressions: + # driver-module-X: {op: Exists} + # - feature: pci.device + # matchExpressions: + # vendor: {op: In, value: ["8086"]} + # class: {op: In, value: ["0200"]} + # - matchFeatures: + # - feature: kernel.loadedmodule + # matchExpressions: + # driver-module-Y: {op: Exists} + # - feature: usb.device + # matchExpressions: + # vendor: {op: In, value: ["8086"]} + # class: {op: In, value: ["02"]} + # + # # The following features demonstreate label templating capabilities + # - name: "my template rule" + # labelsTemplate: | + # {{ range .system.osrelease }}my-system-feature.{{ .Name }}={{ .Value }} + # {{ end }} + # matchFeatures: + # - feature: system.osrelease + # matchExpressions: + # ID: {op: InRegexp, value: ["^open.*"]} + # VERSION_ID.major: {op: In, value: ["13", "15"]} + # + # - name: "my template rule 2" + # labelsTemplate: | + # {{ range .pci.device }}my-pci-device.{{ .class }}-{{ .device }}=with-cpuid + # {{ end }} + # matchFeatures: + # - feature: pci.device + # matchExpressions: + # class: {op: InRegexp, value: ["^06"]} + # vendor: ["8086"] + # - feature: cpu.cpuid + # matchExpressions: + # AVX: {op: Exists} + # + # # The following examples demonstrate vars field and back-referencing + # # previous labels and vars + # - name: "my dummy kernel rule" + # labels: + # "my.kernel.feature": "true" + # matchFeatures: + # - feature: kernel.version + # matchExpressions: + # major: {op: Gt, value: ["2"]} + # + # - name: "my dummy rule with no labels" + # vars: + # "my.dummy.var": "1" + # matchFeatures: + # - feature: cpu.cpuid + # matchExpressions: {} + # + # - name: "my rule using backrefs" + # labels: + # "my.backref.feature": "true" + # matchFeatures: + # - feature: rule.matched + # matchExpressions: + # my.kernel.feature: {op: IsTrue} + # my.dummy.var: {op: Gt, value: ["0"]} + # +### + + daemonsetAnnotations: {} + podSecurityContext: {} + # fsGroup: 2000 + + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: [ "ALL" ] + readOnlyRootFilesystem: true + runAsNonRoot: true + # runAsUser: 1000 + + serviceAccount: + # Specifies whether a service account should be created. + # We create this by default to make it easier for downstream users to apply PodSecurityPolicies. + create: true + # Annotations to add to the service account + annotations: {} + # The name of the service account to use. + # If not set and create is true, a name is generated using the fullname template + name: + + rbac: + create: true + + # Allow users to mount the hostPath /usr/src, useful for RHCOS on s390x + # Does not work on systems without /usr/src AND a read-only /usr, such as Talos + mountUsrSrc: false + + resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + nodeSelector: {} + + tolerations: [] + + annotations: {} + + affinity: {} + + priorityClassName: "" + +topologyUpdater: + config: ### + ## key = node name, value = list of resources to be excluded. + ## use * to exclude from all nodes. + ## an example for how the exclude list should looks like + #excludeList: + # node1: [cpu] + # node2: [memory, example/deviceA] + # *: [hugepages-2Mi] +### + + enable: false + createCRDs: false + + serviceAccount: + create: true + annotations: {} + name: + rbac: + create: true + + kubeletConfigPath: + kubeletPodResourcesSockPath: + updateInterval: 60s + watchNamespace: "*" + kubeletStateDir: /var/lib/kubelet + + podSecurityContext: {} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: [ "ALL" ] + readOnlyRootFilesystem: true + runAsUser: 0 + + resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + nodeSelector: {} + tolerations: [] + annotations: {} + affinity: {} + podSetFingerprint: true + +topologyGC: + enable: true + replicaCount: 1 + + serviceAccount: + create: true + annotations: {} + name: + rbac: + create: true + + interval: 1h + + podSecurityContext: {} + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: [ "ALL" ] + readOnlyRootFilesystem: true + runAsNonRoot: true + + resources: {} + # We usually recommend not to specify default resources and to leave this as a conscious + # choice for the user. This also increases chances charts run on environments with little + # resources, such as Minikube. If you do want to specify resources, uncomment the following + # lines, adjust them as necessary, and remove the curly braces after 'resources:'. + # limits: + # cpu: 100m + # memory: 128Mi + # requests: + # cpu: 100m + # memory: 128Mi + + nodeSelector: {} + tolerations: [] + annotations: {} + affinity: {} + +# Optionally use encryption for worker <--> master comms +# TODO: verify hostname is not yet supported +# +# If you do not enable certManager (and have it installed) you will +# need to manually, or otherwise, provision the TLS certs as secrets +tls: + enable: false + certManager: false diff --git a/charts/sriov/102.2.0+up0.1.0/templates/NOTES.txt b/charts/sriov/102.2.0+up0.1.0/templates/NOTES.txt new file mode 100644 index 00000000000..44a8bf935a9 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/NOTES.txt @@ -0,0 +1,17 @@ +Get Network Operator deployed resources by running the following commands: + +$ kubectl -n {{ .Release.Namespace }} get pods + +For additional instructions on how to use SR-IOV network operator, +refer to: https://github.com/k8snetworkplumbingwg/sriov-network-operator + +{{- if .Values.operator.enableAdmissionController }} +{{- if not .Values.cert_manager }} +Thank you for installing {{ .Chart.Name }}. + +WARNING! Self signed certificates have been generated for webhooks. +These certificates have a one-year validity and will not be rotated +automatically. This should not be a production cluster. Please deploy +and use cert-manager for production clusters. +{{- end }} +{{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/templates/_helpers.tpl b/charts/sriov/102.2.0+up0.1.0/templates/_helpers.tpl new file mode 100644 index 00000000000..dff1d171fee --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/_helpers.tpl @@ -0,0 +1,85 @@ +{{/* +Expand the name of the chart. +*/}} +{{- define "sriov-network-operator.name" -}} +{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Create a default fully qualified app name. +We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec). +If release name contains chart name it will be used as a full name. +*/}} +{{- define "sriov-network-operator.fullname" -}} +{{- if .Values.fullnameOverride }} +{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- $name := default .Chart.Name .Values.nameOverride }} +{{- if contains $name .Release.Name }} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- else }} +{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }} +{{- end }} +{{- end }} +{{- end }} + +{{/* +Create chart name and version as used by the chart label. +*/}} +{{- define "sriov-network-operator.chart" -}} +{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* +Common labels +*/}} +{{- define "sriov-network-operator.labels" -}} +helm.sh/chart: {{ include "sriov-network-operator.chart" . }} +{{ include "sriov-network-operator.selectorLabels" . }} +{{- if .Chart.AppVersion }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +{{- end }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +{{- end }} + +{{/* +Selector labels +*/}} +{{- define "sriov-network-operator.selectorLabels" -}} +app.kubernetes.io/name: {{ include "sriov-network-operator.name" . }} +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} + +{{/* +Create the name of the service account to use +*/}} +{{- define "sriov-network-operator.serviceAccountName" -}} +{{- if .Values.serviceAccount.create }} +{{- default (include "sriov-network-operator.fullname" .) .Values.serviceAccount.name }} +{{- else }} +{{- default "default" .Values.serviceAccount.name }} +{{- end }} +{{- end }} + +{{- define "system_default_registry" -}} +{{- if .Values.global.cattle.systemDefaultRegistry -}} +{{- printf "%s/" .Values.global.cattle.systemDefaultRegistry -}} +{{- else -}} +{{- "" -}} +{{- end -}} +{{- end -}} + +{{/* +Windows cluster will add default taint for linux nodes, +add below linux tolerations to workloads could be scheduled to those linux nodes +*/}} +{{- define "linux-node-tolerations" -}} +- key: "cattle.io/os" + value: "linux" + effect: "NoSchedule" + operator: "Equal" +{{- end -}} + +{{- define "linux-node-selector" -}} +kubernetes.io/os: linux +{{- end -}} diff --git a/charts/sriov/102.2.0+up0.1.0/templates/_webhook-certs.tpl b/charts/sriov/102.2.0+up0.1.0/templates/_webhook-certs.tpl new file mode 100644 index 00000000000..f1448968b2f --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/_webhook-certs.tpl @@ -0,0 +1,31 @@ +{{/* +Generate TLS certificates for webhooks. +Note: these 2 lines, that are repeated several times below, are a trick to +ensure the CA certs are generated only once: + $ca := .ca | default (genCA "sriov-network-operator.k8s.cni.cncf.io" 365) + $_ := set . "ca" $ca +Please, don't try to "simplify" them as without this trick, every generated +certificate would be signed by a different CA. +*/}} +{{- define "sriov_operator_ca_cert" }} +{{- $ca := .ca | default (genCA "sriov-network-operator.k8s.cni.cncf.io" 365) -}} +{{- $_ := set . "ca" $ca -}} +{{- printf "%s" $ca.Cert | b64enc -}} +{{- end }} +{{- define "sriov_operator_cert" }} +{{- $ca := .ca | default (genCA "sriov-network-operator.k8s.cni.cncf.io" 365) -}} +{{- $_ := set . "ca" $ca -}} +{{- $cn := printf "operator-webhook-service.%s.svc" .Release.Namespace -}} +{{- $cert := genSignedCert $cn nil (list $cn) 365 $ca -}} +tls.crt: {{ $cert.Cert | b64enc }} +tls.key: {{ $cert.Key | b64enc }} +{{- end }} +{{- define "sriov_resource_injector_cert" }} +{{- $ca := .ca | default (genCA "sriov-network-operator.k8s.cni.cncf.io" 365) -}} +{{- $_ := set . "ca" $ca -}} +{{- $cn := printf "network-resources-injector-service.%s.svc" .Release.Namespace -}} +{{- $cert := genSignedCert $cn nil (list $cn) 365 $ca -}} +tls.crt: {{ $cert.Cert | b64enc }} +tls.key: {{ $cert.Key | b64enc }} +{{- end }} + diff --git a/charts/sriov/102.2.0+up0.1.0/templates/certmanagercerts.yaml b/charts/sriov/102.2.0+up0.1.0/templates/certmanagercerts.yaml new file mode 100644 index 00000000000..e3575aa565a --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/certmanagercerts.yaml @@ -0,0 +1,41 @@ +{{- if and (.Values.operator.enableAdmissionController) (.Values.cert_manager) -}} +{{- if not (.Capabilities.APIVersions.Has "cert-manager.io/v1") -}} +{{- required "cert-manager is required but not found" "" -}} +{{- end -}} +apiVersion: cert-manager.io/v1 +kind: Issuer +metadata: + name: sriov-network-operator-selfsigned-issuer + namespace: {{ .Release.Namespace }} +spec: + selfSigned: {} +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: operator-webhook-service + namespace: {{ .Release.Namespace }} +spec: + secretName: operator-webhook-service + dnsNames: + - operator-webhook-service.{{ .Release.Namespace }}.svc + issuerRef: + name: sriov-network-operator-selfsigned-issuer + privateKey: + rotationPolicy: Always +--- +apiVersion: cert-manager.io/v1 +kind: Certificate +metadata: + name: network-resources-injector-service + namespace: {{ .Release.Namespace }} +spec: + secretName: network-resources-injector-secret + dnsNames: + - network-resources-injector-service.{{ .Release.Namespace }}.svc + issuerRef: + name: sriov-network-operator-selfsigned-issuer + privateKey: + rotationPolicy: Always +{{- end -}} + diff --git a/charts/sriov/102.2.0+up0.1.0/templates/clusterrole.yaml b/charts/sriov/102.2.0+up0.1.0/templates/clusterrole.yaml new file mode 100644 index 00000000000..da327471f07 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/clusterrole.yaml @@ -0,0 +1,109 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: {{ include "sriov-network-operator.fullname" . }} + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +rules: + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get", "list", "watch", "patch", "update"] + - apiGroups: [""] + resources: ["pods"] + verbs: ["*"] + - apiGroups: ["apps"] + resources: ["daemonsets"] + verbs: ["get"] + - apiGroups: [""] + resources: ["namespaces", "serviceaccounts"] + verbs: ["*"] + - apiGroups: ["k8s.cni.cncf.io"] + resources: ["network-attachment-definitions"] + verbs: ["*"] + - apiGroups: ["rbac.authorization.k8s.io"] + resources: ["clusterroles", "clusterrolebindings"] + verbs: ["*"] + - apiGroups: ["admissionregistration.k8s.io"] + resources: ["mutatingwebhookconfigurations", "validatingwebhookconfigurations"] + verbs: ["*"] + - apiGroups: ["sriovnetwork.openshift.io"] + resources: ["*"] + verbs: ["*"] + - apiGroups: ["machineconfiguration.openshift.io"] + resources: ["*"] + verbs: ["*"] + - apiGroups: ["config.openshift.io"] + resources: ["infrastructures"] + verbs: ["get", "list", "watch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: sriov-network-config-daemon + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +rules: + - apiGroups: [""] + resources: ["nodes"] + verbs: ["get", "list", "watch", "patch", "update"] + - apiGroups: [""] + resources: ["pods"] + verbs: ["*"] + - apiGroups: ["apps"] + resources: ["daemonsets"] + verbs: ["get"] + - apiGroups: [""] + resources: ["pods/eviction"] + verbs: ["create"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: sriov-admin + {{- if .Values.global.rbac.userRoles.aggregateToDefaultRoles }} + rbac.authorization.k8s.io/aggregate-to-admin: "true" + {{- end }} +rules: +- apiGroups: + - sriovnetwork.openshift.io + resources: + - '*' + verbs: + - "get" + - "watch" + - "list" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: sriov-edit + {{- if .Values.global.rbac.userRoles.aggregateToDefaultRoles }} + rbac.authorization.k8s.io/aggregate-to-edit: "true" + {{- end }} +rules: +- apiGroups: + - sriovnetwork.openshift.io + resources: + - '*' + verbs: + - "get" + - "watch" + - "list" +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: sriov-view + {{- if .Values.global.rbac.userRoles.aggregateToDefaultRoles }} + rbac.authorization.k8s.io/aggregate-to-view: "true" + {{- end }} +rules: +- apiGroups: + - sriovnetwork.openshift.io + resources: + - '*' + verbs: + - "get" + - "watch" + - "list" + diff --git a/charts/sriov/102.2.0+up0.1.0/templates/clusterrolebinding.yaml b/charts/sriov/102.2.0+up0.1.0/templates/clusterrolebinding.yaml new file mode 100644 index 00000000000..c10aa9be73d --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/clusterrolebinding.yaml @@ -0,0 +1,29 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: {{ include "sriov-network-operator.fullname" . }} + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +roleRef: + kind: ClusterRole + name: {{ include "sriov-network-operator.fullname" . }} + apiGroup: rbac.authorization.k8s.io +subjects: + - kind: ServiceAccount + namespace: {{ .Release.Namespace }} + name: {{ include "sriov-network-operator.fullname" . }} +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: sriov-network-config-daemon + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +roleRef: + kind: ClusterRole + name: sriov-network-config-daemon + apiGroup: rbac.authorization.k8s.io +subjects: + - kind: ServiceAccount + namespace: {{ .Release.Namespace }} + name: sriov-network-config-daemon diff --git a/charts/sriov/102.2.0+up0.1.0/templates/configmap.yaml b/charts/sriov/102.2.0+up0.1.0/templates/configmap.yaml new file mode 100644 index 00000000000..455bd91ff0e --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/configmap.yaml @@ -0,0 +1,25 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: supported-nic-ids +data: + Intel_i40e_XXV710: "8086 158a 154c" + Intel_i40e_25G_SFP28: "8086 158b 154c" + Intel_i40e_10G_X710_SFP: "8086 1572 154c" + Intel_i40e_XXV710_N3000: "8086 0d58 154c" + Intel_i40e_40G_XL710_QSFP: "8086 1583 154c" + Intel_ice_Columbiaville_E810-CQDA2_2CQDA2: "8086 1592 1889" + Intel_ice_Columbiaville_E810-XXVDA4: "8086 1593 1889" + Intel_ice_Columbiaville_E810-XXVDA2: "8086 159b 1889" + Intel_ice_Columbiaville_E810: "8086 1591 1889" + Nvidia_mlx5_ConnectX-4: "15b3 1013 1014" + Nvidia_mlx5_ConnectX-4LX: "15b3 1015 1016" + Nvidia_mlx5_ConnectX-5: "15b3 1017 1018" + Nvidia_mlx5_ConnectX-5_Ex: "15b3 1019 101a" + Nvidia_mlx5_ConnectX-6: "15b3 101b 101c" + Nvidia_mlx5_ConnectX-6_Dx: "15b3 101d 101e" + Nvidia_mlx5_MT42822_BlueField-2_integrated_ConnectX-6_Dx: "15b3 a2d6 101e" + Broadcom_bnxt_BCM57414_2x25G: "14e4 16d7 16dc" + Broadcom_bnxt_BCM75508_2x100G: "14e4 1750 1806" + Qlogic_qede_QL45000_50G: "1077 1654 1664" + Red_Hat_Virtio_network_device: "1af4 1000 1000" diff --git a/charts/sriov/102.2.0+up0.1.0/templates/operator.yaml b/charts/sriov/102.2.0+up0.1.0/templates/operator.yaml new file mode 100644 index 00000000000..0d39480e106 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/operator.yaml @@ -0,0 +1,98 @@ +{{- if not (.Capabilities.APIVersions.Has "k8s.cni.cncf.io/v1/NetworkAttachmentDefinition") -}} +{{- required "rke2-multus is required but not found" "" -}} +{{- end -}} +apiVersion: sriovnetwork.openshift.io/v1 +kind: SriovOperatorConfig +metadata: + name: default + namespace: {{ .Release.Namespace }} +spec: + # Add fields here + enableInjector: {{ .Values.operator.enableAdmissionController }} + enableOperatorWebhook: {{ .Values.operator.enableAdmissionController }} + configDaemonNodeSelector: {feature.node.kubernetes.io/network-sriov.capable: "true"} +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: {{ include "sriov-network-operator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +spec: + replicas: 1 + selector: + matchLabels: + name: sriov-network-operator + strategy: + type: RollingUpdate + rollingUpdate: + maxUnavailable: 33% + template: + metadata: + labels: + name: sriov-network-operator + spec: + nodeSelector: {{ include "linux-node-selector" . | nindent 8 }} +{{- if .Values.operator.nodeSelector }} +{{ toYaml .Values.operator.nodeSelector | indent 8 }} +{{- end }} + tolerations: {{ include "linux-node-tolerations" . | nindent 8 }} +{{- if .Values.operator.tolerations }} +{{ toYaml .Values.operator.tolerations | indent 8 }} +{{- end }} + serviceAccountName: {{ include "sriov-network-operator.fullname" . }} + priorityClassName: "system-node-critical" + containers: + - name: {{ include "sriov-network-operator.fullname" . }} + image: {{ include "system_default_registry" . }}{{ .Values.images.operator.repository }}:{{ .Values.images.operator.tag }} + command: + - sriov-network-operator + imagePullPolicy: IfNotPresent + resources: + requests: + cpu: 100m + memory: 100Mi + env: + - name: WATCH_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: SRIOV_CNI_IMAGE + value: {{ include "system_default_registry" . }}{{ .Values.images.sriovCni.repository }}:{{ .Values.images.sriovCni.tag }} + - name: SRIOV_INFINIBAND_CNI_IMAGE + value: {{ include "system_default_registry" . }}{{ .Values.images.ibSriovCni.repository }}:{{ .Values.images.ibSriovCni.tag }} + - name: SRIOV_DEVICE_PLUGIN_IMAGE + value: {{ include "system_default_registry" . }}{{ .Values.images.sriovDevicePlugin.repository }}:{{ .Values.images.sriovDevicePlugin.tag }} + - name: NETWORK_RESOURCES_INJECTOR_IMAGE + value: {{ include "system_default_registry" . }}{{ .Values.images.resourcesInjector.repository }}:{{ .Values.images.resourcesInjector.tag }} + - name: OPERATOR_NAME + value: sriov-network-operator + - name: SRIOV_NETWORK_CONFIG_DAEMON_IMAGE + value: {{ include "system_default_registry" . }}{{ .Values.images.sriovConfigDaemon.repository }}:{{ .Values.images.sriovConfigDaemon.tag }} + - name: SRIOV_NETWORK_WEBHOOK_IMAGE + value: {{ include "system_default_registry" . }}{{ .Values.images.webhook.repository }}:{{ .Values.images.webhook.tag }} + - name: RESOURCE_PREFIX + value: {{ .Values.operator.resourcePrefix }} + - name: ENABLE_ADMISSION_CONTROLLER + value: {{ .Values.operator.enableAdmissionController | quote }} + - name: NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: POD_NAME + valueFrom: + fieldRef: + fieldPath: metadata.name + - name: RELEASE_VERSION + value: {{ .Release.AppVersion }} + - name: SRIOV_CNI_BIN_PATH + value: {{ .Values.operator.cniBinPath }} + - name: CLUSTER_TYPE + value: {{ .Values.operator.clusterType }} + {{- if .Values.operator.enableAdmissionController }} + {{- if not .Values.cert_manager }} + - name: WEBHOOK_CA_BUNDLE + value: "{{ include "sriov_operator_ca_cert" . }}" + {{- end }} + {{- end }} diff --git a/charts/sriov/102.2.0+up0.1.0/templates/role.yaml b/charts/sriov/102.2.0+up0.1.0/templates/role.yaml new file mode 100644 index 00000000000..35a9d50afc4 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/role.yaml @@ -0,0 +1,125 @@ +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + creationTimestamp: null + name: {{ include "sriov-network-operator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +rules: + - apiGroups: + - "" + resources: + - pods + - services + - endpoints + - persistentvolumeclaims + - events + - configmaps + - secrets + verbs: + - '*' + - apiGroups: + - apps + resources: + - deployments + - daemonsets + - replicasets + - statefulsets + verbs: + - '*' + - apiGroups: + - monitoring.coreos.com + resources: + - servicemonitors + verbs: + - get + - create + - apiGroups: + - apps + resourceNames: + - sriov-network-operator + resources: + - deployments/finalizers + verbs: + - update + - apiGroups: + - rbac.authorization.k8s.io + resources: + - serviceaccounts + - roles + - rolebindings + verbs: + - '*' + - apiGroups: + - config.openshift.io + resources: + - infrastructures + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: sriov-network-config-daemon + namespace: {{ .Release.Namespace }} + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +rules: + - apiGroups: + - "" + resources: + - pods + verbs: + - '*' + - apiGroups: + - apps + resources: + - daemonsets + verbs: + - '*' + - apiGroups: + - sriovnetwork.openshift.io + resources: + - '*' + - sriovnetworknodestates + verbs: + - '*' + - apiGroups: + - security.openshift.io + resourceNames: + - privileged + resources: + - securitycontextconstraints + verbs: + - use + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get + - update + - apiGroups: + - 'coordination.k8s.io' + resources: + - 'leases' + verbs: + - '*' +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: operator-webhook-sa + namespace: {{ .Release.Namespace }} + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +rules: + - apiGroups: + - "" + resources: + - configmaps + verbs: + - get diff --git a/charts/sriov/102.2.0+up0.1.0/templates/rolebinding.yaml b/charts/sriov/102.2.0+up0.1.0/templates/rolebinding.yaml new file mode 100644 index 00000000000..d2cf1849a79 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/rolebinding.yaml @@ -0,0 +1,44 @@ +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: {{ include "sriov-network-operator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +subjects: + - kind: ServiceAccount + name: {{ include "sriov-network-operator.fullname" . }} + namespace: {{ .Release.Namespace }} +roleRef: + kind: Role + name: {{ include "sriov-network-operator.fullname" . }} + apiGroup: rbac.authorization.k8s.io +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: sriov-network-config-daemon + namespace: {{ .Release.Namespace }} + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +subjects: + - kind: ServiceAccount + name: sriov-network-config-daemon + namespace: {{ .Release.Namespace }} +roleRef: + kind: Role + name: sriov-network-config-daemon + apiGroup: rbac.authorization.k8s.io +--- +kind: RoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: operator-webhook-sa + namespace: {{ .Release.Namespace }} +subjects: +- kind: ServiceAccount + name: operator-webhook-sa +roleRef: + kind: Role + name: operator-webhook-sa + apiGroup: rbac.authorization.k8s.io diff --git a/charts/sriov/102.2.0+up0.1.0/templates/secrets.yaml b/charts/sriov/102.2.0+up0.1.0/templates/secrets.yaml new file mode 100644 index 00000000000..3d345be4601 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/secrets.yaml @@ -0,0 +1,20 @@ +{{- if not .Values.cert_manager -}} +{{- if .Values.operator.enableAdmissionController }} +apiVersion: v1 +kind: Secret +metadata: + name: operator-webhook-service + namespace: {{ .Release.Namespace }} +data: {{ include "sriov_operator_cert" . | nindent 2 }} +{{- end }} +--- +{{- if .Values.operator.enableAdmissionController }} +apiVersion: v1 +kind: Secret +metadata: + name: network-resources-injector-secret + namespace: {{ .Release.Namespace }} +data: {{ include "sriov_resource_injector_cert" . | nindent 2 }} +{{- end }} +{{- end }} + diff --git a/charts/sriov/102.2.0+up0.1.0/templates/serviceaccount.yaml b/charts/sriov/102.2.0+up0.1.0/templates/serviceaccount.yaml new file mode 100644 index 00000000000..fc0bb57056d --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/serviceaccount.yaml @@ -0,0 +1,15 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: {{ include "sriov-network-operator.fullname" . }} + namespace: {{ .Release.Namespace }} + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: sriov-network-config-daemon + namespace: {{ .Release.Namespace }} + labels: + {{- include "sriov-network-operator.labels" . | nindent 4 }} diff --git a/charts/sriov/102.2.0+up0.1.0/templates/validate-install-crd.yaml b/charts/sriov/102.2.0+up0.1.0/templates/validate-install-crd.yaml new file mode 100644 index 00000000000..48ffe707513 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/templates/validate-install-crd.yaml @@ -0,0 +1,19 @@ +#{{- if gt (len (lookup "rbac.authorization.k8s.io/v1" "ClusterRole" "" "")) 0 -}} +# {{- $found := dict -}} +# {{- set $found "sriovnetwork.openshift.io/v1/SriovIBNetwork" false -}} +# {{- set $found "sriovnetwork.openshift.io/v1/SriovNetworkNodePolicy" false -}} +# {{- set $found "sriovnetwork.openshift.io/v1/SriovNetworkNodeState" false -}} +# {{- set $found "sriovnetwork.openshift.io/v1/SriovNetworkPoolConfig" false -}} +# {{- set $found "sriovnetwork.openshift.io/v1/SriovNetwork" false -}} +# {{- set $found "sriovnetwork.openshift.io/v1/SriovOperatorConfig" false -}} +# {{- range .Capabilities.APIVersions -}} +# {{- if hasKey $found (toString .) -}} +# {{- set $found (toString .) true -}} +# {{- end -}} +# {{- end -}} +# {{- range $_, $exists := $found -}} +# {{- if (eq $exists false) -}} +# {{- required "Required CRDs are missing. Please install the corresponding CRD chart before installing this chart." "" -}} +# {{- end -}} +# {{- end -}} +#{{- end -}} \ No newline at end of file diff --git a/charts/sriov/102.2.0+up0.1.0/values.yaml b/charts/sriov/102.2.0+up0.1.0/values.yaml new file mode 100644 index 00000000000..386c57e8a54 --- /dev/null +++ b/charts/sriov/102.2.0+up0.1.0/values.yaml @@ -0,0 +1,64 @@ +operator: + tolerations: + - key: "node-role.kubernetes.io/control-plane" + operator: "Exists" + effect: "NoSchedule" + - effect: NoExecute + key: node-role.kubernetes.io/etcd + operator: Exists + nodeSelector: {} + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: "node-role.kubernetes.io/master" + operator: In + values: [ "" ] + - matchExpressions: + - key: "node-role.kubernetes.io/control-plane" + operator: In + values: [ "" ] + nameOverride: "" + fullnameOverride: "" + resourcePrefix: "rancher.io" + enableAdmissionController: false + cniBinPath: "/opt/cni/bin" + clusterType: "kubernetes" + +# Image URIs for sriov-network-operator components +images: + operator: + repository: rancher/hardened-sriov-network-operator + tag: v1.2.0-build20221014 + sriovConfigDaemon: + repository: rancher/hardened-sriov-network-config-daemon + tag: v1.2.0-build20221014 + sriovCni: + repository: rancher/hardened-sriov-cni + tag: v2.6.3-build20221014 + ibSriovCni: + repository: rancher/hardened-ib-sriov-cni + tag: v1.0.2-build20221014 + sriovDevicePlugin: + repository: rancher/hardened-sriov-network-device-plugin + tag: v3.5.1-build20221014 + resourcesInjector: + repository: rancher/hardened-sriov-network-resources-injector + tag: v1.5-build20221014 + webhook: + repository: rancher/hardened-sriov-network-webhook + tag: v1.2.0-build20221014 + +# cert_manager enables integration with cert-manager to generate +# certificates for the operator webhooks. Otherwise the chart will +# generate ad-hoc certificates with no automated renewal at expiration, +# not recommended for production clusters. +cert_manager: false + +global: + cattle: + systemDefaultRegistry: "" + rbac: + userRoles: + aggregateToDefaultRoles: false diff --git a/index.yaml b/index.yaml index 0a67cbf3eb0..a09667ade27 100755 --- a/index.yaml +++ b/index.yaml @@ -16634,6 +16634,39 @@ entries: - assets/rio/rio-0.8.000.tgz version: 0.8.000 sriov: + - annotations: + catalog.cattle.io/auto-install: sriov-crd=match + catalog.cattle.io/certified: rancher + catalog.cattle.io/experimental: "true" + catalog.cattle.io/kube-version: '>= 1.16.0-0 < 1.28.0-0' + catalog.cattle.io/namespace: cattle-sriov-system + catalog.cattle.io/os: linux + catalog.cattle.io/permits-os: linux + catalog.cattle.io/rancher-version: '>= 2.7.0-0 < 2.8.0-0' + catalog.cattle.io/release-name: sriov + catalog.cattle.io/upstream-version: 1.2.0 + apiVersion: v2 + appVersion: 1.2.0 + created: "2024-02-08T16:15:46.293259013-07:00" + description: SR-IOV network operator configures and manages SR-IOV networks in + the kubernetes cluster + digest: 8ed88b0f25500f5db87eba4e36f1d0eb993b424179cc29bbc262a2b31b497789 + home: https://github.com/k8snetworkplumbingwg/sriov-network-operator + icon: https://charts.rancher.io/assets/logos/sr-iov.svg + keywords: + - sriov + - Networking + kubeVersion: '>= 1.16.0' + maintainers: + - email: charts@rancher.com + name: Rancher Labs + name: sriov + sources: + - https://github.com/rancher/charts + type: application + urls: + - assets/sriov/sriov-102.2.0+up0.1.0.tgz + version: 102.2.0+up0.1.0 - annotations: catalog.cattle.io/auto-install: sriov-crd=match catalog.cattle.io/certified: rancher @@ -16929,6 +16962,22 @@ entries: - assets/sriov/sriov-100.0.0+up0.1.0.tgz version: 100.0.0+up0.1.0 sriov-crd: + - annotations: + catalog.cattle.io/certified: rancher + catalog.cattle.io/experimental: "true" + catalog.cattle.io/hidden: "true" + catalog.cattle.io/namespace: cattle-sriov-system + catalog.cattle.io/permits-os: linux + catalog.cattle.io/release-name: sriov-crd + apiVersion: v2 + created: "2024-02-06T09:33:36.295924514-07:00" + description: Installs the CRDs for rke2-sriov. + digest: 454b9d57ad3065e4ebfd41534e375559264219b00a9e65e40aacebb4dd301730 + name: sriov-crd + type: application + urls: + - assets/sriov-crd/sriov-crd-102.2.0+up0.1.0.tgz + version: 102.2.0+up0.1.0 - annotations: catalog.cattle.io/certified: rancher catalog.cattle.io/experimental: "true"