Kubernetes API, kümenizin işlemlerini denetleme ve yönetme yolunuzdur. API’yi Kubectl CLI’yi, aşağıdaki gibi araçları kullanarak tüketebilirsiniz: curl
veya popüler programlama dilleri için resmi entegrasyon kitaplıkları.
API, kümenizdeki uygulamalar için de kullanılabilir. Kubernetes Pod’larına otomatik olarak API erişimi verilir ve sağlanan bir hizmet hesabını kullanarak kimlik doğrulaması yapabilir. Seçtiğiniz istemciden bağlantı kurmak için enjekte edilen ortam değişkenlerini ve sertifika dosyalarını tüketerek etkileşimler gerçekleştirirsiniz.
Kapsüller İçinde Kubernetes API’sine Neden Erişmeliyim?
Pod API erişimi için birkaç kullanım durumu vardır. Bu teknik, uygulamaların ortamlarını dinamik olarak incelemesine, Kubernetes değişikliklerini uygulamasına ve performans öngörüleri sağlayan kontrol düzlemi ölçümlerini toplamasına olanak tanır.
Bazı kuruluşlar, Kubernetes çevresinde kendi araçlarını geliştirir. Ek işlevleri ortaya çıkarmak için API’yi kullanan özel bir küme içi uygulama dağıtabilirler. Ortamınızı açmanız veya hizmet hesaplarını ve kimlik doğrulama belirteçlerini paylaşmanız gerekmediğinden, küme içinden çalışmak, harici bir komut dosyasından API çağrıları yapmaktan daha güvenli olabilir.
API İstemci Kitaplıklarını Kullanma
Bir Pod’dan Kubernetes API’sine erişmenin en kolay ve önerilen yöntemi, bir istemci kitaplığı kullanmaktır. C, .NET, Go, Haskell, Java, JavaScript, Perl, Python ve Ruby için tam olarak desteklenen seçenekler mevcuttur. Diğer popüler programlama dillerinin çoğu için eşdeğer topluluk tarafından sürdürülen çözümler vardır.
İstemci kitaplıkları, içinde çalıştıkları küme ortamını keşfetmek için yerleşik desteğe sahiptir. Her uygulama, kitaplığı doğru API sunucusuna bağlanacak şekilde yapılandıracak, çağırabileceğiniz bir işlev sağlar.
Bir Python uygulamasında kümenizdeki Bölmeleri nasıl listeleyeceğinize dair bir örnek:
from kubernetes import client, config config.load_incluster_config() api = client.CoreV1Api() # Perform necessary API interactions # pods = api.list_pod_for_all_namespaces()
Bu yaklaşımla çalışmak kolaydır ve manuel yapılandırma gerektirmez. Bazen bir istemci kitaplığını kullanamazsınız. Bu durumlarda, Kubernetes’in sağladığı hizmet hesabını kullanarak API’ye manuel olarak erişmek yine de mümkündür.
Manuel API Etkileşimlerini Gerçekleştirme
API’yi çağırmak için iki şeyi bilmeniz gerekir: maruz kaldığı küme içi ana bilgisayar adı ve Pod’unuzun kimliğini doğrulayacak hizmet hesabı belirteci.
API ana bilgisayar adı her zaman kubernetes.default.svc
. Kubernetes DNS sağlayıcısı, bu adı kontrol düzleminin API sunucusuna çözecektir. Alternatif olarak, $KUBERNETES_SERVICE_HOST
API sunucusunun IP adresini keşfetmek için ortam değişkeni:
$ echo $KUBERNETES_SERVICE_HOST 10.96.0.1
API’ler yalnızca HTTPS üzerinden kullanılabilir. Kümeniz için sertifika yetkilisi dosyasını şu adreste bulabilirsiniz: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
Pod’unuzun içinde. Kubernetes, her yeni kapsayıcı oluşturulduğunda bunu dosya sistemine depolar.
API ile yararlı bir şey elde etmek için kimlik doğrulamanız gerekir. Kubernetes, her Pod için yeni bir hizmet hesabı oluşturur ve belirtecini şu adreste sağlar: /var/run/secrets/kubernetes.io/serviceaccount/token
. Bu, her HTTP isteğine taşıyıcı belirteci olarak dahil edilmelidir. Authorization
başlık.
Her şeyi bir araya getirerek, aşağıdakileri kullanarak temel bir Pod Kubernetes API isteği oluşturmaya bir örnek: curl
:
$ curl \ --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \ -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc/api { "kind": "APIVersions", "versions": [ "v1" ], "serverAddressByClientCIDRs": [ { "clientCIDR": "0.0.0.0/0", "serverAddress": "192.168.49.2:8443" } ]
Kubernetes sunucusu, mevcut API sürümleriyle yanıt verdi. Bu, kullanılarak başarılı bir bağlantının yapıldığını onaylar. kubernetes.default.svc
ana bilgisayar adı ve sağlanan hizmet hesabı.
RBAC’ı Kullanma
Bir API isteği başarılı bir şekilde yapılmış olsa da, kümeniz için RBAC etkinleştirilirse diğerlerinin çoğu sınırsız olacaktır. Yeni oluşturulan hizmet hesapları otomatik olarak rol almaz, bu nedenle Pod’unuz korumalı API uç noktaları isteyemez.
Bunu, kendi Role nesnelerinizi oluşturarak ve bunları Kapsüllerinize sağlanan hizmet hesabına bağlayarak çözebilirsiniz. Önce yeni bir Rol oluşturun:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: demo-role rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"]
Kubectl ile kümenize uygulayın:
$ kubectl apply -f role.yaml
Ardından, rolü hizmet hesabına bağlayın:
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: namespace: default name: demo-role-binding subjects: - kind: ServiceAccount name: default apiGroup: "" roleRef: kind: Role name: demo-role apiGroup: ""
bu default
hizmet hesabı, rol bağlamanın konusu olarak seçilir. Bölmeler her zaman bu hizmet hesabıyla sağlanır ve kapsamları oluşturuldukları ad alanına göre belirlenir. Bu örnekte, default
ad alanı kullanılır, ancak Pod’unuz farklı bir ad alanında varsa, bu Role ve RoleBinding nesnelerinde değiştirilmelidir.
RoleBinding’i kümenize ekleyin:
$ kubectl apply -f role-binding.yaml
Artık Pod’larınızın diğer Pod nesnelerini almasına ve listelemesine izin verilecek. default
ad alanı. Ad alanlı Pods uç noktasına bir API isteğinde bulunarak bunu doğrulayabilirsiniz:
$ curl \ --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \ -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc/api/v1/namespaces/default/pods { "kind": "PodList", "apiVersion": "v1" ... }
Pod’lar, aşağıdakileri okuyarak kendi ad alanlarını tanımlayabilir: /var/run/secrets/kubernetes.io/serviceaccount/namespace
dosya:
$ cat /var/run/secrets/kubernetes.io/serviceaccount/namespace default
Bu, etkin ad alanını uç nokta URL’lerine enterpolasyon yapmak için uygun bir yöntem sağlar:
$ curl \ --cacert /var/run/secrets/kubernetes.io/serviceaccount/ca.crt \ -H "Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)" https://kubernetes.default.svc/api/v1/namespaces/$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)/pods { "kind": "PodList", "apiVersion": "v1" ... }
Farklı Bir Hizmet Hesabı Seçme
Kubernetes, Pod’lara otomatik olarak şunları sağlar: default
ad alanlarının içindeki hizmet hesabı. Bunun yerine isteğe bağlı olarak farklı bir hizmet hesabı enjekte edebilirsiniz. spec.serviceAccountName
Pod’larınızdaki alan:
apiVersion: v1 kind: Pod metadata: name: demo spec: serviceAccountName: demo-sa
Bu örnekte, Pod şu şekilde kimlik doğrulaması yapacaktır: demo-sa
jeton. Bu hizmet hesabını manuel olarak oluşturabilir ve buna ihtiyaç duyduğunuz rollerle bağlayabilirsiniz.
$ kubernetes create serviceaccount demo-sa
Hizmet hesabı, Pod ile aynı ad alanında bulunmalıdır.
Hizmet Dışı Hesap Ekleme
Otomatik hizmet hesabı ekleme her zaman istenmez. Başarılı bir Kapsül güvenliğinin aşılması, Kubernetes kümenizin API’sine anında erişim sağladığından, bu bir güvenlik tehlikesi oluşturabilir. Hizmet hesabı belirteci bağlantılarını şu şekilde devre dışı bırakabilirsiniz: spec.automountServiceAccountToken
Pod bildirim alanı:
apiVersion: v1 kind: Pod metadata: name: demo spec: automountServiceAccountToken: false
Kubernetes enjekte etmeyecek /var/run/secrets/kubernetes.io/serviceaccount/token
dosya. Bu, farklı bir yöntem kullanarak kimlik bilgilerini manuel olarak sağlamadığınız sürece Kapsül’ün Kubernetes API’sinde kimlik doğrulamasını önleyecektir. Bu alan aynı zamanda hizmet hesabı nesnelerinde de desteklenir, bu da onları herhangi bir Pod’a otomatik olarak monte edilmeye uygun hale getirmez.
Hizmet hesabı bağlamayı kullanırsanız, belirteci amaçlanan kullanım durumlarınızla sınırlamak için uygun RBAC ilkelerini ayarlayın. Yüksek ayrıcalıklı erişimden kaçınmak, bir saldırganın Kapsülünüze erişmesi durumunda hasar riskini azaltacaktır.
Özet
Kubernetes API sunucusuna kümenizin içinden erişmek, çalışan uygulamaların komşu iş yüklerini incelemesine ve değiştirmesine olanak tanır. Kümenizi harici API erişimine açmadan ekstra işlevsellik ekleyebilirsiniz.
Resmi istemci kitaplıkları, kullanım durumunuz için uygunsa, kullanıma hazır hale getirmeyi ve çalıştırmayı kolaylaştırır. Diğer durumlarda, manuel olarak istekte bulunmanız gerekir. https://kubernetes.default.svc
, Kubernetes’in Pod kapsayıcılarınıza enjekte ettiği sertifika yetkilisi dosyasını ve hizmet hesabı belirtecini sağlayarak. Kullandığınız yaklaşımdan bağımsız olarak, Pod’un amaçlanan eylemleri gerçekleştirme iznine sahip olması için hizmet hesabının RBAC rol bağlamalarıyla doğru şekilde yapılandırılması gerekir.