Skip to content

Kubernetes-collocated

First ensure the pre-requisites are met

Install SDC Components#

Once the cluster is deployed we install the sdc components. These manifests deploy sdc as a deployment where the pod contains 2 containers:

  1. the config-server container with the various controllers
  2. the data-server/schema-server/cache collocated in a single container

To install SDCIO, copy the following snippet into a shell and execute it.

kubectl apply -f https://docs.sdcio.dev/artifacts/basic-usage/colocated.yaml

Artifact Content
---
apiVersion: v1
kind: Namespace
metadata:
  name: network-system

---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.12.1
  name: schemas.inv.sdcio.dev
spec:
  group: inv.sdcio.dev
  names:
    categories:
    - sdc
    - inv
    kind: Schema
    listKind: SchemaList
    plural: schemas
    singular: schema
  scope: Namespaced
  versions:
  - additionalPrinterColumns:
    - jsonPath: .status.conditions[?(@.type=='Ready')].status
      name: READY
      type: string
    - jsonPath: .spec.repoURL
      name: URL
      type: string
    - jsonPath: .spec.ref
      name: REF
      type: string
    - jsonPath: .spec.provider
      name: PROVIDER
      type: string
    - jsonPath: .spec.version
      name: VERSION
      type: string
    name: v1alpha1
    schema:
      openAPIV3Schema:
        description: Schema is the Schema for the Schema 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: SchemaSpec defines the desired state of Schema
            properties:
              credentials:
                description: Credentials defines the name of the secret that holds
                  the credentials to connect to the repo
                type: string
                x-kubernetes-validations:
                - message: credentials is immutable
                  rule: self == oldSelf
              dirs:
                description: Dirs defines the list of directories that identified
                  the provider schema in src/dst pairs relative within the repository
                items:
                  description: SrcDstPath provide a src/dst pair for the loader to
                    download the schema from a specific src in the repository to a
                    given destination in the schema server
                  properties:
                    dst:
                      description: Dst is the relative directory in the schema server
                      type: string
                    src:
                      description: Src is the relative directory in the repository
                        URL
                      type: string
                  required:
                  - dst
                  - src
                  type: object
                maxItems: 10
                type: array
                x-kubernetes-validations:
                - message: dirs is immutable
                  rule: oldSelf.all(x, x in self)
              kind:
                default: tag
                description: Kind defines the that the BranchOrTag string is a repository
                  branch or a tag
                enum:
                - branch
                - tag
                type: string
              provider:
                description: Provider specifies the provider of the schema.
                type: string
                x-kubernetes-validations:
                - message: provider is immutable
                  rule: self == oldSelf
              ref:
                description: Ref defines the branch or tag of the repository corresponding
                  to the provider schema version
                type: string
                x-kubernetes-validations:
                - message: ref is immutable
                  rule: self == oldSelf
              repoURL:
                description: URL specifies the base URL for a given repository
                type: string
                x-kubernetes-validations:
                - message: url is immutable
                  rule: self == oldSelf
              schema:
                description: Schema provides the details of which files must be used
                  for the models and which files/directories cana be excludes
                properties:
                  excludes:
                    description: Excludes defines the list of files/directories to
                      be excluded
                    items:
                      type: string
                    maxItems: 64
                    type: array
                    x-kubernetes-validations:
                    - message: excludes is immutable
                      rule: oldSelf.all(x, x in self)
                  includes:
                    description: Excludes defines the list of files/directories to
                      be excluded
                    items:
                      type: string
                    maxItems: 64
                    type: array
                    x-kubernetes-validations:
                    - message: includes is immutable
                      rule: oldSelf.all(x, x in self)
                  models:
                    description: Models defines the list of files/directories to be
                      used as a model
                    items:
                      type: string
                    maxItems: 64
                    type: array
                    x-kubernetes-validations:
                    - message: models is immutable
                      rule: oldSelf.all(x, x in self)
                type: object
              version:
                description: Version defines the version of the schema
                type: string
                x-kubernetes-validations:
                - message: version is immutable
                  rule: self == oldSelf
            required:
            - kind
            - provider
            - ref
            - repoURL
            - schema
            - version
            type: object
          status:
            description: SchemaStatus defines the observed state of Schema
            properties:
              conditions:
                description: Conditions of the resource.
                items:
                  properties:
                    lastTransitionTime:
                      description: lastTransitionTime is the last time the condition
                        transitioned from one status to another. This should be when
                        the underlying condition changed.  If that is not known, then
                        using the time when the API field changed is acceptable.
                      format: date-time
                      type: string
                    message:
                      description: message is a human readable message indicating
                        details about the transition. This may be an empty string.
                      maxLength: 32768
                      type: string
                    observedGeneration:
                      description: observedGeneration represents the .metadata.generation
                        that the condition was set based upon. For instance, if .metadata.generation
                        is currently 12, but the .status.conditions[x].observedGeneration
                        is 9, the condition is out of date with respect to the current
                        state of the instance.
                      format: int64
                      minimum: 0
                      type: integer
                    reason:
                      description: reason contains a programmatic identifier indicating
                        the reason for the condition's last transition. Producers
                        of specific condition types may define expected values and
                        meanings for this field, and whether the values are considered
                        a guaranteed API. The value should be a CamelCase string.
                        This field may not be empty.
                      maxLength: 1024
                      minLength: 1
                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
                      type: string
                    status:
                      description: status of the condition, one of True, False, Unknown.
                      enum:
                      - "True"
                      - "False"
                      - Unknown
                      type: string
                    type:
                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
                        --- Many .condition.type values are consistent across resources
                        like Available, but because arbitrary conditions can be useful
                        (see .node.status.conditions), the ability to deconflict is
                        important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
                      maxLength: 316
                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
                      type: string
                  required:
                  - lastTransitionTime
                  - message
                  - reason
                  - status
                  - type
                  type: object
                type: array
            type: object
        type: object
    served: true
    storage: true
    subresources:
      status: {}

