Putting this information in a secret
is safer and more flexible than putting it verbatim in a
PodThe smallest and simplest Kubernetes object. A Pod represents a set of running containers on your cluster. definition or in a container imageStored instance of a container that holds a set of software needed to run an application.
.
A Secret is an object that contains a small amount of sensitive data such as
a password, a token, or a key.
Users can create secrets, and the system also creates some secrets.
To use a secret, a pod needs to reference the secret.
A secret can be used with a pod in two ways: as files in a
volumeA directory containing data, accessible to the containers in a pod. mounted on one or more of
its containers, or used by kubelet when pulling images for the pod.
--from-file
You can also create a Secret in a file first, in json or yaml format,
and then create that object.
The
Secret contains two maps:
data and stringData.
The data field is used to store arbitrary data, encoded using
base64.
Kubernetes automatically creates secrets which contain credentials for
accessing the API and it automatically modifies your pods to use this type of
secret.
kubectl get and kubectl describe avoid showing the contents of a secret by
default.
stringData field is provided for convenience, and allows you to provide
secret data as unencoded strings.
where you are deploying an application
that uses a Secret to store a configuration file, and you want to populate
parts of that configuration file during your deployment process.
a field is specified in both data and stringData, the value from stringData
is used.
The keys of data and stringData must consist of alphanumeric characters,
‘-’, ‘_’ or ‘.’.
Newlines are not valid within these strings and must
be omitted.
When using the base64 utility on Darwin/macOS users should avoid
using the -b option to split long lines.
create a Secret from generators and then apply it to create the object on
the Apiserver.
The generated Secrets name has a suffix appended by hashing the contents.
base64 --decode
Secrets can be mounted as data volumes or be exposed as
environment variablesContainer environment variables are name=value pairs that provide useful information into containers running in a Pod.
to be used by a container in a pod.
Multiple pods can reference the same secret.
Each key in the secret data map becomes the filename under mountPath
each container needs its
own volumeMounts block, but only one .spec.volumes is needed per secret
use .spec.volumes[].secret.items field to change target path of each key:
If .spec.volumes[].secret.items is used, only keys specified in items are projected.
To consume all keys from the secret, all of them must be listed in the items field.
You can also specify the permission mode bits files part of a secret will have.
If you don’t specify any, 0644 is used by default.
JSON spec doesn’t support octal notation, so use the value 256 for
0400 permissions.
Inside the container that mounts a secret volume, the secret keys appear as
files and the secret values are base-64 decoded and stored inside these files.
Mounted Secrets are updated automatically
Kubelet is checking whether the mounted secret is fresh on every periodic sync.
cache propagation delay depends on the chosen cache type
A container using a Secret as a
subPath volume mount will not receive
Secret updates.
Inside a container that consumes a secret in an environment variables, the secret keys appear as
normal environment variables containing the base-64 decoded values of the secret data.
An imagePullSecret is a way to pass a secret that contains a Docker (or other) image registry
password to the Kubelet so it can pull a private image on behalf of your Pod.
a secret
needs to be created before any pods that depend on it.
Secret API objects reside in a namespaceAn abstraction used by Kubernetes to support multiple virtual clusters on the same physical cluster.
.
They can only be referenced by pods in that same namespace.
Individual secrets are limited to 1MiB in size.
Kubelet only supports use of secrets for Pods it gets from the API server.
Secrets must be created before they are consumed in pods as environment
variables unless they are marked as optional.
References to Secrets that do
not exist will prevent the pod from starting.
References via secretKeyRef to keys that do not exist in a named Secret
will prevent the pod from starting.
Once a pod is scheduled, the kubelet will try to fetch the
secret value.
Think carefully before sending your own ssh keys: other users of the cluster may have access to the secret.
Special characters such as $, \*, and ! require escaping.
If the password you are using has special characters, you need to escape them using the \\ character.
You do not need to escape special characters in passwords from files
make that key begin with a dot
Dotfiles in secret volume
.secret-file
a frontend container
which handles user interaction and business logic, but which cannot see the
private key;
a signer container that can see the private key, and responds
to simple signing requests from the frontend
When deploying applications that interact with the secrets API, access should be
limited using authorization policies such as RBAC
watch and list requests for secrets within a namespace are
extremely powerful capabilities and should be avoided
watch and list all secrets in a cluster should be reserved for only the most
privileged, system-level components.
additional
precautions with secret objects, such as avoiding writing them to disk where
possible.
A secret is only sent to a node if a pod on that node requires it
only the
secrets that a pod requests are potentially visible within its containers
each container in a pod has
to request the secret volume in its volumeMounts for it to be visible within
the container.
In the API server secret data is stored in etcdConsistent and highly-available key value store used as Kubernetes’ backing store for all cluster data.
limit access to etcd to admin users
Base64 encoding is not an
encryption method and is considered the same as plain text.
A user who can create a pod that uses a secret can also see the value of that secret.
anyone with root on any node can read any secret from the apiserver,
by impersonating the kubelet.
Create an additional staging environment that closely resembles the
production one
Keep any additional configuration in YAML files under the config/ directory
Rails::Application.config_for(:yaml_file)
Use nested routes to express better the relationship between ActiveRecord
models
nest routes more than 1 level deep then use the shallow: true option
namespaced routes to group related actions
Don't use match to define any routes unless there is need to map multiple request types among [:get, :post, :patch, :put, :delete] to a single action using :via option.
Keep the controllers skinny
all the business logic
should naturally reside in the model
Share no more than two instance variables between a controller and a view.
using a template
Prefer render plain: over render text
Prefer corresponding symbols to numeric HTTP status codes
without abbreviations
Keep your models for business logic and data-persistence
only
Group macro-style methods (has_many, validates, etc) in the beginning of
the class definition
Prefer has_many :through to has_and_belongs_to_many
self[:attribute]
self[:attribute] = value
validates
Keep custom validators under app/validators
Consider extracting custom validators to a shared gem
preferable to make a class method instead which serves the
same purpose of the named scope
returns an ActiveRecord::Relation
object
.update_attributes
Override the to_param method of the model
Use the friendly_id gem. It allows creation of human-readable URLs by
using some descriptive attribute of the model instead of its id
find_each to iterate over a collection of AR objects
.find_each
.find_each
Looping through a
collection of records from the database (using the all method, for example)
is very inefficient since it will try to instantiate all the objects at once
always call
before_destroy callbacks that perform validation with prepend: true
Define the dependent option to the has_many and has_one associations
always use the exception raising bang! method or handle the method return value.
When persisting AR objects
Avoid string interpolation in
queries
param will be properly escaped
Consider using named placeholders instead of positional placeholders
use of find over where
when you need to retrieve a single record by id
use of find_by over where and find_by_attribute
use of where.not over SQL
use
heredocs with squish
Keep the schema.rb (or structure.sql) under version control.
Use rake db:schema:load instead of rake db:migrate to initialize an empty
database
Enforce default values in the migrations themselves instead of in the
application layer
change_column_default
imposing data integrity from
the Rails app is impossible
use the change method instead of up and down methods.
constructive migrations
use models in migrations, make sure you define them
so that you don't end up with broken migrations in the future
Don't use non-reversible migration commands in the change method.
In this case, block will be used by create_table in rollback
Never call the model layer directly from a view
Never make complex formatting in the views, export the formatting to a method
in the view helper or the model.
When the labels of an ActiveRecord model need to be translated, use the
activerecord scope
Separate the texts used in the views from translations of ActiveRecord
attributes
Place the locale files for the models in a folder locales/models
the
texts used in the views in folder locales/views
Use the dot-separated keys in the controllers and models
Reserve app/assets for custom stylesheets, javascripts, or images
Third party code such as jQuery or
bootstrap should be placed in
vendor/assets
Provide both HTML and plain-text view templates
config.action_mailer.raise_delivery_errors = true
Use a local SMTP server like
Mailcatcher in the development
environment
Provide default settings for the host name
The _url methods include the host name and the _path
methods don't
_url
Format the from and to addresses properly
default from:
sending html emails all styles should be inline
Sending emails while generating page response should be avoided. It causes
delays in loading of the page and request can timeout if multiple email are
sent.
.start_with?
.end_with?
&.
Config your timezone accordingly in application.rb
config.active_record.default_timezone = :local
it can be only :utc or :local
Don't use Time.parse
Time.zone.parse
Don't use Time.now
Time.zone.now
Put gems used only for development or testing in the appropriate group in the
Gemfile
Add all OS X specific gems to a darwin group in the Gemfile, and
all Linux specific gems to a linux group
Do not remove the Gemfile.lock from version control.