Kubernetes Pod Network Cidr Değiştirmek

Kubernetes Pod Network Cidr Değiştirmek

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.

Yorum Yapın