---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.12.1
  name: discoveryrules.inv.sdcio.dev
spec:
  group: inv.sdcio.dev
  names:
    categories:
    - sdc
    - inv
    kind: DiscoveryRule
    listKind: DiscoveryRuleList
    plural: discoveryrules
    singular: discoveryrule
  scope: Namespaced
  versions:
  - additionalPrinterColumns:
    - jsonPath: .status.conditions[?(@.type=='Ready')].status
      name: READY
      type: string
    name: v1alpha1
    schema:
      openAPIV3Schema:
        description: DiscoveryRule is the Schema for the DiscoveryRule 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: DiscoveryRuleSpec defines the desired state of DiscoveryRule
            properties:
              addresses:
                description: IP Prefixes for which this discovery rule applies
                items:
                  properties:
                    address:
                      description: Address (specified as IP or DNS name) of the target/target(s)
                      type: string
                    hostName:
                      description: HostName of the ip prefix; used for /32 or /128
                        addresses with discovery disabled
                      type: string
                  required:
                  - address
                  type: object
                type: array
              concurrentScans:
                description: number of concurrent IP scan
                format: int64
                type: integer
              defaultSchema:
                description: DefaultSchema define the default schema used to connect
                  to a target Indicates that discovery is disable; cannot be used
                  for prefix based discovery rules
                properties:
                  provider:
                    description: Provider specifies the provider of the schema.
                    type: string
                  version:
                    description: Version defines the version of the schema
                    type: string
                required:
                - provider
                - version
                type: object
              discoveryProfile:
                description: DiscoveryProfile define the profiles the discovery controller
                  uses to discover targets
                properties:
                  connectionProfiles:
                    description: ConnectionProfiles define the list of profiles the
                      discovery controller uses to discover the target. The order
                      in which they are specified is the order in which discovery
                      is executed.
                    items:
                      type: string
                    type: array
                  credentials:
                    description: Credentials defines the name of the secret that holds
                      the credentials to connect to the target
                    type: string
                  tlsSecret:
                    description: TLSSecret defines the name of the TLS secret to connect
                      to the target if mtls is used
                    type: string
                required:
                - connectionProfiles
                - credentials
                type: object
              period:
                description: Period defines the wait period between discovery rule
                  runs
                type: string
              podSelector:
                description: PodSelector defines the pod selector for which this discovery
                  rule applies
                properties:
                  matchExpressions:
                    description: matchExpressions is a list of label selector requirements.
                      The requirements are ANDed.
                    items:
                      description: A label selector requirement is a selector that
                        contains values, a key, and an operator that relates the key
                        and values.
                      properties:
                        key:
                          description: key is the label key that the selector applies
                            to.
                          type: string
                        operator:
                          description: operator represents a key's relationship to
                            a set of values. Valid operators are In, NotIn, Exists
                            and DoesNotExist.
                          type: string
                        values:
                          description: values is an array of string values. If the
                            operator is In or NotIn, the values array must be non-empty.
                            If the operator is Exists or DoesNotExist, the values
                            array must be empty. This array is replaced during a strategic
                            merge patch.
                          items:
                            type: string
                          type: array
                          x-kubernetes-list-type: atomic
                      required:
                      - key
                      - operator
                      type: object
                    type: array
                    x-kubernetes-list-type: atomic
                  matchLabels:
                    additionalProperties:
                      type: string
                    description: matchLabels is a map of {key,value} pairs. A single
                      {key,value} in the matchLabels map is equivalent to an element
                      of matchExpressions, whose key field is "key", the operator
                      is "In", and the values array contains only "value". The requirements
                      are ANDed.
                    type: object
                type: object
                x-kubernetes-map-type: atomic
              prefixes:
                description: IP Prefixes for which this discovery rule applies
                items:
                  properties:
                    excludes:
                      description: IP Prefixes to be excluded
                      items:
                        type: string
                      type: array
                    prefix:
                      description: Prefix of the target/target(s)
                      type: string
                  required:
                  - prefix
                  type: object
                type: array
              serviceDomain:
                description: ServiceDomain defines the service domain of the cluster,
                  used by svc discovery to identify the domain name in the k8s cluster
                  where the service reside.
                type: string
              serviceSelector:
                description: ServiceSelector defines the service selector for which
                  this discovery rule applies
                properties:
                  matchExpressions:
                    description: matchExpressions is a list of label selector requirements.
                      The requirements are ANDed.
                    items:
                      description: A label selector requirement is a selector that
                        contains values, a key, and an operator that relates the key
                        and values.
                      properties:
                        key:
                          description: key is the label key that the selector applies
                            to.
                          type: string
                        operator:
                          description: operator represents a key's relationship to
                            a set of values. Valid operators are In, NotIn, Exists
                            and DoesNotExist.
                          type: string
                        values:
                          description: values is an array of string values. If the
                            operator is In or NotIn, the values array must be non-empty.
                            If the operator is Exists or DoesNotExist, the values
                            array must be empty. This array is replaced during a strategic
                            merge patch.
                          items:
                            type: string
                          type: array
                          x-kubernetes-list-type: atomic
                      required:
                      - key
                      - operator
                      type: object
                    type: array
                    x-kubernetes-list-type: atomic
                  matchLabels:
                    additionalProperties:
                      type: string
                    description: matchLabels is a map of {key,value} pairs. A single
                      {key,value} in the matchLabels map is equivalent to an element
                      of matchExpressions, whose key field is "key", the operator
                      is "In", and the values array contains only "value". The requirements
                      are ANDed.
                    type: object
                type: object
                x-kubernetes-map-type: atomic
              targetConnectionProfiles:
                description: TargetConnectionProfiles define the profile the discovery
                  controller uses to create targets once discovered
                items:
                  properties:
                    connectionProfile:
                      description: ConnectionProfile define the profile used to connect
                        to the target once discovered
                      type: string
                    credentials:
                      description: Credentials defines the name of the secret that
                        holds the credentials to connect to the target
                      type: string
                    syncProfile:
                      description: SyncProfile define the profile used to sync to
                        the target config once discovered
                      type: string
                    tlsSecret:
                      description: TLSSecret defines the name of the TLS secret to
                        connect to the target if mtls is used
                      type: string
                  required:
                  - connectionProfile
                  - credentials
                  type: object
                type: array
              targetTemplate:
                description: TargetTemplate defines the template the discovery controller
                  uses to create the targets as a result of the discovery
                properties:
                  annotations:
                    additionalProperties:
                      type: string
                    description: Annotations is a key value map to be copied to the
                      target CR.
                    type: object
                  labels:
                    additionalProperties:
                      type: string
                    description: Labels is a key value map to be copied to the target
                      CR.
                    type: object
                  nameTemplate:
                    description: target name template
                    type: string
                    x-kubernetes-validations:
                    - message: nameTemplate is immutable
                      rule: self == oldSelf
                type: object
            required:
            - targetConnectionProfiles
            type: object
          status:
            description: DiscoveryRuleStatus defines the observed state of DiscoveryRule
            properties:
              conditions:
                description: Conditions of the resource.
                items:
                  properties:
                    lastTransitionTime:
                      description: lastTransitionTime is the last time the condition
                        transitioned from one status to another. This should be when
                        the underlying condition changed.  If that is not known, then
                        using the time when the API field changed is acceptable.
                      format: date-time
                      type: string
                    message:
                      description: message is a human readable message indicating
                        details about the transition. This may be an empty string.
                      maxLength: 32768
                      type: string
                    observedGeneration:
                      description: observedGeneration represents the .metadata.generation
                        that the condition was set based upon. For instance, if .metadata.generation
                        is currently 12, but the .status.conditions[x].observedGeneration
                        is 9, the condition is out of date with respect to the current
                        state of the instance.
                      format: int64
                      minimum: 0
                      type: integer
                    reason:
                      description: reason contains a programmatic identifier indicating
                        the reason for the condition's last transition. Producers
                        of specific condition types may define expected values and
                        meanings for this field, and whether the values are considered
                        a guaranteed API. The value should be a CamelCase string.
                        This field may not be empty.
                      maxLength: 1024
                      minLength: 1
                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
                      type: string
                    status:
                      description: status of the condition, one of True, False, Unknown.
                      enum:
                      - "True"
                      - "False"
                      - Unknown
                      type: string
                    type:
                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
                        --- Many .condition.type values are consistent across resources
                        like Available, but because arbitrary conditions can be useful
                        (see .node.status.conditions), the ability to deconflict is
                        important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
                      maxLength: 316
                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
                      type: string
                  required:
                  - lastTransitionTime
                  - message
                  - reason
                  - status
                  - type
                  type: object
                type: array
              startTime:
                description: StartTime identifies when the dr got started
                format: date-time
                type: string
            type: object
        type: object
    served: true
    storage: true
    subresources:
      status: {}

