
Baru-baru ini, sebuah syarikat terkenal mengumumkan bahawa ia memindahkan barisan komputer ribanya kepada seni bina ARM. Apabila saya mendengar berita ini, saya teringat: ketika sekali lagi melihat harga untuk EC2 dalam AWS, saya melihat Gravitons dengan harga yang sangat lazat. Tangkapan, sudah tentu, ia adalah ARM. Saya tidak pernah terfikir bahawa ARM agak serius...
Bagi saya, seni bina ini sentiasa menjadi domain mudah alih dan perkara IoT yang lain. Pelayan "Sebenar" pada ARM entah bagaimana luar biasa, dalam beberapa cara malah liar... Walau bagaimanapun, pemikiran baharu melekat di kepala saya, jadi pada hujung minggu saya memutuskan untuk menyemak perkara yang boleh dijalankan pada ARM hari ini. Dan untuk ini saya memutuskan untuk memulakan dengan sesuatu yang dekat dan sayang - kelompok Kubernetes. Dan bukan hanya beberapa jenis "kelompok" konvensional, tetapi segala-galanya "dengan cara dewasa", supaya ia seboleh-bolehnya sama seperti yang saya biasa melihatnya dalam pengeluaran.
Menurut idea saya, kluster harus boleh diakses dari Internet, beberapa aplikasi web harus berjalan di dalamnya, dan sekurang-kurangnya perlu ada pemantauan. Untuk melaksanakan idea ini, anda memerlukan sepasang (atau lebih) Raspberry Pi sekurang-kurangnya model 3B+. AWS boleh menjadi platform untuk eksperimen, tetapi saya berminat dengan "raspberi" (yang masih terbiar). Jadi, kami akan menggunakan gugusan Kubernetes dengan Ingress, Prometheus dan Grafana pada mereka.
Menyediakan "raspberi"
Memasang OS dan SSH
Saya tidak terlalu peduli dengan memilih OS untuk dipasang: Saya baru sahaja menggunakan Raspberry Pi OS Lite terkini . Tersedia di sana , semua tindakan yang mesti dilakukan pada semua nod kelompok masa hadapan. Seterusnya, anda perlu melakukan manipulasi berikut (juga pada semua nod).
Selepas menyambungkan monitor dan papan kekunci, anda mesti mengkonfigurasi rangkaian dan SSH dahulu:
- Untuk kluster beroperasi, induk mesti mempunyai alamat IP statik, dan nod pekerja mesti mempunyai alamat IP statik. Saya lebih suka alamat statik sepanjang untuk memudahkan persediaan.
- Alamat statik boleh dikonfigurasikan dalam OS (dalam fail
/etc/dhcpcd.confterdapat contoh yang sesuai) atau dengan menetapkan pajakan dalam pelayan DHCP penghala yang digunakan (dalam kes saya, rumah). - ssh-server hanya disertakan dalam raspi-config (pilihan antara muka → ssh).
Selepas ini, anda boleh log masuk melalui SSH (log masuk lalai ialah pi, dan kata laluan ialah raspberry atau yang anda tukar) dan teruskan dengan tetapan.
Tetapan lain
- Mari kita tetapkan nama hos. Dalam contoh saya mereka akan gunakan
pi-controlиpi-worker. - Mari kita semak bahawa sistem fail dilanjutkan untuk meliputi keseluruhan cakera (
df -h /). Jika perlu, ia boleh dikembangkan menggunakan raspi-config. - Mari tukar kata laluan pengguna lalai dalam raspi-config.
- Mari matikan fail swap (ini adalah keperluan Kubernetes; jika anda berminat dengan butiran mengenai topik ini, lihat ):
dphys-swapfile swapoff systemctl disable dphys-swapfile - Mari kemas kini pakej kepada versi terkini:
apt-get update && apt-get dist-upgrade -y - Mari pasangkan Docker dan pakej tambahan:
apt-get install -y docker docker.io apt-transport-https curl bridge-utils iptables-persistentApabila memasang
iptables-persistentanda perlu menyimpan tetapan iptables untuk ipv4, dan dalam fail/etc/iptables/rules.v4- tambah peraturan pada rantaiFORWARD, seperti ini:# Generated by xtables-save v1.8.2 on Sun Jul 19 00:27:43 2020 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A FORWARD -s 10.1.0.0/16 -j ACCEPT -A FORWARD -d 10.1.0.0/16 -j ACCEPT COMMIT - Yang tinggal hanyalah but semula.
Kini anda sudah bersedia untuk memasang kluster Kubernetes anda.
Memasang Kubernetes
Pada peringkat ini, saya sengaja mengetepikan semua perkembangan saya dan korporat kami untuk mengautomasikan pemasangan dan konfigurasi gugusan K8s. Sebaliknya, mari gunakan dokumentasi rasmi dengan (sedikit ditambah dengan ulasan dan singkatan).
Mari tambahkan repositori Kubernetes:
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get updateSelanjutnya dalam dokumentasi adalah dicadangkan untuk memasang CRI (antara muka masa jalan kontena). Memandangkan Docker sudah dipasang, mari teruskan dan pasang komponen utama:
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni Pada langkah memasang komponen utama, saya segera menambah kubernetes-cni, yang diperlukan untuk kluster beroperasi. Dan di sini terdapat satu perkara penting: pakej kubernetes-cni atas sebab tertentu ia tidak mencipta direktori lalai untuk tetapan antara muka CNI, jadi saya terpaksa menciptanya secara manual:
mkdir -p /etc/cni/net.dUntuk bahagian belakang rangkaian berfungsi, yang akan dibincangkan di bawah, anda perlu memasang pemalam untuk CNI. Saya memilih pemalam portmap yang biasa dan mudah difahami oleh saya (untuk senarai lengkap, lihat ):
curl -sL https://github.com/containernetworking/plugins/releases/download/v0.7.5/cni-plugins-arm-v0.7.5.tgz | tar zxvf - -C /opt/cni/bin/ ./portmapMengkonfigurasi Kubernetes
Nod dengan satah kawalan
Memasang kluster itu sendiri agak mudah. Dan untuk mempercepatkan proses ini dan mengesahkan bahawa imej Kubernetes tersedia, anda boleh menjalankan:
kubeadm config images pullSekarang kami menjalankan pemasangan itu sendiri - mulakan satah kawalan kluster:
kubeadm init --pod-network-cidr=10.1.0.0/16 --service-cidr=10.2.0.0/16 --upload-certsSila ambil perhatian bahawa subnet untuk perkhidmatan dan pod tidak boleh bertindih antara satu sama lain atau dengan rangkaian sedia ada.
Pada akhirnya, kami akan ditunjukkan mesej bahawa semuanya baik-baik saja, dan pada masa yang sama mereka akan memberitahu kami cara melampirkan nod pekerja pada satah kawalan:
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of the control-plane node running the following command on each as root:
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4
--discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050
--contrl-plane --certificate-key 72a3c0a14c627d6d7fdade1f4c8d7a41b0fac31b1faf0d8fdf9678d74d7d2403
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4
--discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050Mari ikuti cadangan untuk menambah konfigurasi untuk pengguna. Pada masa yang sama, saya mengesyorkan menambah autolengkap untuk kubectl dengan segera:
kubectl completion bash > ~/.kube/completion.bash.inc
printf "
# Kubectl shell completion
source '$HOME/.kube/completion.bash.inc'
" >> $HOME/.bash_profile
source $HOME/.bash_profilePada peringkat ini, anda sudah boleh melihat nod pertama dalam kluster (walaupun ia belum bersedia lagi):
root@pi-control:~# kubectl get no
NAME STATUS ROLES AGE VERSION
pi-control NotReady master 29s v1.18.6Konfigurasi rangkaian
Seterusnya, seperti yang dinyatakan dalam mesej selepas pemasangan, anda perlu memasang rangkaian ke dalam kelompok. Dokumentasi menawarkan pilihan daripada Calico, Cilium, contiv-vpp, Kube-router dan Weave Net... Di sini saya menyimpang daripada arahan rasmi dan memilih pilihan yang lebih biasa dan mudah difahami untuk saya: dalam mod hos-gw (untuk maklumat lanjut tentang bahagian belakang yang tersedia, lihat ).
Memasangnya dalam kelompok agak mudah. Mula-mula, muat turun manifes:
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml Kemudian tukar jenis dengan dalam tetapan vxlan pada host-gw:
sed -i 's/vxlan/host-gw/' kube-flannel.yml... dan subnet pod - daripada nilai lalai kepada nilai yang ditentukan semasa permulaan kluster:
sed -i 's#10.244.0.0/16#10.1.0.0/16#' kube-flannel.ymlSelepas itu, kami mencipta sumber:
kubectl create -f kube-flannel.yml sedia! Selepas beberapa lama, nod K8s pertama akan bertukar kepada status Ready:
NAME STATUS ROLES AGE VERSION
pi-control Ready master 2m v1.18.6Menambah Nod Pekerja
Kini anda boleh menambah pekerja. Untuk melakukan ini - selepas memasang Kubernetes sendiri mengikut senario yang diterangkan di atas - anda hanya perlu menjalankan arahan yang diterima sebelum ini:
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4
--discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050Pada ketika ini kita boleh mengandaikan bahawa kluster sudah sedia:
root@pi-control:~# kubectl get no
NAME STATUS ROLES AGE VERSION
pi-control Ready master 28m v1.18.6
pi-worker Ready <none> 2m8s v1.18.6Saya hanya mempunyai dua Raspberry Pis di tangan, jadi memberikan salah satu daripadanya sahaja Saya tidak mahu ia di bawah pesawat kawalan. Jadi saya mengeluarkan kotoran yang dipasang secara automatik dari nod kawalan pi dengan menjalankan:
root@pi-control:~# kubectl edit node pi-control... dan mengalih keluar baris:
- effect: NoSchedule
key: node-role.kubernetes.io/masterMengisi kluster dengan minimum yang diperlukan
Pertama sekali kita perlukan Helm. Sudah tentu, anda boleh melakukan segala-galanya tanpa itu, tetapi Helm membenarkan anda menyesuaikan beberapa komponen secara literal mengikut budi bicara anda tanpa menyunting fail. Dan sebenarnya, ia hanyalah fail binari yang "tidak meminta roti."
Jadi mari kita pergi ke ke bahagian dokumen/pemasangan dan laksanakan arahan dari sana:
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bashSelepas itu, tambahkan repositori carta:
helm repo add stable https://kubernetes-charts.storage.googleapis.com/Sekarang mari pasang komponen infrastruktur seperti yang dirancang:
- Pengawal masuk;
- Prometheus;
- Grafana;
- pengurus sijil.
Pengawal masuk
Komponen pertama ialah Pengawal masuk - Pemasangan agak mudah dan sedia untuk digunakan di luar kotak. Untuk melakukan ini, hanya pergi ke dan jalankan arahan pemasangan dari sana:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yamlWalau bagaimanapun, pada masa ini "raspberi" mula tegang dan memasuki cakera IOPS. Faktanya ialah bersama-sama dengan pengawal Ingress, sejumlah besar sumber dipasang, banyak permintaan kepada API dibuat dan, dengan itu, banyak data ditulis kepada etcd. Secara umum, sama ada kad memori kelas 10 tidak begitu produktif, atau kad SD pada dasarnya tidak mencukupi untuk beban sedemikian. Namun, selepas kira-kira 5 minit semuanya bermula.
Ruang nama telah dicipta dan pengawal dan semua yang diperlukan muncul di dalamnya:
root@pi-control:~# kubectl -n ingress-nginx get pod
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-2hwdx 0/1 Completed 0 31s
ingress-nginx-admission-patch-cp55c 0/1 Completed 0 31s
ingress-nginx-controller-7fd7d8df56-68qp5 1/1 Running 0 48sPrometheus
Dua komponen seterusnya agak mudah untuk dipasang melalui Helm dari repo carta.
Kita dapati Prometheus, cipta ruang nama dan tetapkannya kepada:
helm search repo stable | grep prometheus
kubectl create ns monitoring
helm install prometheus --namespace monitoring stable/prometheus --set server.ingress.enabled=True --set server.ingress.hosts={"prometheus.home.pi"}Secara lalai, Prometheus memesan 2 cakera: untuk data Prometheus itu sendiri dan untuk data AlertManager. Memandangkan kelas storan belum dibuat dalam kelompok, cakera tidak akan dipesan dan pod tidak akan bermula. Untuk pemasangan Kubernetes logam kosong, kami biasanya menggunakan Ceph rbd, tetapi dalam kes Raspberry Pi ini jelas berlebihan.
Oleh itu, mari kita cipta storan tempatan yang mudah pada laluan hos. PV (isipadu berterusan) manifes untuk prometheus-server dan prometheus-alertmanager digabungkan dalam fail prometheus-pv.yaml в . Direktori untuk PV diperlukan terlebih dahulu buat pada cakera nod yang kita ingin ikat Prometheus: dalam contoh ia ditulis nodeAffinity dengan nama hos pi-worker dan direktori dicipta di atasnya /data/localstorage/prometheus-server и /data/localstorage/prometheus-alertmanager.
Muat turun (klon) manifes dan tambahkannya pada Kubernetes:
kubectl create -f prometheus-pv.yamlPada peringkat ini, saya pertama kali menghadapi masalah seni bina ARM. Kube-state-metrics, yang dipasang secara lalai dalam carta Prometheus, enggan bermula. Ia memberikan ralat:
root@pi-control:~# kubectl -n monitoring logs prometheus-kube-state-metrics-c65b87574-l66d8
standard_init_linux.go:207: exec user process caused "exec format error"Hakikatnya ialah kube-state-metrics menggunakan imej projek CoreOS, yang tidak disusun untuk ARM:
kubectl -n monitoring get deployments.apps prometheus-kube-state-metrics -o=jsonpath={.spec.template.spec.containers[].image}
quay.io/coreos/kube-state-metrics:v1.9.7Saya terpaksa melakukan googling sedikit dan mencari, sebagai contoh, . Untuk menggunakannya, mari kemas kini keluaran untuk menunjukkan imej yang hendak digunakan untuk kube-state-metrics:
helm upgrade prometheus --namespace monitoring stable/prometheus --set server.ingress.enabled=True --set server.ingress.hosts={"prometheus.home.pi"} --set kube-state-metrics.image.repository=carlosedp/kube-state-metrics --set kube-state-metrics.image.tag=v1.9.6Mari kita semak bahawa semuanya telah bermula:
root@pi-control:~# kubectl -n monitoring get po
NAME READY STATUS RESTARTS AGE
prometheus-alertmanager-df65d99d4-6d27g 2/2 Running 0 5m56s
prometheus-kube-state-metrics-5dc5fd89c6-ztmqr 1/1 Running 0 5m56s
prometheus-node-exporter-49zll 1/1 Running 0 5m51s
prometheus-node-exporter-vwl44 1/1 Running 0 4m20s
prometheus-pushgateway-c547cfc87-k28qx 1/1 Running 0 5m56s
prometheus-server-85666fd794-z9qnc 2/2 Running 0 4m52sGrafana dan pengurus sijil
Untuk carta dan papan pemuka kami tetapkan grafana:
helm install grafana --namespace monitoring stable/grafana --set ingress.enabled=true --set ingress.hosts={"grafana.home.pi"}Pada akhir output kami akan ditunjukkan cara mendapatkan kata laluan akses:
kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echoUntuk memesan sijil kami akan pasang pengurus sijil. Untuk memasangnya, sila rujuk , yang menawarkan arahan yang sepadan untuk Helm:
helm repo add jetstack https://charts.jetstack.io
helm install
cert-manager jetstack/cert-manager
--namespace cert-manager
--version v0.16.0
--set installCRDs=trueUntuk sijil yang ditandatangani sendiri untuk kegunaan rumah, ini cukup memadai. Jika anda perlu mendapatkan yang sama Ayo Sulitkan, maka anda juga perlu mengkonfigurasi pengeluar kluster. Butiran mengenai perkara ini boleh didapati dalam artikel kami "'.
Saya sendiri menetap pada pilihan daripada , memutuskan bahawa pilihan pementasan LE akan mencukupi. Kami menukar e-mel dalam contoh, simpan ke fail dan tambahkannya ke kluster ():
kubectl create -f cert-manager-cluster-issuer.yamlKini anda boleh memesan sijil, sebagai contoh, untuk Grafana. Ini memerlukan domain dan akses kepada kluster dari luar. Saya mempunyai domain dan saya mengkonfigurasi trafik dengan memajukan port 80 dan 443 pada penghala rumah saya mengikut perkhidmatan pengawal masuk yang dibuat:
kubectl -n ingress-nginx get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller NodePort 10.2.206.61 <none> 80:31303/TCP,443:30498/TCP 23dDalam kes ini, port 80 diterjemahkan kepada 31303, dan port 443 kepada 30498. (Port dijana secara rawak, jadi port anda akan berbeza.)
Berikut adalah contoh sijil ():
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: grafana
namespace: monitoring
spec:
dnsNames:
- grafana.home.pi
secretName: grafana-tls
issuerRef:
kind: ClusterIssuer
name: letsencrypt-stagingTambahkannya pada kluster:
kubectl create -f cert-manager-grafana-certificate.yamlSelepas ini, sumber Ingress akan muncul, yang melaluinya pengesahan Let's Encrypt akan berlaku:
root@pi-control:~# kubectl -n monitoring get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
cm-acme-http-solver-rkf8l <none> grafana.home.pi 192.168.88.31 80 72s
grafana <none> grafana.home.pi 192.168.88.31 80 6d17h
prometheus-server <none> prometheus.home.pi 192.168.88.31 80 8d Selepas pengesahan berlalu, kita akan melihat bahawa sumber itu certificate bersedia, dan dalam rahsia di atas grafana-tls - sijil dan kunci. Anda boleh segera menyemak siapa yang mengeluarkan sijil:
root@pi-control:~# kubectl -n monitoring get certificate
NAME READY SECRET AGE
grafana True grafana-tls 13m
root@pi-control:~# kubectl -n monitoring get secrets grafana-tls -ojsonpath="{.data['tls.crt']}" | base64 -d | openssl x509 -issuer -noout
issuer=CN = Fake LE Intermediate X1Mari kembali ke Grafana. Kami perlu membetulkan sedikit keluaran Helmnya dengan menukar tetapan untuk TLS agar sepadan dengan sijil yang dijana.
Untuk melakukan ini, muat turun carta, edit dan kemas kini daripada direktori tempatan:
helm pull --untar stable/grafana Mengedit dalam fail grafana/values.yaml Parameter TLS:
tls:
- secretName: grafana-tls
hosts:
- grafana.home.pi Di sini anda boleh segera mengkonfigurasi Prometheus yang dipasang sebagai datasource:
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-server:80
access: proxy
isDefault: trueKini kami mengemas kini carta Grafana dari direktori tempatan:
helm upgrade grafana --namespace monitoring ./grafana --set ingress.enabled=true --set ingress.hosts={"grafana.home.pi"} Menyemak apa yang ada dalam Ingress grafana port 443 telah ditambah dan terdapat akses melalui HTTPS:
root@pi-control:~# kubectl -n monitoring get ing grafana
NAME CLASS HOSTS ADDRESS PORTS AGE
grafana <none> grafana.home.pi 192.168.88.31 80, 443 63m
root@pi-control:~# curl -kI https://grafana.home.pi
HTTP/2 302
server: nginx/1.19.1
date: Tue, 28 Jul 2020 19:01:31 GMT
content-type: text/html; charset=utf-8
cache-control: no-cache
expires: -1
location: /login
pragma: no-cache
set-cookie: redirect_to=%2F; Path=/; HttpOnly; SameSite=Lax
x-frame-options: deny
strict-transport-security: max-age=15724800; includeSubDomainsUntuk menunjukkan Grafana dalam tindakan, anda boleh memuat turun dan menambah . Inilah rupanya:

