text: Title: CRD structural schema validation doesn't allow having description on openAPIV3Schema.properties[metadata]
  Body: <!-- Please use this template while reporting a bug and provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner. Thanks!
  
  If the matter is security related, please disclose it privately via https://kubernetes.io/security/
  -->
  
  
  #### What happened:
  A CRD with the following schema
  ```
  apiVersion: apiextensions.k8s.io/v1
  kind: CustomResourceDefinition
  metadata:
    name: foos.example.com
  spec:
    group: example.com
    names:
      kind: Foo
      listKind: FooList
      plural: foos
      singular: foo
    scope: Cluster
    versions:
    - name: v1beta1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          description: A foo.
          type: object
          properties:
            metadata:
              type: object
              description: Additional validation on foo's name.         <--  this is the violator
              properties:
                name:
                  description: The name may only contain lowercase letters.
                  type: string
                  pattern: '^[a-z]+$'
  ```
  will fail server side validation
  ```
  $ kubectl apply -f crd3.yaml
  The CustomResourceDefinition "foos.example.com" is invalid: spec.validation.openAPIV3Schema.properties[metadata]: Forbidden: must not specify anything other than name and generateName, but metadata is implicitly specified
  ```
  
  while removing the description on metadata will make the CRD valid
  ```
  $ cat crd3.yaml
  apiVersion: apiextensions.k8s.io/v1
  kind: CustomResourceDefinition
  metadata:
    name: foos.example.com
  spec:
    group: example.com
    names:
      kind: Foo
      listKind: FooList
      plural: foos
      singular: foo
    scope: Cluster
    versions:
    - name: v1beta1
      served: true
      storage: true
      schema:
        openAPIV3Schema:
          description: A foo.
          type: object
          properties:
            metadata:
              type: object
              properties:
                name:
                  description: The name may only contain lowercase letters.
                  type: string
                  pattern: '^[a-z]+$'
  ```
  ```
  $ kubectl apply -f crd3.yaml
  customresourcedefinition.apiextensions.k8s.io/foos.example.com created
  ```
  
  #### What you expected to happen:
  Either we allow description, or we make the error message clear. 
  
  #### How to reproduce it (as minimally and precisely as possible):
  Create the example CRD above.  
  
  #### Anything else we need to know?:
  The validation code is [here](https://github.com/kubernetes/kubernetes/blob/669016067d49110a35769f7db42705cc5f0becff/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/schema/validation.go#L162). If we want to allow setting description, I think we should clear the description field the same way as we do for `metadata.Type` before calling `reflect.DeepEqual`.
  
  /good-first-issue
  /area custom-resources
  /sig api-machinery
  
  #### Environment:
  - Kubernetes version (use `kubectl version`): HEAD