---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.12.1
  name: targetconnectionprofiles.inv.sdcio.dev
spec:
  group: inv.sdcio.dev
  names:
    categories:
    - sdc
    - inv
    kind: TargetConnectionProfile
    listKind: TargetConnectionProfileList
    plural: targetconnectionprofiles
    singular: targetconnectionprofile
  scope: Namespaced
  versions:
  - name: v1alpha1
    schema:
      openAPIV3Schema:
        description: TargetConnectionProfile is the Schema for the TargetConnectionProfile
          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: TargetConnectionProfileSpec defines the desired state of
              TargetConnectionProfile
            properties:
              commitCandidate:
                default: candidate
                enum:
                - candidate
                - running
                type: string
                x-kubernetes-validations:
                - message: UseOperationRemove is immutable
                  rule: self == oldSelf
              connectRetry:
                default: 10s
                type: string
                x-kubernetes-validations:
                - message: connectRetry is immutable
                  rule: self == oldSelf
              encoding:
                default: ASCII
                enum:
                - unknown
                - JSON
                - JSON_IETF
                - bytes
                - protobuf
                - ASCII
                - config
                type: string
                x-kubernetes-validations:
                - message: encoding is immutable
                  rule: self == oldSelf
              includeNS:
                default: false
                type: boolean
                x-kubernetes-validations:
                - message: includeNS is immutable
                  rule: self == oldSelf
              insecure:
                default: false
                type: boolean
                x-kubernetes-validations:
                - message: insecure is immutable
                  rule: self == oldSelf
              operationWithNS:
                default: false
                type: boolean
                x-kubernetes-validations:
                - message: operationWithNS is immutable
                  rule: self == oldSelf
              port:
                default: 57400
                description: Port defines the port on which the scan runs
                type: integer
                x-kubernetes-validations:
                - message: port is immutable
                  rule: self == oldSelf
              preferredNetconfVersion:
                default: "1.0"
                enum:
                - "1.0"
                - "1.1"
                type: string
                x-kubernetes-validations:
                - message: preferredNetconfVersion is immutable
                  rule: self == oldSelf
              protocol:
                default: gnmi
                enum:
                - unknown
                - gnmi
                - netconf
                - noop
                type: string
                x-kubernetes-validations:
                - message: protocol is immutable
                  rule: self == oldSelf
              skipVerify:
                default: true
                type: boolean
                x-kubernetes-validations:
                - message: skipVerify is immutable
                  rule: self == oldSelf
              timeout:
                default: 10s
                type: string
                x-kubernetes-validations:
                - message: timeout is immutable
                  rule: self == oldSelf
              useOperationRemove:
                default: false
                type: boolean
                x-kubernetes-validations:
                - message: UseOperationRemove is immutable
                  rule: self == oldSelf
            required:
            - port
            - protocol
            type: object
        type: object
    served: true
    storage: true

