AKS'de ağ ilkelerini kullanarak podlar arasındaki trafiğin güvenliğini sağlama
Kubernetes'te modern, mikro hizmet tabanlı uygulamalar çalıştırdığınızda, genellikle hangi bileşenlerin birbiriyle iletişim kurabileceğini denetlemek istersiniz. Azure Kubernetes Service (AKS) kümesindeki podlar arasında trafiğin nasıl akabileceğine en az ayrıcalık ilkesi uygulanmalıdır. Arka uç uygulamalarına doğrudan gelen trafiği engellemek istediğinizi varsayalım. Kubernetes'teki ağ ilkesi özelliği, kümedeki podlar arasında giriş ve çıkış trafiği için kurallar tanımlamanıza olanak tanır.
Bu makalede, AKS'de podlar arasındaki trafik akışını denetlemek için ağ ilkesi altyapısının nasıl yükleneceği ve Kubernetes ağ ilkelerinin nasıl oluşturulacağı gösterilmektedir. Ağ ilkeleri AKS'deki Linux tabanlı veya Windows tabanlı düğümler ve podlar için kullanılabilir.
Ağ ilkesine genel bakış
AKS kümesindeki tüm podlar, varsayılan olarak sınırlama olmadan trafik gönderebilir ve alabilir. Güvenliği geliştirmek için trafik akışını denetleen kurallar tanımlayabilirsiniz. Arka uç uygulamaları genellikle yalnızca gerekli ön uç hizmetlerine maruz bırakılır, örneğin. Veya veritabanı bileşenlerine yalnızca bunlara bağlanan uygulama katmanları erişebilir.
Ağ ilkesi, podlar arasındaki iletişim için erişim ilkelerini tanımlayan bir Kubernetes belirtimidir. Ağ ilkelerini kullandığınızda, trafik göndermek ve almak için sıralı bir kural kümesi tanımlarsınız. Kuralları, bir veya daha fazla etiket seçiciyle eşleşen pod koleksiyonuna uygularsınız.
Ağ ilkesi kuralları YAML bildirimleri olarak tanımlanır. Ağ ilkeleri, dağıtım veya hizmet de oluşturan daha geniş bir bildirimin parçası olarak eklenebilir.
AKS'de ağ ilkesi seçenekleri
Azure, ağ ilkelerini zorlamak için üç Ağ İlkesi altyapısı sağlar:
- Cilium tarafından desteklenen Azure CNI kullanan AKS kümeleri için Cilium.
- Azure Ağ İlkesi Yöneticisi.
- Tigera tarafından kurulan açık kaynak ağ ve ağ güvenlik çözümü Calico.
Cilium, önerilen Ağ İlkesi altyapımızdır. Cilium, genellikle "IPTable'lardan" daha verimli olan Linux Berkeley Paket Filtresi'ni (BPF) kullanarak trafikte ağ ilkesi uygular. Cilium tarafından desteklenen Azure CNI belgelerindeki diğer ayrıntılara bakın.
Belirtilen ilkeleri zorunlu kılmak için Linux için Azure Ağ İlkesi Yöneticisi Linux IPTable'ları kullanır. Windows için Azure Ağ İlkesi Yöneticisi, Konak Ağ Hizmeti (HNS) ACLPolicies kullanır. İlkeler izin verilen ve izin verilmeyen IP çiftlerine çevrilir. Bu çiftler daha sonra veya HNS ACLPolicy
filtre kuralları olarak IPTable
programlanmıştır.
Ağ İlkesi altyapıları arasındaki farklar: Cilium, Azure NPM ve Calico
Özellik | Azure Ağ İlkesi Yöneticisi | Calico | Cilium |
---|---|---|---|
Desteklenen platformlar | Linux, Windows Server 2022 (Önizleme). | Linux, Windows Server 2019 ve 2022. | Linux. |
Desteklenen ağ seçenekleri | Azure Container Networking Interface (CNI). | Azure CNI (Linux, Windows Server 2019 ve 2022) ve kubenet (Linux). | Azure CNI. |
Kubernetes belirtimiyle uyumluluk | Desteklenen tüm ilke türleri | Tüm ilke türleri desteklenir. | Tüm ilke türleri desteklenir. |
Diğer özellikler | Yok. | Genel Ağ İlkesi, Genel Ağ Kümesi ve Konak Uç Noktasından oluşan genişletilmiş ilke modeli. Bu genişletilmiş özellikleri yönetmek için CLI kullanma calicoctl hakkında daha fazla bilgi için bkz . calicoctl kullanıcı başvurusu. |
Yok. |
Destek | Azure Destek ve Mühendislik ekibi tarafından desteklenir. | Azure Destek ve Mühendislik ekibi tarafından desteklenir. | Azure Destek ve Mühendislik ekibi tarafından desteklenir. |
Azure Ağ İlkesi Yöneticisi'nin sınırlamaları
Not
Linux için Azure NPM ile 250 düğüm ve 20.000 poddan fazla ölçeklendirmeye izin vermiyoruz. Bu sınırların ötesine ölçeklendirmeye çalışırsanız Bellek Yetersiz (OOM) hatalarıyla karşılaşabilirsiniz. Daha iyi ölçeklenebilirlik ve IPv6 desteği için ve aşağıdaki sınırlamalar önemliyse, ağ ilkesi altyapısı olarak Cilium'u kullanmak için Cilium Tarafından Desteklenen Azure CNI'yi kullanmanızı veya yükseltmenizi öneririz.
Azure NPM, IPv6'ları desteklemez. Aksi takdirde, Linux'taki ağ ilkesi belirtimlerini tam olarak destekler.
Windows'da Azure NPM, ağ ilkesi belirtimlerinin aşağıdaki özelliklerini desteklemez:
- Adlandırılmış bağlantı noktaları.
- Akış Denetimi İletim Protokolü (SCTP).
- Negatif eşleşme etiketi veya ad alanı seçicileri. Örneğin, dışındaki
debug=true
tüm etiketler. except
sınıfsız etki alanları arası yönlendirme (CIDR) blokları (özel durumlarla CIDR).
Not
Desteklenmeyen bir ağ ilkesi oluşturulursa Azure Ağ İlkesi Yöneticisi pod günlükleri bir hata kaydeder.
Ağ ilkelerini düzenleme/silme
Bazı nadir durumlarda, "yeterince büyük" bir ağ ilkesini düzenlerken veya silerken etkilenen düğümlerde podlara/podlardan yeni bağlantılar için geçici, beklenmeyen bağlantılara neden olabilecek bir yarış durumuna çarpma olasılığı vardır. Bu yarış durumuna basmak hiçbir zaman etkin bağlantıları etkilemez.
Bu yarış durumu bir düğüm için oluşursa, bu düğümdeki Azure NPM podu güvenlik kurallarını güncelleştiremeyen bir duruma girer ve bu durum etkilenen düğümdeki podlara/podlardan yeni bağlantılar için beklenmeyen bağlantıya neden olabilir. Sorunu azaltmak için, Azure NPM podu bu duruma girdikten yaklaşık 15 saniye sonra otomatik olarak yeniden başlatılır. Azure NPM etkilenen düğümde yeniden başlatılırken tüm güvenlik kurallarını siler ve ardından tüm ağ ilkeleri için güvenlik kurallarını yeniden uygular. Tüm güvenlik kuralları yeniden uygulanırken, etkilenen düğümdeki podlara/podlardan yeni bağlantılar için geçici, beklenmeyen bir bağlantı olasılığı vardır.
Bu yarış durumuna çarpma olasılığını sınırlamak için ağ ilkesinin boyutunu küçültebilirsiniz. Bu sorun büyük olasılıkla birkaç ipBlock
bölümü olan bir ağ ilkesinde oluşur. Dört veya daha az ipBlock
bölümü olan bir ağ ilkesinin soruna ulaşma olasılığı daha düşüktür.
Başlamadan önce
Azure CLI sürüm 2.0.61 veya üzerinin yüklü ve yapılandırılmış olması gerekir. Sürümü bulmak için az --version
komutunu çalıştırın. Yüklemeniz veya yükseltmeniz gerekirse, bkz. Azure CLI yükleme.
AKS kümesi oluşturma ve ağ ilkesini etkinleştirme
Ağ ilkelerinin nasıl çalıştığını görmek için, ağ ilkesini destekleyen bir AKS kümesi oluşturur ve ilke ekleme üzerinde çalışırsınız.
Azure Ağ İlkesi Yöneticisi'ni kullanmak için Azure CNI eklentisini kullanmanız gerekir. Calico, Azure CNI eklentisiyle veya Kubenet CNI eklentisiyle kullanılabilir.
Aşağıdaki örnek betik, sistem tarafından atanan kimliğe sahip bir AKS kümesi oluşturur ve Azure Ağ İlkesi Yöneticisi'ni kullanarak ağ ilkesini etkinleştirir.
Not
Calico, veya --network-plugin kubenet
parametreleriyle --network-plugin azure
kullanılabilir.
Sistem tarafından atanan bir kimlik kullanmak yerine, kullanıcı tarafından atanan bir kimlik de kullanabilirsiniz. Daha fazla bilgi için bkz . Yönetilen kimlikleri kullanma.
Azure Ağ İlkesi Yöneticisi'nin etkin olduğu bir AKS kümesi oluşturma - Yalnızca Linux
Bu bölümde, Linux düğüm havuzları ve Azure Ağ İlkesi Yöneticisi'nin etkin olduğu bir küme oluşturacaksınız.
Başlamak için ve $CLUSTER_NAME
değişkenleri için $RESOURCE_GROUP_NAME
değerleri değiştirirsiniz.
$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$LOCATION=canadaeast
AKS kümesini oluşturun ve ve network-policy
için network-plugin
belirtinazure
.
Küme oluşturmak için aşağıdaki komutu kullanın:
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--network-plugin azure \
--network-policy azure \
--generate-ssh-keys
Azure Ağ İlkesi Yöneticisi'nin etkin olduğu bir AKS kümesi oluşturma - Windows Server 2022 (önizleme)
Bu bölümde, Windows düğüm havuzları ve Azure Ağ İlkesi Yöneticisi'nin etkin olduğu bir küme oluşturacaksınız.
Not
Windows düğümleri olan Azure Ağ İlkesi Yöneticisi yalnızca Windows Server 2022'de kullanılabilir.
aks-preview Azure CLI uzantısını yükleme
Önemli
AKS önizleme özellikleri self servis ve kabul temelinde kullanılabilir. Önizlemeler "olduğu gibi" ve "kullanılabilir" olarak sağlanır ve hizmet düzeyi sözleşmelerinin ve sınırlı garantinin dışında tutulur. AKS önizlemeleri, müşteri desteği tarafından kısmen en iyi çaba temelinde ele alınmaktadır. Bu nedenle, bu özellikler üretim kullanımı için tasarlanmamıştır. Daha fazla bilgi için aşağıdaki destek makalelerine bakın:
Uzantıyı aks-preview
yüklemek için aşağıdaki komutu çalıştırın:
az extension add --name aks-preview
Yayımlanan uzantının en son sürümüne güncelleştirmek için aşağıdaki komutu çalıştırın:
az extension update --name aks-preview
WindowsNetworkPolicyPreview özellik bayrağını kaydetme
WindowsNetworkPolicyPreview
Aşağıdaki örnekte gösterildiği gibi az feature register komutunu kullanarak özellik bayrağını kaydedin:
az feature register --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"
Durumun Kayıtlı olarak gösterilmesi birkaç dakika sürer. az feature show komutunu kullanarak kayıt durumunu doğrulayın:
az feature show --namespace "Microsoft.ContainerService" --name "WindowsNetworkPolicyPreview"
Durum Kayıtlı olarak gösterildiğinde az provider register komutunu kullanarak kaynak sağlayıcısının Microsoft.ContainerService
kaydını yenileyin:
az provider register --namespace Microsoft.ContainerService
AKS kümesini oluşturma
Şimdi , $CLUSTER_NAME
ve $WINDOWS_USERNAME
değişkenleri için $RESOURCE_GROUP_NAME
değerleri değiştireceksiniz.
$RESOURCE_GROUP_NAME=myResourceGroup-NP
$CLUSTER_NAME=myAKSCluster
$WINDOWS_USERNAME=myWindowsUserName
$LOCATION=canadaeast
Kümenizdeki Windows Server kapsayıcılarınız için yönetici kimlik bilgileri olarak kullanmak üzere bir kullanıcı adı oluşturun. Aşağıdaki komut sizden bir kullanıcı adı ister. olarak $WINDOWS_USERNAME
ayarlayın. Bu makaledeki komutların bash kabuğuna girildiğini unutmayın.
echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
Küme oluşturmak için aşağıdaki komutu kullanın:
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--windows-admin-username $WINDOWS_USERNAME \
--network-plugin azure \
--network-policy azure \
--generate-ssh-keys
Kümenin oluşturulması birkaç dakika sürer. Varsayılan olarak, kümeniz yalnızca bir Linux düğüm havuzuyla oluşturulur. Windows düğüm havuzlarını kullanmak istiyorsanız, bir tane ekleyebilirsiniz. Bir örnek aşağıda verilmiştir:
az aks nodepool add \
--resource-group $RESOURCE_GROUP_NAME \
--cluster-name $CLUSTER_NAME \
--os-type Windows \
--name npwin \
--node-count 1
Calico etkin bir AKS kümesi oluşturma
AKS kümesini oluşturun ve ve --network-policy calico
belirtin--network-plugin azure
. Belirtilmesi --network-policy calico
, Hem Linux hem de Windows düğüm havuzlarında Calico'ya olanak tanır.
Kümenize Windows düğüm havuzları eklemeyi planlıyorsanız, Windows Server parola gereksinimlerini karşılayan ve windows-admin-password
parametrelerini ekleyinwindows-admin-username
.
Önemli
Şu anda, Calico 3.17.2 ile Kubernetes sürüm 1.20 veya üzeri kullanılarak Windows düğümleriyle Calico ağ ilkelerinin kullanılması yeni kümelerde kullanılabilir ve Azure CNI ağını kullanmanızı gerektirir. Calico etkin AKS kümelerindeki Windows düğümlerinde de varsayılan olarak Kayan IP etkindir.
Calico'nun önceki sürümlerine sahip Kubernetes 1.20 çalıştıran yalnızca Linux düğüm havuzlarına sahip kümeler için Calico sürümü otomatik olarak 3.17.2 sürümüne yükseltir.
Kümenizdeki Windows Server kapsayıcılarınız için yönetici kimlik bilgileri olarak kullanmak üzere bir kullanıcı adı oluşturun. Aşağıdaki komut sizden bir kullanıcı adı ister. olarak $WINDOWS_USERNAME
ayarlayın. Bu makaledeki komutların bash kabuğuna girildiğini unutmayın.
echo "Please enter the username to use as administrator credentials for Windows Server containers on your cluster: " && read WINDOWS_USERNAME
az aks create \
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--node-count 1 \
--windows-admin-username $WINDOWS_USERNAME \
--network-plugin azure \
--network-policy calico \
--generate-ssh-keys
Kümenin oluşturulması birkaç dakika sürer. Varsayılan olarak, kümeniz yalnızca bir Linux düğüm havuzuyla oluşturulur. Windows düğüm havuzlarını kullanmak istiyorsanız, bir tane ekleyebilirsiniz. Örneğin:
az aks nodepool add \
--resource-group $RESOURCE_GROUP_NAME \
--cluster-name $CLUSTER_NAME \
--os-type Windows \
--name npwin \
--node-count 1
Azure Ağ İlkesi Yöneticisi'ni veya Calico'yu mevcut bir kümeye yükleme
Azure Ağ İlkesi Yöneticisi veya Calico'yu mevcut AKS kümelerine yükleme de desteklenir.
Uyarı
Yükseltme işlemi her düğüm havuzunun aynı anda yeniden görüntüsünün alınması için tetikler. Her düğüm havuzunun ayrı olarak yükseltilmesi desteklenmez. Küme ağındaki tüm kesintiler, düğüm havuzundaki her düğümün yeniden görüntülendiği düğüm görüntüsü yükseltmesine veya Kubernetes sürümü yükseltmesine benzer.
Azure Ağ İlkesi Yöneticisi'ni yüklemek için örnek komut:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy azure
Calico'u yüklemek için örnek komut:
Uyarı
Bu uyarı, Calico etkinleştirilmiş Kubenet kümelerini Calico özellikli Azure CNI Yer Paylaşımı'na yükseltmek için geçerlidir.
- Calico etkinleştirilmiş Kubenet kümelerinde, Calico hem CNI hem de ağ ilkesi altyapısı olarak kullanılır.
- Azure CNI kümelerinde Calico, CNI olarak değil yalnızca ağ ilkesi zorlaması için kullanılır. Bu, pod başlatması ile Calico'nın poddan giden trafiğe izin vermesi arasında kısa bir gecikmeye neden olabilir.
Bu sorundan kaçınmak için Calico yerine Cilium kullanılması önerilir. Cilium tarafından desteklenen Azure CNI'de Cilium hakkında daha fazla bilgi edinin
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy calico
Azure NPM veya Calico yüklü olan mevcut bir kümeyi Cilium tarafından desteklenen Azure CNI'ye yükseltme
Ağ İlkesi altyapısı cilium tarafından desteklenen Azure CNI'ye yüklenmiş mevcut bir kümeyi yükseltmek için bkz . Mevcut bir kümeyi Cilium tarafından desteklenen Azure CNI'ye yükseltme
Ağ ilkesi kurulumunu doğrulama
Küme hazır olduğunda az aks get-credentials komutunu kullanarak Kubernetes kümenize bağlanacak şekilde yapılandırınkubectl
. Bu komut kimlik bilgilerini indirir ve Kubernetes CLI'yi bunları kullanacak şekilde yapılandırmaktadır:
az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
Ağ ilkesini doğrulamaya başlamak için örnek bir uygulama oluşturur ve trafik kuralları ayarlarsınız.
İlk olarak, örnek podları çalıştırmak için adlı demo
bir ad alanı oluşturun:
kubectl create namespace demo
Şimdi ve server
adlı client
kümede iki pod oluşturun.
Not
İstemciyi veya sunucuyu belirli bir düğümde zamanlamak istiyorsanız, pod oluşturma kubectl run komutundaki bağımsız değişkenden önce --command
aşağıdaki biti ekleyin:
--overrides='{"spec": { "nodeSelector": {"kubernetes.io/os": "linux|windows"}}}'
Bir server
pod oluşturun. Bu pod 80 numaralı TCP bağlantı noktasında hizmet eder:
kubectl run server -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --labels="app=server" --port=80 --command -- /agnhost serve-hostname --tcp --http=false --port "80"
Bir client
pod oluşturun. Aşağıdaki komut, pod üzerinde Bash çalıştırır client
:
kubectl run -it client -n demo --image=k8s.gcr.io/e2e-test-images/agnhost:2.33 --command -- bash
Şimdi ayrı bir pencerede aşağıdaki komutu çalıştırarak sunucu IP'sini alın:
kubectl get pod --output=wide -n demo
Çıkış şöyle görünmelidir:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
server 1/1 Running 0 30s 10.224.0.72 akswin22000001 <none> <none>
Ağ ilkesi olmadan bağlantıyı test etme
İstemcinin kabuğunda aşağıdaki komutu çalıştırarak sunucuyla bağlantıyı doğrulayın. değerini, önceki komutun çalıştırdığı çıktıda bulunan IP'yi kullanarak değiştirin server-ip
. Bağlantı başarılı olursa çıkış olmaz.
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Ağ ilkesiyle bağlantıyı test etme
Ağ ilkeleri eklemek için adlı demo-policy.yaml
bir dosya oluşturun ve aşağıdaki YAML bildirimini yapıştırın:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: demo-policy
namespace: demo
spec:
podSelector:
matchLabels:
app: server
ingress:
- from:
- podSelector:
matchLabels:
app: client
ports:
- port: 80
protocol: TCP
YAML bildiriminizin adını belirtin ve kubectl apply kullanarak uygulayın:
kubectl apply –f demo-policy.yaml
Şimdi istemcinin kabuğunda aşağıdaki /agnhost
komutu çalıştırarak sunucuyla bağlantıyı doğrulayın:
/agnhost connect <server-ip>:80 --timeout=3s --protocol=tcp
Sunucu ile app=server
etiketlendiğinden ancak istemci etiketlenmediğinden trafikle bağlantı engellenir. Yukarıdaki connect komutu şu çıkışı verir:
TIMEOUT
öğesini etiketlemek client
ve sunucuyla bağlantıyı doğrulamak için aşağıdaki komutu çalıştırın. Çıkış hiçbir şey döndürmemelidir.
kubectl label pod client -n demo app=client
Azure Ağ İlkesi Yöneticisi'ni veya Calico'u kaldırma
Gereksinimler:
- Azure CLI sürüm 2.63 veya üzeri
Not
- Kaldırma işlemi, Calico tarafından kullanılan Özel Kaynak Tanımlarını (CRD) ve Özel Kaynakları (CR) kaldırmaz. Bu CRD'lerin ve CR'lerin tümü "projectcalico.org" veya "tigera.io" ile biten adlara sahiptir. Bu CRD'ler ve ilişkili CR'ler, Calico başarıyla kaldırıldıktan sonra el ile silinebilir (Calico kaldırılmadan önce CRD'lerin silinmesi kümeyi bozar).
- Yükseltme, kümedeki hiçbir NetworkPolicy kaynağını kaldırmaz, ancak kaldırma işlemi tamamlandıktan sonra bu ilkeler artık uygulanmaz.
Uyarı
Yükseltme işlemi her düğüm havuzunun aynı anda yeniden görüntüsünün alınması için tetikler. Her düğüm havuzunun ayrı olarak yükseltilmesi desteklenmez. Küme ağındaki tüm kesintiler, düğüm havuzundaki her düğümün yeniden görüntülendiği düğüm görüntüsü yükseltmesine veya Kubernetes sürümü yükseltmesine benzer.
Azure Ağ İlkesi Yöneticisi'ni veya Calico'u bir kümeden kaldırmak için aşağıdaki komutu çalıştırın:
az aks update
--resource-group $RESOURCE_GROUP_NAME \
--name $CLUSTER_NAME \
--network-policy none
Kaynakları temizleme
Bu makalede, bir ad alanı ve iki pod oluşturdunuz ve bir ağ ilkesi uyguladınız. Bu kaynakları temizlemek için kubectl delete komutunu kullanın ve kaynak adını belirtin:
kubectl delete namespace demo
Sonraki adımlar
Ağ kaynakları hakkında daha fazla bilgi için bkz . Azure Kubernetes Service'teki (AKS) uygulamalar için ağ kavramları.
İlkeler hakkında daha fazla bilgi edinmek için bkz . Kubernetes ağ ilkeleri.
Azure Kubernetes Service