Kubernetes LAB03 8/20

Ümit Demirtaş

Created with Sketch.
Kubernetes

Kubernetes LAB03 8/20

Merhaba arkadaşlar, bugünkü yazımda Kubernetes eğitim serimizin üçüncü labaratuvarını gerçekleştireceğiz. Umarım bu zamanki yazılara kadar size birşeyler katmışımdır. Eğer herhangi bir konuda bir desteğe ihtiyacınız olursa, sayfanın sonundan yorum yapabilir benimle iletişime geçebilirsiniz.

TLS Erişimini Yapılandırma

kubectl, Kubernetes içerisinde API çağrılarını sizin adınıza yapar. Uygun TLS anahtarları ile curl yapabilirsiniz. kube-apiserver’a yapılan API çağrıları bir PodSpec veya istenilen bir durumu getirir veya gönderir. Eğer istek yeni bir durumu temsil ediyorsa, Kubernetes Control Plane, mevcut durum belirtilen durumla eşleşene kadar cluster’ı güncelleyecektir. Bazı durumları sonlandırmak çoklu talepler gerektirir. Örneğin; bir ReplicaSet’i silmek için önce replica sayısını sıfıra çekmeliyiz ardından ReplicaSet’i silmeliyiz.

Bir API çağrısı, bilgieri JSON olarak iletmelidir. kubectl sizin adınıza bir API çağrısı yaparken .yaml uzantılı dosyaları JSON’a dönüştürür. API çağrısı birçok ayara sahiptir, ancak ne tür bir container kunuşladırılacağını bildirmek için apiVersion, kind, metadata ve spec yapılandırmalarını içermelidir. spec alanları, yaratılan nesneye bağlıdır. kube-apiserver’a uzaktan erişimi yapılandırarak başlayacağız ve daha sonra API’ları keşfeceğiz.

İlk olarak kubectl yapılandırma dosyasını gözden geçirerek başlayalım.

$ less ~/.kube/config
Yapılandırma dosyasına ait birçok çıktı elde edeceğiz.

Sertifikalarımızı bir değişkene atayacağız. Alacağımız üç sertifikayı API suncusuna erişirken kullanacağız. İlk olarak client-certificate-data anahtarını ayarlamakla başlayalım. (Bu işlemleri manuel olarak kubectl yapılandırma dosyasını açarakta yapabilirsiniz. )

$ export client=$(grep client-certificate-data ~/.kube/config |cut -d " " -f 6)
$ echo $client                                 LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tC ....

Aynı komutu bu sefer client-key-data anahtarı için çalıştırıyoruz.

$ export key=$(grep client-key-data ~/.kube/config |cut -d " " -f 6)
$ echo $key
LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS ....

Son olarak komutumuzu certificate-autority-data anahtarı üzerinde çalıştırıyoruz.

$ export auth=$(grep certificate-authority-data ~/.kube/config |cut -d " " -f 6)
$ echo $key
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk ....

Şimdi anahtarlarımızı curl’de kullanmak için ayarlıyoruz.

$ echo $client | base64 -d - > ./client.pem
$ echo $key | base64 -d - > ./client-key.pem
$ echo $auth | base64 -d - > ./ca.pem

kubectl yapılandırma dosyasından API sunucusu URL’ini öğrenelim.

$ kubectl config view | grep server
server: https://10.142.0.14:6443

curl komutu ile encode edilmiş sertifika dosyalarımızı kullanarak API sunucumuza bağlanalım.

$ curl --cert ./client.pem --key ./client-key.pem --cacert ./ca.pem https://10.142.0.14:6443/api/v1/pods
{
  "kind": "PodList",
  "apiVersion": "v1",
  "metadata": {
    "selfLink": "/api/v1/pods",
    "resourceVersion": "723911"
  },
  "items": [
    {
      "metadata": {
        "name": "denemepod",
        "namespace": "default",
        "selfLink": "/api/v1/namespaces/default/pods/denemepod",
....

İşte bu zamana kadar yaptığımzı bütün bu zahmetli işleri kubectl bizim adımıza yapıladırma dosyasını kullanarak yapıyor. Ama mantığını anlamak adına daha derine inmemiz gerekiyor. Şimdi oluşturacağımız JSON dosyası ile kube-apiserver‘a pod isteğinde bulunalım.

$ vim podornek.json
{
   "kind":"Pod",
   "apiVersion":"v1",
   "metadata":{
      "name":"podornek",
      "namespace":"default",
      "labels":{
         "name":"jsonpod"
      }
   },
   "spec":{
      "containers":[
         {
            "name":"nginx",
            "image":"nginx",
            "ports":[
               {
                  "containerPort":80
               }
            ]
         }
      ]
   }
}

curl komutumuzu kullanarak JSON dosyasımızı XPOST API çağrısı ile gönderelim. Gönderdikten sonra birçok çıktı göreceğiz. Özellikle istekte bulunduğumuz JSON dosyası ve bu isteğe verilen yanıtı görebileceğiz.

$ curl --cert ./client.pem --key ./client-key.pem --cacert ./ca.pem https://10.142.0.14:6443/api/v1/namespaces/default/pods -XPOST -H'Content-Type: application/json' -d@podornek.json
{
  "kind": "Pod",
  "apiVersion": "v1",
  "metadata": {
    "name": "curlpod",
    "namespace": "default",
    "selfLink": "/api/v1/namespaces/default/pods/curlpod",
....

$ kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
curlpod   1/1     Running   0          59s

API Çağrılarını Keşfedelim

Bir komutun sizin adınıza ne yaptığını görmenin bir yolu strace kullanmaktır. Bu durumda geçerli endpoint’leri ve API çağrılarımızın hedeflerine bakacağız.

$ kubectl get endpoints
NAME         ENDPOINTS          AGE
kubernetes   10.142.0.14:6443   6d9h

Bu komutu şimdi strace komutu ile birlikte çağıralım. Çok fazla çıktı alacağız, sonlara yakın bir yerde openat işlevini göreceğiz. Eğer çıktıyı göremezseniz, tüm çıktıyı bir dosyaya aktarıp grep ile arama yapabilirsiniz. Bu bilgiler cache’de bulunur, bu yüzden birkaç kez çalıştırmanız sonucunda bazı farklar görebilirsiniz.

$ strace kubectl get endpoints
....
openat(AT_FDCWD, "/home/kubernetes_VM/.kube/cache/discovery/10.142.0.14_6443/servergroups.json", O_RDONLY|O_CLOEXEC) = 3
....

Belirttiği dizine gidip keşfedelim. Endpoint ip’niz farklı olacaktır, bu nedenle aşağıdaki komutları sistemine uygun bir şekilde değiştirin.

$ cd /home/kubernetes_VM/.kube/cache/discovery
$ ls
10.142.0.14_6443

$ cd 10.142.0.14_6443
(/home/kubernetes_VM/.kube/cache/discovery/10.142.0.14_6443)$ ls
admissionregistration.k8s.io  authentication.k8s.io  certificates.k8s.io    extensions         rbac.authorization.k8s.io  v1
apiextensions.k8s.io          authorization.k8s.io   coordination.k8s.io    networking.k8s.io  scheduling.k8s.io
apiregistration.k8s.io        autoscaling            crd.projectcalico.org  node.k8s.io        servergroups.json
apps                          batch                  events.k8s.io          policy             storage.k8s.io

Yukarıdaki listelemelerde kubernetes için çeşitli yapılandırma dizinleri bulacaksınız. Tüm dosyaları görmek için dilerseniz “find .” komutunu çalıştırıp bakabilirsiniz.

API’ın versiyon 1 içerisindeki nesneleri görüntüleyelim. Aşağıdaki örnekte her nesne veya tür için eylemleri görüntüleyebilirsiniz.

$ python -m json.tool v1/serverresources.json
{
    "apiVersion": "v1",
    "groupVersion": "v1",
    "kind": "APIResourceList",
    "resources": [
        {
            "kind": "Binding",
            "name": "bindings",
            "namespaced": true,
            "singularName": "",
            "verbs": [
                "create"
            ]
        },
....

Bu örneği daha detaylı incelersek içerisinde yer alan endpoint nesnesini detaylı bir şekilde görme fırsatı sağlarız. Örneğin endpoint’leri listelemek için kısa ismi olan ep’yi kullanabiliriz. Bu işlemi burada görebiliriz.

$ python -m json.tool v1/serverresources.json | less
....
 {
            "kind": "Endpoints",
            "name": "endpoints",
            "namespaced": true,
            "shortNames": [
                "ep"
            ],
            "singularName": "",
            "verbs": [
                "create",
                "delete",
                "deletecollection",
                "get",
                "list",
                "patch",
                "update",
                "watch"
            ]
        },
....

$ kubectl get ep
NAME         ENDPOINTS          AGE
kubernetes   10.142.0.14:6443   6d9h

Kısaca kullandığımız tüm komutları bu API versiyonları içerisinde görebilmekteyiz. İşte API çağrılarını versiyon versiyon bu şekilde keşfedebiliriz. Kubernetes tüm iletişimini REST çağrıları üzerinden yaptığı için bu konuyu iyi bir şekilde anlamak sizin faydanıza olacaktır. Eğer bu labaratuvar ortamında eksik kaldığınız bir yan olduğunu hissederseniz Kubernetes API ve Erişim isimli yazıyı bir daha okuyabilir veya https://kubernetes.io/docs/home/ web sitesinden detaylı bilgiler öğrenebilirsiniz, görüşmek üzere !

Umarım bu yazı sizin için bilgilendirici olmuştur. Yazıyla ilgili bir sorunuz, görüşünüz veya isteğiniz varsa alt kısımda bulunan yorumlardan veya mail adresimden iletişime geçebilirsiniz. Bu yazının başkaları içinde bilgilendirici olduğunu düşünüyorsanız sosyal olun ve sosyal medyada paylaşın! Okuduğunuz için teşekkürler !!!

 

Yorum yapılmamış

Yorumunuzu ekleyin