---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.12.1
  name: targetsyncprofiles.inv.sdcio.dev
spec:
  group: inv.sdcio.dev
  names:
    categories:
    - sdc
    - inv
    kind: TargetSyncProfile
    listKind: TargetSyncProfileList
    plural: targetsyncprofiles
    singular: targetsyncprofile
  scope: Namespaced
  versions:
  - name: v1alpha1
    schema:
      openAPIV3Schema:
        description: TargetSyncProfile is the Schema for the TargetSyncProfile 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: TargetSyncProfileSpec defines the desired state of TargetSyncProfile
            properties:
              buffer:
                default: 0
                format: int64
                type: integer
                x-kubernetes-validations:
                - message: buffer is immutable
                  rule: self == oldSelf
              sync:
                items:
                  description: TargetSyncProfileSync defines the desired state of
                    TargetSyncProfileSync
                  properties:
                    encoding:
                      default: ASCII
                      enum:
                      - unknown
                      - JSON
                      - JSON_IETF
                      - bytes
                      - protobuf
                      - ASCII
                      - config
                      type: string
                    interval:
                      default: 60s
                      type: string
                    mode:
                      enum:
                      - unknown
                      - onChange
                      - sample
                      - once
                      - get
                      type: string
                    name:
                      type: string
                    paths:
                      items:
                        type: string
                      maxItems: 10
                      type: array
                    protocol:
                      default: gnmi
                      enum:
                      - unknown
                      - gnmi
                      - netconf
                      - noop
                      type: string
                  required:
                  - mode
                  - name
                  - paths
                  - protocol
                  type: object
                maxItems: 10
                type: array
                x-kubernetes-validations:
                - message: sync may only be added
                  rule: oldSelf.all(x, x in self)
              validate:
                default: true
                type: boolean
                x-kubernetes-validations:
                - message: validate is immutable
                  rule: self == oldSelf
              workers:
                default: 10
                format: int64
                type: integer
                x-kubernetes-validations:
                - message: workers is immutable
                  rule: self == oldSelf
            type: object
            x-kubernetes-validations:
            - message: sync is required once set
              rule: '!has(oldSelf.sync) || has(self.sync)'
        type: object
    served: true
    storage: true

---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  annotations:
    controller-gen.kubebuilder.io/version: v0.12.1
  name: targets.inv.sdcio.dev
