ProHoster > Blog > yönetim > Kubernetes ipuçları ve püf noktaları: yerel geliştirme ve Telepresence hakkında
Kubernetes ipuçları ve püf noktaları: yerel geliştirme ve Telepresence hakkında
Kubernetes'te mikro hizmetlerin geliştirilmesiyle ilgili giderek daha fazla soru alıyoruz. Geliştiriciler, özellikle de yorumlanmış dillerin geliştiricileri, en sevdikleri IDE'deki kodu hızlı bir şekilde düzeltmek ve derleme/dağıtım için beklemeden, yalnızca F5 tuşuna basarak sonucu görmek ister. Monolitik bir uygulama söz konusu olduğunda, bir veritabanını ve bir web sunucusunu (Docker, VirtualBox'ta...) yerel olarak kurmak ve ardından hemen geliştirmenin keyfini çıkarmak yeterliydi. Monolitlerin mikro hizmetlere dönüştürülmesi ve Kubernetes'in gelişiyle, birbirlerine bağımlılıkların ortaya çıkmasıyla her şey biraz daha zorlaştı. Bu mikro hizmetlerin sayısı arttıkça sorunlar da artar. Geliştirmenin tadını yeniden çıkarmak için bir veya iki Docker konteynerinden fazlasını, hatta bazen bir düzineden fazlasını yükseltmeniz gerekir... Genel olarak tüm bunlar, aynı zamanda güncel tutulması gerektiğinden oldukça fazla zaman alabilir. .
Farklı zamanlarda soruna farklı çözümler denedik. Ve birikmiş geçici çözümlerle veya sadece "koltuk değneğiyle" başlayacağım.
1. Koltuk değnekleri
Çoğu IDE, FTP/SFTP kullanarak kodu doğrudan sunucuda düzenleme yeteneğine sahiptir. Bu yol çok açık ve hemen onu kullanmaya karar verdik. Onun özü şu şekilde özetlenebilir:
Geliştirme ortamları bölmesinde (geliştirme/inceleme), SSH erişimine sahip ve uygulamayı taahhüt edecek/dağıtacak geliştiricinin genel SSH anahtarını ileten ek bir kapsayıcı başlatılır.
Başlangıç aşamasında (konteyner içinde) prepare-app) kodu aktarın emptyDiruygulama kapsayıcılarından ve SSH sunucusundan koda erişebilmek için.
Böyle bir planın teknik uygulamasını daha iyi anlamak için Kubernetes'teki ilgili YAML yapılandırmalarının parçalarını sunacağım.
konfigürasyonları
1.1. değerler.yaml
ssh_pub_key:
vasya.pupkin: <ssh public key in base64>
öyle vasya.pupkin değişkenin değeridir ${GITLAB_USER_LOGIN}.
Voila: dağıtımı başlatan geliştirici hizmet adına göre bağlanabilir (kümeye güvenli bir şekilde erişim izni nasıl verilir, biz zaten söyledik) masaüstünüzden SFTP aracılığıyla kopyalayın ve kodun kümeye teslim edilmesini beklemeden düzenleyin.
Bu tamamen işe yarayan bir çözümdür ancak uygulama açısından bakıldığında bariz dezavantajları vardır:
yalnızca hizmeti dağıtan kişi tarafından kullanılabilir;
daha sonra onu yerel dizinle kodla senkronize etmeyi ve Git'e kaydetmeyi hatırlamanız gerekir.
2. Telebulunma
Proje telepresence oldukça uzun zamandır biliniyor, ancak biz, dedikleri gibi, "bunu pratikte ciddi şekilde denemeye fırsat bulamadık." Ancak talep işini yaptı ve artık blogumuzun okuyucuları için yararlı olabilecek deneyimlerimizi paylaşmaktan mutluluk duyuyoruz - özellikle de merkezde henüz Telepresence hakkında başka materyal bulunmadığından.
Kısacası her şeyin o kadar da korkutucu olmadığı ortaya çıktı. Geliştiricinin yürütmesi gereken tüm eylemleri, adlı bir Helm grafiği metin dosyasına yerleştirdik. NOTES.txt. Böylece, hizmeti Kubernetes'e dağıttıktan sonra geliştirici, GitLab iş günlüğünde yerel geliştirme ortamını başlatma talimatlarını görür:
!!! Разработка сервиса локально, в составе Kubernetes !!!
* Настройка окружения
* * Должен быть доступ до кластера через VPN
* * На локальном ПК установлен kubectl ( https://kubernetes.io/docs/tasks/tools/install-kubectl/ )
* * Получить config-файл для kubectl (скопировать в ~/.kube/config)
* * На локальном ПК установлен telepresence ( https://www.telepresence.io/reference/install )
* * Должен быть установлен Docker
* * Необходим доступ уровня reporter или выше к репозиторию https://gitlab.site.com/group/app
* * Необходимо залогинится в registry с логином/паролем от GitLab (делается один раз):
#########################################################################
docker login registry.site.com
#########################################################################
* Запуск окружения
#########################################################################
telepresence --namespace {{ .Values.global.env }} --swap-deployment {{ .Chart.Name }}:backend --mount=/tmp/app --docker-run -v `pwd`:/app -v /tmp/app/var/run/secrets:/var/run/secrets -ti registry.site.com/group/app/backend:v8
#########################################################################
Sonuncusu hariç, bu talimatta açıklanan adımlar üzerinde ayrıntılı olarak durmayacağız. Telepresence'ın lansmanı sırasında ne olur?
Telepresence'la çalışmak
Başlangıçta (yukarıdaki talimatlarda belirtilen son komutu kullanarak) şunları ayarladık:
mikro hizmetin çalıştığı ad alanı;
sızmak istediğimiz dağıtımın ve konteynerin adları.
Geriye kalan argümanlar isteğe bağlıdır. Hizmetimiz Kubernetes API ile ve Kubernetes API için etkileşime giriyorsa Hizmet Hesabı oluşturuldusertifikaları/belirteçleri masaüstümüze yerleştirmemiz gerekiyor. Bunu yapmak için seçeneği kullanın --mount=true (ya --mount=/dst_path), bu da kökü (/) Kubernetes kapsayıcısından masaüstümüze bağlayacak. Bundan sonra (işletim sistemine ve uygulamanın nasıl başlatıldığına bağlı olarak) kümedeki "anahtarları" kullanabiliriz.
İlk olarak, bir uygulamayı çalıştırmak için en evrensel seçeneğe - Docker kapsayıcısında - bakalım. Bunu yapmak için anahtarı kullanacağız --docker-run ve kodun bulunduğu dizini konteynere ekleyin: -v `pwd`:/app
Lütfen bunun proje dizininden çalıştırıldığını varsaydığını unutmayın. Uygulama kodu dizine eklenecek /app bir kapta.
Sonraki: -v /tmp/app/var/run/secrets:/var/run/secrets — sertifikayı/belirteci içeren dizini bir konteynere monte etmek için.
Bu seçeneğin ardından son olarak uygulamanın çalışacağı görüntü gelir. NB: Bir görüntü oluştururken şunu belirtmeniz gerekir: CMD veya ENTRYPOINT!
Bundan sonra tam olarak ne olacak?
Kubernetes'te, belirtilen Dağıtım için kopya sayısı 0 olarak değiştirilecektir. Bunun yerine, yedek kapsayıcıyla yeni bir Dağıtım başlatılacaktır. backend.
Masaüstünde 2 konteyner başlatılacak: ilki Telepresence ile (Kubernetes'ten gelen/Kubernetes'e proxy istekleri gerçekleştirecek), ikincisi ise geliştirilmekte olan uygulamayla birlikte.
Uygulamayı konteynere çalıştırırsak dağıtım sırasında Helm tarafından aktarılan tüm ENV değişkenleri bizim için mevcut olacak ve tüm hizmetler de mevcut olacaktır. Geriye kalan tek şey, favori IDE'nizdeki kodu düzenlemek ve sonucun keyfini çıkarmak.
Çalışmanın sonunda Telepresence'ın çalıştığı terminali kapatmanız yeterlidir (oturumu Ctrl+C ile sonlandırın) - Docker konteynerleri masaüstünde duracak ve Kubernetes'te her şey başlangıç durumuna dönecektir. Geriye kalan tek şey taahhüt etmek, MR'yi yayınlamak ve onu incelemeye/birleştirmeye/...'ye aktarmaktır (iş akışlarınıza bağlı olarak).
Uygulamayı bir Docker kapsayıcısında çalıştırmak istemiyorsak (örneğin, PHP'de değil Go'da geliştiriyorsak ve yine de yerel olarak oluşturuyorsak), Telepresence'ı başlatmak daha da basit olacaktır:
Uygulama Kubernetes API'sine erişiyorsa, anahtarlar dizinini (https://www.telepresence.io/howto/volumes) bağlamanız gerekecektir. Linux için bir yardımcı program var kök:
Telepresence'ı seçenek olmadan başlattıktan sonra --docker-run tüm ortam değişkenleri mevcut terminalde mevcut olacaktır, dolayısıyla uygulamanın burada başlatılması gerekir.
NB: Örneğin PHP kullanırken, geliştirme için çeşitli op_cache, apc ve diğer hızlandırıcıları devre dışı bırakmayı unutmamalısınız - aksi takdirde kodu düzenlemek istenen sonuca yol açmaz.
sonuçlar
Kubernetes ile yerel kalkınma, bu platformun yaygınlaşmasıyla orantılı olarak çözümü de büyüyen bir sorun. Geliştiricilerden (müşterilerimizden) ilgili talepleri aldıktan sonra bunları mümkün olan ilk yöntemlerle çözmeye başladık, ancak bu uzun vadede kendini kanıtlayamadı. Neyse ki, bu sadece şimdi değil, sadece bizim için de açık hale geldi, bu yüzden dünyada daha uygun araçlar ortaya çıktı ve Telepresence bunların en ünlüsüdür (bu arada, ayrıca iskele Google'dan). Bunu kullanma konusundaki deneyimimiz henüz o kadar iyi değil, ancak şimdiden onu "mağazadaki meslektaşlarımıza" tavsiye etmemiz için neden veriyor - deneyin!
PS
K8'in ipuçları ve püf noktaları serisinden diğerleri: