Kubernetes Pod Network Cidr Nasıl Değiştirilir?
Nedir?
Pod network cidr kubernetes clusterdaki podlarımızın cluster içi local networkde alacağı IPv4 bloğudur. Bu kubespray ve kubeadm kurulumlarında container network interface’de tanımlanır(CNI). CNI olarak en yaygın şekilde calico kullanılmaktadır.
Case
Bugün Hepsiburada private networkündeki bir kubernetes clusterda; hedef ip adresine worker node üzerinden gidebilirken, pod içinden gidemediğimiz konulu bir case geldi. Bu case üzerine yaptığımız inceleme sonucunda kubernetes pod cidr ip bloğu ile hedef ip adresimizin bulunduğu bloğun çakıştığını fark ettik. Hepsiburada gibi private ip bloklarının yetersiz kaldığı büyük ölçekli ortamlara bu tür durumlarla karşılaşmanız muhtemeldir.
Cluster productionda olduğu için olabilecek en uygun şekilde bu durumu çözmemiz gerekiyordu. Tabi bu durumun çözümü farklı yöntemlerle de olabilir fakat biz pod network cidr bloğunu Hepsiburada private networkünde bulunmayan boş farklı bir blok ile değiştirme üzerine yoğunlaştık. Bu makalemde de bu süreci neredeyse kesintisiz nasıl gerçekleştirdim bundan bahsedeceğim.
Başlayalım
Makalemin başında bahsettiğim gibi kubernetes clusterımızda Calico CNI kullanıyoruz. Yapacağım bu anlatım sadece Calico’yu kapsamaktadır.
Öncelikle kurulu olan calico üzerinde işlem yapabilmek için calicoctl deploy etmemiz gerekmetedir. Bunun için;
# kubectl apply -f https://docs.projectcalico.org/manifests/calicoctl.yaml
Sonraki komutları göndermeyi kolaylaştırmak için alias tanımlıyoruz.
# alias calicoctl="kubectl exec -i -n kube-system calicoctl -- /calicoctl "
Halihazırda var olan ip bloğunu görmek için aşağıdaki komutu kullanıyoruz.
# calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE DISABLED
default-ipv4-ippool 192.168.0.0/16 true Always false
Yeni ip bloğunu tanımlıyoruz.
# calicoctl create -f -<<EOF
apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: new-pool
spec:
cidr: 172.17.0.0/16
ipipMode: Always
natOutgoing: true
EOF
Şimdi halihazırdaki ip bloğunu silmek için aşağıdaki komutları çalıştırıyoruz.
# calicoctl get ippool -o yaml > ippool.yaml
pool.yaml şu şekilde gözükecektir.
apiVersion: projectcalico.org/v3
items:
- apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
- apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: new-pool
spec:
cidr: 172.17.0.0/16
ipipMode: Always
natOutgoing: true
Şimdi yeni eklediğimiz ip poolu siliyoruz. ippool.yaml şu hali alacaktır.
apiVersion: projectcalico.org/v3
items:
- apiVersion: projectcalico.org/v3
kind: IPPool
metadata:
name: default-ipv4-ippool
spec:
cidr: 192.168.0.0/16
ipipMode: Always
natOutgoing: true
Düzenleme bitti, şimdi varolan ippoolu silmek için aşağıdaki komutu çalıştırıyoruz.
# calicoctl delete -f - < ippool.yaml
Tekrardan ip polları listeliyoruz ve sadece yeni eklediğimizin kaldığına ve enabled olduğuna dikkat ediyoruz.
# calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE DISABLED
new-pool 172.17.0.0/16 true Always false
İşlem sonrasında eski ip bloğunda oluşmuş podlarımızı silmemiz gerekiyor.
Tüm clusterdaki eskip ip blogunda çalışan podları listelemek için;
# kubectl get pod -A -o wide |grep 192.168
Namespace bazında toplu silmek için;
# kubectl get pod -n kube-system -o wide |grep 172.16. |awk '{print $2}' |xargs -I % kubectl delete pod % -n kube-system
Calicoyu ve coredns’i restart edelim. Burası önemli.
# kubectl -n kube-system rollout restart ds calico-node
# kubectl -n kube-system rollout restart deploy coredns
İşlem bu kadar, sildiğiniz podların yerine oluşan yeni podların yeni oluşturduğunuz networkten ip aldığını göreceksiniz. Böylece “neredeyse” sıfır kesintiyle calico CNI kullandığımız kubernetes clusterımızın pod network cidr ip bloğunu değiştirmiş oluyoruz.
Bu makale : kubernetesturkey.com adresinden alıntıdır.