spec:
  group: inv.sdcio.dev
  names:
    categories:
    - sdc
    - inv
    kind: Target
    listKind: TargetList
    plural: targets
    singular: target
  scope: Namespaced
  versions:
  - additionalPrinterColumns:
    - jsonPath: .status.conditions[?(@.type=='Ready')].status
      name: READY
      type: string
    - jsonPath: .status.conditions[?(@.type=='Ready')].message
      name: REASON
      type: string
    - jsonPath: .spec.provider
      name: PROVIDER
      type: string
    - jsonPath: .spec.address
      name: ADDRESS
      type: string
    - jsonPath: .status.discoveryInfo.platform
      name: PLATFORM
      type: string
    - jsonPath: .status.discoveryInfo.serialNumber
      name: SERIALNUMBER
      type: string
    - jsonPath: .status.discoveryInfo.macAddress
      name: MACADDRESS
      type: string
    name: v1alpha1
    schema:
      openAPIV3Schema:
        description: Target is the Schema for the Target 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: TargetSpec defines the desired state of Target
            properties:
              address:
                description: Address defines the address to connect to the target
                type: string
              connectionProfile:
                description: ConnectionProfile define the profile used to connect
                  to the target once discovered
                type: string
              credentials:
                description: Credentials defines the name of the secret that holds
                  the credentials to connect to the target
                type: string
              provider:
                description: Provider specifies the provider using this target.
                type: string
              syncProfile:
                description: SyncProfile define the profile used to sync to the target
                  config once discovered
                type: string
              tlsSecret:
                description: TLSSecret defines the name of the TLS secret to connect
                  to the target if mtls is used
                type: string
            required:
            - address
            - connectionProfile
            - credentials
            - provider
            type: object
          status:
            description: TargetStatus defines the observed state of Target
            properties:
              conditions:
                description: Conditions of the resource.
                items:
                  properties:
                    lastTransitionTime:
                      description: lastTransitionTime is the last time the condition
                        transitioned from one status to another. This should be when
                        the underlying condition changed.  If that is not known, then
                        using the time when the API field changed is acceptable.
                      format: date-time
                      type: string
                    message:
                      description: message is a human readable message indicating
                        details about the transition. This may be an empty string.
                      maxLength: 32768
                      type: string
                    observedGeneration:
                      description: observedGeneration represents the .metadata.generation
                        that the condition was set based upon. For instance, if .metadata.generation
                        is currently 12, but the .status.conditions[x].observedGeneration
                        is 9, the condition is out of date with respect to the current
                        state of the instance.
                      format: int64
                      minimum: 0
                      type: integer
                    reason:
                      description: reason contains a programmatic identifier indicating
                        the reason for the condition's last transition. Producers
                        of specific condition types may define expected values and
                        meanings for this field, and whether the values are considered
                        a guaranteed API. The value should be a CamelCase string.
                        This field may not be empty.
                      maxLength: 1024
                      minLength: 1
                      pattern: ^[A-Za-z]([A-Za-z0-9_,:]*[A-Za-z0-9_])?$
                      type: string
                    status:
                      description: status of the condition, one of True, False, Unknown.
                      enum:
                      - "True"
                      - "False"
                      - Unknown
                      type: string
                    type:
                      description: type of condition in CamelCase or in foo.example.com/CamelCase.
                        --- Many .condition.type values are consistent across resources
                        like Available, but because arbitrary conditions can be useful
                        (see .node.status.conditions), the ability to deconflict is
                        important. The regex it matches is (dns1123SubdomainFmt/)?(qualifiedNameFmt)
                      maxLength: 316
                      pattern: ^([a-z0-9]([-a-z0-9]*[a-z0-9])?(\.[a-z0-9]([-a-z0-9]*[a-z0-9])?)*/)?(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])$
                      type: string
                  required:
                  - lastTransitionTime
                  - message
                  - reason
                  - status
                  - type
                  type: object
                type: array
              discoveryInfo:
                description: Discovery info defines the information retrieved during
                  discovery
                properties:
                  hostname:
                    description: HostName associated with the target
                    type: string
                  lastSeen:
                    description: Last discovery time
                    format: date-time
                    type: string
                  macAddress:
                    description: MacAddress associated with the target
                    type: string
                  platform:
                    description: Platform associated with the target
                    type: string
                  protocol:
                    description: Protocol used for discovery
                    type: string
                  provider:
                    description: Type associated with the target
                    type: string
                  serialNumber:
                    description: SerialNumber associated with the target
                    type: string
                  supportedEncodings:
                    description: Supported Encodings of the target
                    items:
                      type: string
                    type: array
                  version:
                    description: Version associated with the target
                    type: string
                type: object
              usedReferences:
                description: UsedReferences track the resource used to reconcile the
                  cr
                properties:
                  connectionProfileResourceVersion:
                    type: string
                  secretResourceVersion:
                    type: string
                  syncProfileResourceVersion:
                    type: string
                  tlsSecretResourceVersion:
                    type: string
                required:
                - connectionProfileResourceVersion
                - syncProfileResourceVersion
                type: object
            type: object
        type: object
    served: true
    storage: true
    subresources:
      status: {}

---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
  name: v1alpha1.config.sdcio.dev
spec:
  group: config.sdcio.dev
  groupPriorityMinimum: 1000
  insecureSkipTLSVerify: true
  service:
    name: config-server
    namespace: network-system
    port: 6443
  version: v1alpha1
  versionPriority: 15

---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    sdcio.dev/config-server: "true"
  name: config-server
  namespace: network-system