Saya juga mengesyorkan menambah papan pemuka untuk pengeksport nod: ia akan menunjukkan secara terperinci apa yang berlaku dengan "raspberi" (beban CPU, memori, rangkaian, penggunaan cakera, dll.).
Selepas ini saya fikir begitu kluster sedia menerima dan menjalankan permohonan!
Nota tentang perhimpunan
Terdapat sekurang-kurangnya dua pilihan untuk membina aplikasi untuk seni bina ARM. Pertama, anda boleh membina pada peranti ARM. Walau bagaimanapun, selepas melihat pelupusan semasa dua Raspberry Pis, saya menyedari bahawa mereka juga tidak akan bertahan dalam pemasangan. Oleh itu, saya memesan sendiri Raspberry Pi 4 baharu (ia lebih berkuasa dan mempunyai memori sebanyak 4 GB) - Saya bercadang untuk membinanya.
Pilihan kedua ialah membina imej Docker berbilang gerbang pada mesin yang lebih berkuasa. Untuk ini ada . Jika aplikasi dalam bahasa yang disusun, maka kompilasi silang untuk ARM akan diperlukan. Saya tidak akan menerangkan semua tetapan untuk laluan ini, kerana... Ini memerlukan artikel yang berasingan. Dengan melaksanakan pendekatan ini, adalah mungkin untuk mencapai imej "sejagat": Docker yang berjalan pada mesin ARM sendiri akan memuat turun secara automatik imej yang sepadan dengan seni bina.
Kesimpulan
Percubaan melebihi semua jangkaan saya: [sekurang-kurangnya] Kubernetes "vanila" dengan asas yang diperlukan terasa baik pada ARM, dan hanya beberapa nuansa yang timbul dengan konfigurasinya.
Raspberry Pi 3B+ sendiri menyimpan beban pada CPU, tetapi kad SD mereka adalah halangan yang jelas. Rakan sekerja mencadangkan bahawa dalam beberapa versi adalah mungkin untuk boot dari USB, di mana anda boleh menyambungkan SSD: maka kemungkinan besar keadaan akan menjadi lebih baik.
Berikut ialah contoh beban CPU semasa memasang Grafana:

Untuk eksperimen dan "mencubanya", pada pendapat saya, kluster Kubernetes pada "raspberi" menyampaikan perasaan operasi jauh lebih baik daripada Minikube yang sama, kerana semua komponen kluster dipasang dan berfungsi "seperti orang dewasa".
Pada masa hadapan, terdapat idea untuk menambah kepada kluster keseluruhan kitaran CI/CD, dilaksanakan sepenuhnya pada Raspberry Pi. Saya juga akan gembira jika seseorang berkongsi pengalaman mereka dalam menyediakan K8 pada AWS Gravitons.
PS Ya, "pengeluaran" mungkin lebih dekat daripada yang saya fikirkan:

PPS
Baca juga di blog kami:
- «'.
Sumber: www.habr.com
