How to add a service_account.json file to kubernetes secrets? I tried
kubectl create secret generic service_account.json -n sample --from-file=service_account=service_account.json 
but it returns an error failed to create secret Secret "service_account.json" is invalid: metadata.name
You can't use service_account.json as the (metadata) name for a Kubernetes resource. Here's the documentation on permitted Object Names and IDs
You can use:
kubectl create secret generic foo \
--namespace=sample \
--from-file=key.json=service_account.json
NOTE The secret is called
fooand it creates a key calledkey.jsonwhose value is the content of the file calledservice_account.json.NOTE If you don't wish to rename the object name in the secret, you can omit it; I renamed the file
service_account.jsontokey.jsonin the secret. To retain the original name, just use--from-file=service_account.json.
You should then able to volume mount the secret in the Container where you need to use it:
apiVersion: v1
kind: Namespace
metadata:
  labels:
    control-plane: controller-manager
  name: system
---
apiVersion: apps/v1
kind: Deployment
metadata: {}
spec:
  template:
    spec:
      containers:
        - name: my-container
          volumeMounts:
            - name: bar
              mountPath: /secrets
      volumes:
        - name: bar
          secret:
            secretName: fooNOTE The container can access the
foosecret's content as/secrets/key.json.
Intentionally distinct names foo, bar etc. for clarity