spec:
  replicas: 1
  selector:
    matchLabels:
      sdcio.dev/config-server: "true"
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        sdcio.dev/config-server: "true"
        sdcio.dev/data-server: "true"
    spec:
      containers:
      - args:
        - --tls-cert-file=/apiserver.local.config/certificates/tls.crt
        - --tls-private-key-file=/apiserver.local.config/certificates/tls.key
        - --audit-log-path=-
        - --audit-log-maxage=0
        - --audit-log-maxbackup=0
        - --secure-port=6443
        command:
        - /app/config-server
        env:
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
        - name: NODE_NAME
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: spec.nodeName
        - name: NODE_IP
          valueFrom:
            fieldRef:
              apiVersion: v1
              fieldPath: status.hostIP
        - name: ENABLE_TARGETDATASTORE
          value: "true"
        - name: ENABLE_TARGETCONFIGSERVER
          value: "true"
        - name: ENABLE_DISCOVERYRULE
          value: "true"
        - name: ENABLE_SCHEMA
          value: "true"
        - name: ENABLE_CONFIG
          value: "true"
        - name: ENABLE_CONFIGSET
          value: "true"
        image: ghcr.io/sdcio/config-server:v0.0.27
        imagePullPolicy: Always
        name: config-server
        ports:
        - containerPort: 6443
          name: api-service
        volumeMounts:
        - mountPath: /apiserver.local.config/certificates
          name: apiserver-certs
          readOnly: true
        - mountPath: /config
          name: config-store
        - mountPath: /schemas
          name: schema-store
      - args:
        - --config=/config/data-server.yaml
        command:
        - /app/data-server
        image: ghcr.io/sdcio/data-server:v0.0.39
        imagePullPolicy: Always
        name: data-server
        volumeMounts:
        - mountPath: /config
          name: data-server-config
        - mountPath: /cached/caches
          name: cache
        - mountPath: /schemas
          name: schema-store
        - mountPath: /schemadb
          name: schema-db
      securityContext:
        fsGroup: 10000
        runAsGroup: 10000
        runAsUser: 10000
      serviceAccountName: config-server
      volumes:
      - configMap:
          name: data-server
        name: data-server-config
      - name: apiserver-certs
        secret:
          secretName: config-server-cert
      - emptyDir:
          sizeLimit: 10Gi
        name: cache
      - name: config-store
        persistentVolumeClaim:
          claimName: pvc-config-store
      - name: schema-store
        persistentVolumeClaim:
          claimName: pvc-schema-store
      - name: schema-db
        persistentVolumeClaim:
          claimName: pvc-schema-db

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: config-server-clusterrole
rules:
- apiGroups:
  - ""
  resources:
  - namespaces
  - secrets
  - services
  - pods
  verbs:
  - get
  - watch
  - list
- apiGroups:
  - ""
  resources:
  - events
  verbs:
  - create
  - patch
- apiGroups:
  - admissionregistration.k8s.io
  resources:
  - mutatingwebhookconfigurations
  - validatingwebhookconfigurations
  - validatingadmissionpolicies
  - validatingadmissionpolicybindings
  verbs:
  - get
  - watch
  - list
- apiGroups:
  - flowcontrol.apiserver.k8s.io
  resources:
  - flowschemas
  - prioritylevelconfigurations
  verbs:
  - get
  - watch
  - list
- apiGroups:
  - config.sdcio.dev
  resources:
  - configs
  - configs/status
  verbs:
  - get
  - watch
  - list
  - create
  - update
  - patch
  - delete
- apiGroups:
  - config.sdcio.dev
  resources:
  - configsets
  - configsets/status
  verbs:
  - get
  - watch
  - list
  - create
  - update
  - patch
  - delete
- apiGroups:
  - config.sdcio.dev
  resources:
  - unmanagedconfigs
  - unmanagedconfigs/status
  verbs:
  - get
  - watch
  - list
  - create
  - update
  - patch
  - delete
- apiGroups:
  - inv.sdcio.dev
  resources:
  - targets
  - targets/status
  verbs:
  - get
  - watch
  - list
  - create
  - update
  - patch
  - delete
- apiGroups:
  - inv.sdcio.dev
  resources:
  - targetconnectionprofiles
  - targetsyncprofiles
  verbs:
  - get
  - watch
  - list
- apiGroups:
  - inv.sdcio.dev
  resources:
  - discoveryrules
  - discoveryrules/status
  verbs:
  - get
  - watch
  - list
  - create
  - update
  - patch
  - delete
- apiGroups:
  - inv.sdcio.dev
  resources:
  - schemas
  - schemas/status
  verbs:
  - get
  - watch
  - list
  - create
  - update
  - patch
  - delete
- apiGroups:
  - coordination.k8s.io
  resources:
  - leases
  verbs:
  - get
  - watch
  - list
  - create
  - update
  - patch
  - delete

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: config-server-clusterrolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: config-server-clusterrole
subjects:
- kind: ServiceAccount
  name: config-server
  namespace: network-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: config:system:auth-delegator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:auth-delegator
subjects:
- kind: ServiceAccount
  name: config-server
  namespace: network-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: aggregated-apiserver-role
  namespace: network-system
rules:
- apiGroups:
  - ""
  resources:
  - serviceaccounts
  verbs:
  - get
- apiGroups:
  - ""
  resources:
  - serviceaccounts/token
  verbs:
  - create

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: config-server-clusterrolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: config-server-clusterrole
subjects:
- kind: ServiceAccount
  name: config-server
  namespace: network-system

---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: config-auth-reader
  namespace: kube-system
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
  name: config-server
  namespace: network-system

