> For the complete documentation index, see [llms.txt](https://docs.furkangulsen.com/kubernetes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.furkangulsen.com/kubernetes/volume/secret.md).

# Secret

Kubernetes'de Secret Volume, verileri şifrelenmiş bir şekilde depolamak için kullanılan bir depolama türüdür. Bu tür bir volume ile veriler, Kubernetes Secret nesnelerinde tutulur ve pod'larda bu secret volume'una bağlanarak kullanılabilir.

Örneğin, bir uygulama veritabanı şifreleri gibi hassas bilgiler içeriyorsa, bu bilgilerin açık şekilde kaydedilmesi uygun olmaz. Bu tür hassas bilgileri, Kubernetes Secret nesnelerinde saklayabiliriz. Daha sonra bu Secret nesnelerini pod'lara Volume olarak bağlayarak, bu hassas bilgilere pod'larda erişebiliriz.

Örneğin bir deployment'ta bir container çalıştırdığımızı ve bu container'ın bir secret dosyasına ihtiyacı olduğunu varsayalım. Öncelikle bir secret oluşturmalıyız:

<pre class="language-yaml"><code class="lang-yaml">apiVersion: v1
kind: Secret
metadata:
  name: mysecret
<strong>type: Opaque
</strong>data:
<strong>  username: dXNlcg==
</strong><strong>  password: cGFzc3dvcmQ=
</strong></code></pre>

{% hint style="warning" %}
Kubernetes Secret objesi içerisinde **`data`** ve **`stringData`** alanlarına sahip olabilir. Her iki alan da Secret objesi içerisinde değer saklamak için kullanılır ancak aralarında bazı farklılıklar vardır.

**`data`** alanı, **Base64** kodlu verileri saklamak için kullanılır. Bu nedenle, verileri kaydetmek için genellikle bir Base64 kodlayıcı kullanmak gerekir. Veriler, anahtar-değer çiftleri şeklinde saklanır. Bu alan, gizli anahtarları ve sertifikaları gibi hassas verileri saklamak için kullanılır.

**`stringData`** alanı ise Base64 kodlaması yapmadan doğrudan **açık metin** olarak verileri saklamak için kullanılır. Bu nedenle, verileri saklamak için herhangi bir kodlayıcı kullanmak gerekmez. Veriler yine anahtar-değer çiftleri şeklinde saklanır. Bu alan, genellikle basit metin verileri gibi hassas olmayan verileri saklamak için kullanılır.

**Özetle, `data` alanı hassas verileri saklamak için kullanılırken, `stringData` alanı hassas olmayan verileri saklamak için kullanılır.**
{% endhint %}

Bu secret dosyasını oluşturduktan sonra, pod'da kullanmak için aşağıdaki şekilde kullanabiliriz:

<pre class="language-yaml"><code class="lang-yaml">apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mycontainer
    image: myimage
<strong>    volumeMounts:
</strong><strong>    - name: secret-volume
</strong><strong>      mountPath: /etc/mysecret
</strong><strong>      readOnly: true
</strong><strong>  volumes:
</strong><strong>  - name: secret-volume
</strong><strong>    secret:
</strong><strong>      secretName: mysecret
</strong></code></pre>

Bu YAML dosyası, `mypod` adlı bir pod yaratır ve `mycontainer` adlı bir container içerir. Bu container, `/etc/mysecret` yoluna read-only bir volume bağlar. Volume'un adı `secret-volume` olarak belirtilir ve bu volume, `mysecret` adlı secret dosyasını kullanarak oluşturulur.

Artık bu pod çalıştırıldığında, `mycontainer` adlı container `/etc/mysecret` yolunda `mysecret` dosyasına erişebilir ve içerdiği `username` ve `password` bilgilerini kullanabilir. Bu şekilde, hassas bilgileri container'ımızın içine gömmek yerine secret dosyaları kullanarak daha güvenli bir yöntemle saklayabiliriz.

{% hint style="info" %}

### ConfigMap vs Secret Volume

Kubernetes'te **ConfigMap** ve **Secret**, uygulama yapılandırması ve gizli bilgilerin depolanması için kullanılan iki kaynak türüdür. ConfigMap, anahtar-değer çiftleri aracılığıyla yapılandırma bilgilerini depolamak için kullanılırken, Secret, duyarlı bilgileri (örneğin, şifreler, API anahtarları) depolamak için kullanılır.

ConfigMap'lar, bir uygulamanın çeşitli yapılandırma ayarlarını depolamak için kullanışlıdır. Örneğin, bir web uygulamasında kullanılan farklı yapılandırma dosyalarının tümünü tek bir ConfigMap içinde depolayabilirsiniz. Bu, yapılandırma değişikliklerini daha kolay yönetmenizi sağlar. ConfigMap'lar, uygulama yapılandırmasını değiştirmek için manuel olarak veya bir konfigürasyon yönetimi aracı (örneğin, Helm) kullanarak güncellenebilir.

Secret'lar, gizli verilerin depolanması için kullanılır. Örneğin, bir veritabanı şifresi veya bir API anahtarı gibi duyarlı bilgileri Secret içinde depolayabilirsiniz. Secret'lar, ConfigMap'lar gibi anahtar-değer çiftleri aracılığıyla depolanır ve kullanım sırasında otomatik olarak deşifre edilir. Secret'lar, genellikle bir uygulamanın Pod'larında bulunan konteynerlerin gizli bilgilere erişmesi gerektiğinde kullanılır.

Özetle, ConfigMap'lar uygulama yapılandırması için, Secret'lar ise duyarlı bilgilerin depolanması için kullanılır.
{% endhint %}