---
apiVersion: v1
data:
  data-server.yaml: "grpc-server:\n  schema-server:\n    enabled: true\n    schemas-directory:
    ./schemas\n\n  data-server:\n    max-candidates: 16\n\n  max-recv-msg-size: 25165824
    # 24 * 1024 * 1024 (24MB)\n\ndatastores: # this specifies MAIN datastores\n\nschema-store:\n
    \ # type is either memory or persistent (default)\n  type: persistent\n  path:
    \"/schemadb\"\n\ncache: \n  type: local\n  store-type: badgerdb\n  dir: \"/cached/caches\"\n\nprometheus:\n
    \ address: \":56090\""
kind: ConfigMap
metadata:
  name: data-server
  namespace: network-system

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-config-store
  namespace: network-system
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-schema-db
  namespace: network-system
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-schema-store
  namespace: network-system
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

---
apiVersion: v1
data:
  tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURZekNDQWt1Z0F3SUJBZ0lJSC9mSFZHenZ3cnN3RFFZSktvWklodmNOQVFFTEJRQXdaVEVMTUFrR0ExVUUKQmhNQ2RXNHhDekFKQmdOVkJBZ01Bbk4wTVFvd0NBWURWUVFIREFGc01Rb3dDQVlEVlFRS0RBRnZNUXN3Q1FZRApWUVFMREFKdmRURWtNQ0lHQTFVRUF3d2JZbUZ6YVdNdFkyVnlkR2xtYVdOaGRHVXRZWFYwYUc5eWFYUjVNQjRYCkRUSXlNRE16TVRBNU1UYzFNMW9YRFRNeU1ETXlPREE1TVRjMU5Gb3dIREVhTUJnR0ExVUVBeE1SWW1GemFXTXUKWkdWbVlYVnNkQzV6ZG1Nd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN0TUt0eApjc3Rjdk8rdDVMazZRQkRBZ3g1akZCL2F1dStVb3BDR2Z6VitaRW5obldpaC8xMVZ2ek44cjhmdGZuUkZGTVZ6CmJqYlVhSXNDOFc1eGJDNXNpc2VrdnVBWDlpanUzMlFybEU0RTR1UzNYREdVZkhGSFhMcWxBRU9RclUvRzQ0RGgKa0I3ajJOcDRzbk9IckF0aDA3TStvbXBmVklhSTlkQmdYY3hsUE5QRkNNamlOb1VweVM4eXNha3RQRXFjZTBpawpmNDBYVERmN1YwekFFelI0QkE4Yzh0b05UMVNnSXFIV0xueERKcnZRempDaTVFN2NMNkpmTmhlZDQ5MUVNWlEwCmVnbkV5bXd6d1Jya3BYTkZ4RHJzSXpOZmhHelB6RGJLdmFIUHh5NUwvM3h3clZ3VHllbklaOVExK0tjemtCSksKRXZIaVVKL1BML0VYZkloakFnTUJBQUdqWURCZU1BNEdBMVVkRHdFQi93UUVBd0lGb0RBZEJnTlZIU1VFRmpBVQpCZ2dyQmdFRkJRY0RBUVlJS3dZQkJRVUhBd0l3TFFZRFZSMFJCQ1l3SklJSmJHOWpZV3hvYjNOMGdoRmlZWE5wCll5NWtaV1poZFd4MExuTjJZNGNFZndBQUFUQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUFEa1hsbGZMTlpzWDEKYmp1b0h4RXVUWitaODlMWUxPUDBMM0dHMFgwdVdkZzJFcXY1bmZNRHVRVmJIRmt5dVo3ZDlDY01QYk12MTdDWgoxZGwwQk1GQTJkTkJzK3V1UXFIUFh3RkI4SFdPSDhBc1pMMnYvbG91T3g2dU1QQk9uWUhuQ3pFY21FQXZoR2dLCkpXMDNkd2QwNlJPeUdLT29qSklFTlRnd0xnQ1dZSytPWmIzQklyMUJqS012Q2dHN3pJVDFUUVNna3hGN1NGNzUKYk5BaEdOa0NWMGVrSnNXQWk1UGhzVS9IdWthdGVHUGNMS3hia0RGdHpSV2tRNmdKUXhkZmVuOVBKTjVJVCt4RQpFci8wYUkrOFM5Y1FPUnk0VTNDSFRodmlnOGFyZ3FucmFWMU92OXZNTWxzZ3pnYXc3SjdaeGtkWWwrSkMyWUcvCjJrUThVd1IzQnc9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
  tls.key: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBclRDcmNYTExYTHp2cmVTNU9rQVF3SU1lWXhRZjJycnZsS0tRaG44MWZtUko0WjFvCm9mOWRWYjh6ZksvSDdYNTBSUlRGYzI0MjFHaUxBdkZ1Y1d3dWJJckhwTDdnRi9Zbzd0OWtLNVJPQk9Ma3Qxd3gKbEh4eFIxeTZwUUJEa0sxUHh1T0E0WkFlNDlqYWVMSnpoNndMWWRPelBxSnFYMVNHaVBYUVlGM01aVHpUeFFqSQo0amFGS2Nrdk1yR3BMVHhLbkh0SXBIK05GMHczKzFkTXdCTTBlQVFQSFBMYURVOVVvQ0toMWk1OFF5YTcwTTR3Cm91Uk8zQytpWHpZWG5lUGRSREdVTkhvSnhNcHNNOEVhNUtWelJjUTY3Q016WDRSc3o4dzJ5cjJoejhjdVMvOTgKY0sxY0U4bnB5R2ZVTmZpbk01QVNTaEx4NGxDZnp5L3hGM3lJWXdJREFRQUJBb0lCQUJWWU16ajNLZU1URWdMLwpkbWljYnJRYk5NcUhOMm5Rc2loQ1pNZCt0QXdRdGg1Tk5SRUtGT20xZDlYOUlBbkFGUHBTbGdjazVUTUdjMk40CmQrRVlzUndGZXBkdVF0WVJLM2hOSmQ1TkY5UjRWakhXOWZGVDZPNGZtbzB0WENaZmhiNkFXV2p6Unl0VGxaRmMKaE9xS3BKaDQ2OVZqVlBMTXl3dmtKN3RJdENFaHl4b0t0VVhwcm45SXBLNnNUa051OTFmMVA4czJNbDd1RlVqYwpJdGhMb3JnMEYyU3RaeEJmVDJGaFRYaFZxRlRJS1pmazFGbnRpbUwyWlQrRXZzQlpnZHYwa2Z1Q2hFdE5jRW1PCnRZc2dKT3ExTWF5M2d0dlk3VDB6WkRtTTIrOVpKQ0JLcm8yV2IxdGw0RHNnaWNkR0I2SlhnTi81aklSMTNmbDUKMTRJd1hza0NnWUVBemtQb1MrTko0QkJkR3RYem5tZWVhRFFQVVU0dkF1R3YyU2VtajR3RG1KRXB6aDdoMWlQZAprVWxmYjcxZ1VMbmk0SDVkVFlyVFpwOElUaXZvM3A1bUNrV3lFV09wMmx4VUZoM3JnVWN6NWt0RUhkejl1bjNoCnFYNVJpTWlkM0Y3dWRIODdqYTdJVi9mUEFGSnlremQrWHNaZGFuT0tPK1UvV0t2ek0rSFEzUThDZ1lFQTF2TWoKdml3dnFxM0FBa0VpN2RlOUxLUE1uS1N5VE9BdHQzS2dqV1RLNU5aQUdqeWpoSGxEbjRCempSS25DWk8xY0lJZwo0Wnl1VzQrUlB5aGQreEFubzVoMVh0Ny9LYzNFaW1ucjBLU0ZmRWVza2NORFIyVHNTdCtjYTl6aFFPTFJ0TWRCCnE5OWZDeFprK1pmcEhpSzJCK0pHVExNdVJRY0tDYU43RldKTkIyMENnWUJhc2k5bGx3WjMySm9uMzZYa3BDbGEKSm5JSnpUZ01xMUlZU1VBSzVJVDhRL0ErNndOZ2xwcXBkTHJiTmtrd2xkdjEzSHFJU3gvVGd1QXpCMG01QWF0YQpudlRDZ3JGQUM5TUplcFNBWHQrcVJyUW44WEU3M0hncWdCbTM3SWJGVEpUTGN0cXIzUXZJNm5VQjdqN2xEc1NwClJjM3pyZVE5bS9yenNZQVo4eFJVN3dLQmdRQ0JYTjg4Q3JlOVRzaHFFdTJFbXZ4ZEswOXZUcWVJSUxzaTFyZk4Kb01XREozWjQwOW5OVm5YZVBwNU1YdGRzcWhyZVZWS1l0WVV4MFp1bW1STEdrSmhxbXN5NGhoaW0vaEcxQTc1SwpXVm1FekZZTmU2aTRCUU00cEk4dFUwZTFsMHlDTWhGUjhTTHdOMUFaN3RUN3NBUkJobXFzcW9IRVJWSkRMc0phCndraDltUUtCZ0NYR2xoZzY4aVMzMldmSWVtYUFRMTJpNFRUUk1FNWppTFl0ZlkyREJTMDBWV3NxY0l1OEFUWm0KVHVoZHBRVG9mKzE3LzFyU0cyYnFaWFA2L0h3ak14OTVIdWlXbjVKSjA3RTduOUVCUDlkQTY0K0lHdWlvd0h5RAo2a3g3VVhuTUtTYXdiV2JxZ1JGZTFOZEdLbkh0ZE5GOGxndEdjdytxUTk3YkIreXFreXMxCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==
kind: Secret
metadata:
  labels:
    sdcio.dev/config-server: "true"
  name: config-server-cert
  namespace: network-system
type: kubernetes.io/tls

---
apiVersion: v1
kind: Service
metadata:
  labels:
    sdcio.dev/config-server: "true"
  name: config-server
  namespace: network-system
spec:
  ports:
  - name: api-service
    port: 6443
    targetPort: api-service
  selector:
    sdcio.dev/config-server: "true"

---
apiVersion: v1
kind: Service
metadata:
  labels:
    sdcio.dev/config-server: "true"
  name: data-server
  namespace: network-system
spec:
  ports:
  - port: 56000
    protocol: TCP
    targetPort: 56000
  selector:
    sdcio.dev/data-server: "true"

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: config-server
  namespace: network-system

if successfull you should see a running container similar to this

kubectl get pods -n network-system

output

NAME                             READY   STATUS    RESTARTS   AGE
config-server-7fcd95b976-p2pn7   2/2     Running   0          3d5h