
ã€ãæè¿ãããæåãªäŒæ¥ãã©ãããããã®è£œåã©ã€ã³ã ARM ã¢ãŒããã¯ãã£ã«ç§»è¡ãããšçºè¡šããŸããã ãã®ãã¥ãŒã¹ãèããŠæãåºããã®ã§ãããAWS ã® EC2 ã®äŸ¡æ Œãæ¹ããŠèŠãŠããããGravitons ãéåžžã«çŸå³ããããªäŸ¡æ Œãä»ããŠããããšã«æ°ã¥ããŸããã ãã¡ãããåé¡ã¯ããã ARM ã ã£ããšããããšã§ãã ãã®ãšãã¯ãARM ãéåžžã«æ·±å»ã§ãããšã¯æããããŸããã§ãã...
ç§ã«ãšã£ãŠããã®ã¢ãŒããã¯ãã£ã¯åžžã«ã¢ãã€ã«ããã®ä»ã® IoT ã®åéã§ããã ARM äžã®ãæ¬ç©ã®ããµãŒããŒã¯ãã©ããããããç°åžžã§ãããæå³ãã¯ã€ã«ãã§ãããããŸããããããæ°ããèããé ã«æ®ã£ãã®ã§ããã鱿«ã仿¥ ARM ã§äœãå®è¡ã§ããã®ãã確èªããããšã«ããŸããã ãã®ããã«ãç§ã¯èº«è¿ã§å€§åãªãã®ãã€ãŸã Kubernetes ã¯ã©ã¹ã¿ãŒããå§ããããšã«ããŸããã ãããŠãããçš®ã®åŸæ¥ã®ãã¯ã©ã¹ã¿ãŒãã ãã§ã¯ãªãããã¹ãŠããå€§äººã®æ¹æ³ã§ããæ¬çªç°å¢ã§èŠæ £ããŠãããã®ãšã§ããã ãåãã«ãªãããã«ããŠããŸãã
ç§ã®èãã«ããã°ãã¯ã©ã¹ã¿ãŒã¯ã€ã³ã¿ãŒãããããã¢ã¯ã»ã¹å¯èœã§ããããã®äžã§äœããã® Web ã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããŠãããå°ãªããšãç£èŠãè¡ãããŠããå¿ èŠããããŸãã ãã®ã¢ã€ãã¢ãå®è£ ããã«ã¯ãå°ãªããšãã¢ãã« 3B+ ã® Raspberry Pi ã®ã㢠(ãŸãã¯è€æ°) ãå¿ èŠã§ãã AWS ã¯å®éšã®ãã©ãããã©ãŒã ã«ãªãå¯èœæ§ããããŸããããç§ã¯ (ãŸã ç ã£ãŠãã)ãã©ãºããªãŒãã«èå³ããããŸããã ããã§ãIngressãPrometheusãGrafana ãå«ã Kubernetes ã¯ã©ã¹ã¿ãŒããããã€ããŸãã
ãã©ãºããªãŒãã®æºå
OSãšSSHã®ã€ã³ã¹ããŒã«
ã€ã³ã¹ããŒã«ãã OS ã®éžæã«ã¯ããŸãæ©ãŸããææ°ã® Raspberry Pi OS Lite ããã®ãŸãŸäœ¿çšããŸããã ã ããã§å©çšå¯èœ 以éã®ãã¹ãŠã®ã¢ã¯ã·ã§ã³ã¯ãå°æ¥ã®ã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ããŒãã§å®è¡ããå¿ èŠããããŸãã æ¬¡ã«ãæ¬¡ã®æäœã (ãã¹ãŠã®ããŒãã§) å®è¡ããå¿ èŠããããŸãã
ã¢ãã¿ãŒãšããŒããŒããæ¥ç¶ãããããŸããããã¯ãŒã¯ãš SSH ãæ§æããå¿ èŠããããŸãã
- ã¯ã©ã¹ã¿ãŒãåäœããã«ã¯ããã¹ã¿ãŒã«ã¯éç IP ã¢ãã¬ã¹ãå¿ èŠã§ãã¯ãŒã«ãŒ ããŒãã«ã¯éç IP ã¢ãã¬ã¹ãå¿ èŠã§ãã ç§ã¯ã»ããã¢ããã容æã«ããããã«ãå šäœçã«éçã¢ãã¬ã¹ã奜ã¿ãŸããã
- éçã¢ãã¬ã¹ã¯OSïŒãã¡ã€ã«å
ïŒã§èšå®ã§ããŸãã
/etc/dhcpcd.confé©åãªäŸããããŸã)ããŸãã¯äœ¿çšãããŠãã (ç§ã®å Žåã¯èªå® ã®) ã«ãŒã¿ãŒã® DHCP ãµãŒããŒã§ãªãŒã¹ãåºå®ããããšã«ãã£ãŠãå¯èœã§ãã - ssh-server ã¯åã« raspi-config ã«å«ãŸããŠããŸã (ã€ã³ã¿ãŒãã§ãŒã¹ãªãã·ã§ã³ â SSH).
ãã®åŸãSSH çµç±ã§ãã°ã€ã³ã§ããããã«ãªããŸã (ããã©ã«ãã®ãã°ã€ã³ã¯ piããã¹ã¯ãŒã㯠raspberry ãŸãã¯å€æŽãããã®ïŒãéžæããèšå®ãç¶è¡ããŸãã
ãã®ä»ã®èšå®
- ãã¹ãåãèšå®ããŸãããã ç§ã®äŸã§ã¯ã圌ãã¯äœ¿çšããŸã
pi-controlОpi-worker. - ãã¡ã€ã« ã·ã¹ãã ããã£ã¹ã¯å
šäœãã«ããŒããããã«æ¡åŒµãããŠããããšã確èªããŠã¿ãŸããã (
df -h /ïŒã å¿ èŠã«å¿ããŠãraspi-configã䜿çšããŠæ¡åŒµã§ããŸãã - raspi-configã§ããã©ã«ãã®ãŠãŒã¶ãŒãã¹ã¯ãŒãã倿ŽããŸãããã
- ã¹ã¯ãã ãã¡ã€ã«ããªãã«ããŸããã (ãã㯠Kubernetes ã®èŠä»¶ã§ãããã®ãããã¯ã®è©³çްã«èå³ãããå Žåã¯ããåç
§ããŠãã ãã) ):
dphys-swapfile swapoff systemctl disable dphys-swapfile - ããã±ãŒãžãææ°ããŒãžã§ã³ã«æŽæ°ããŸãããã
apt-get update && apt-get dist-upgrade -y - Docker ãšè¿œå ã®ããã±ãŒãžãã€ã³ã¹ããŒã«ããŸãããã
apt-get install -y docker docker.io apt-transport-https curl bridge-utils iptables-persistentã€ã³ã¹ããŒã«æ
iptables-persistentipv4 ã® iptables èšå®ããã¡ã€ã«ã«ä¿åããå¿ èŠããããŸãã/etc/iptables/rules.v4- ãã§ãŒã³ã«ã«ãŒã«ã远å ããŸãFORWARDãã®ããã«ïŒ# 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 - ããšã¯åèµ·åããã ãã§ãã
ããã§ãKubernetes ã¯ã©ã¹ã¿ãŒãã€ã³ã¹ããŒã«ããæºåãã§ããŸããã
Kubernetesã®ã€ã³ã¹ããŒã«
ãã®æ®µéã§ãç§ã¯ K8s ã¯ã©ã¹ã¿ãŒã®ã€ã³ã¹ããŒã«ãšæ§æãèªååããããã«ãç§èªèº«ãšç§ãã¡ã®äŒç€Ÿã®éçºããã¹ãŠæå³çã«èã«çœ®ããŸããã 代ããã«ãå ¬åŒããã¥ã¡ã³ãã䜿çšããŸããã (ã³ã¡ã³ããšç¥èªã§ãããã«è£è¶³ãããŠããŸã)ã
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 updateããã«ããã¥ã¡ã³ãã§ã¯ãCRI (ã³ã³ãã㌠ã©ã³ã¿ã€ã ã€ã³ã¿ãŒãã§ã€ã¹) ãã€ã³ã¹ããŒã«ããããšãæšå¥šãããŠããŸãã Docker ã¯ãã§ã«ã€ã³ã¹ããŒã«ãããŠããã®ã§ã次ã«é²ãã§äž»èŠã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ããŸãããã
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni äž»èŠã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ããã¹ãããã§ãããã«è¿œå ããŸãã kubernetes-cniãããã¯ã¯ã©ã¹ã¿ãŒãåäœããããã«å¿
èŠã§ãã ããã§éèŠãªç¹ããããŸããããã¯ããã±ãŒãžã§ãã kubernetes-cni äœããã®çç±ã§ãCNI ã€ã³ã¿ãŒãã§ã€ã¹èšå®çšã®ããã©ã«ã ãã£ã¬ã¯ããªãäœæãããªããããæåã§äœæããå¿
èŠããããŸããã
mkdir -p /etc/cni/net.dãããã¯ãŒã¯ ããã¯ãšã³ããæ©èœããã«ã¯ (åŸè¿°ããŸã)ãCNI ã®ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã äœ¿ãæ £ããŠããŠçè§£ããããããŒãããããã©ã°ã€ã³ãéžæããŸãã (å®å šãªãªã¹ãã«ã€ããŠã¯ããåç §ããŠãã ããã ):
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/ ./portmapKubernetesã®æ§æ
ã³ã³ãããŒã«ãã¬ãŒã³ãåããããŒã
ã¯ã©ã¹ã¿ãŒèªäœã®ã€ã³ã¹ããŒã«ã¯éåžžã«ç°¡åã§ãã ãã®ããã»ã¹ãé«éåããKubernetes ã€ã¡ãŒãžãå©çšå¯èœã§ããããšã確èªããã«ã¯ããŸã次ã®ã³ãã³ããå®è¡ããŸãã
kubeadm config images pull次ã«ãã€ã³ã¹ããŒã«èªäœãå®è¡ããŸããã¯ã©ã¹ã¿ãŒã®ã³ã³ãããŒã« ãã¬ãŒã³ãåæåããŸãã
kubeadm init --pod-network-cidr=10.1.0.0/16 --service-cidr=10.2.0.0/16 --upload-certsãµãŒãã¹ãšãããã®ãµããããã¯ãçžäºã«ããŸãã¯æ¢åã®ãããã¯ãŒã¯ãšéè€ããªãããã«æ³šæããŠãã ããã
æåŸã«ããã¹ãŠãæ£åžžã§ããããšã瀺ãã¡ãã»ãŒãžã衚瀺ãããåæã«ã¯ãŒã«ãŒ ããŒããã³ã³ãããŒã« ãã¬ãŒã³ã«æ¥ç¶ããæ¹æ³ã瀺ãããŸãã
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:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050ãŠãŒã¶ãŒã®æ§æã远å ããããã®æšå¥šäºé ã«åŸã£ãŠãã ããã åæã«ãkubectl ã®ãªãŒãã³ã³ããªãŒããããã«è¿œå ããããšããå§ãããŸãã
kubectl completion bash > ~/.kube/completion.bash.inc
printf "
# Kubectl shell completion
source '$HOME/.kube/completion.bash.inc'
" >> $HOME/.bash_profile
source $HOME/.bash_profileãã®æ®µéã§ã¯ãã¯ã©ã¹ã¿ãŒå ã®æåã®ããŒãããã§ã«è¡šç€ºãããŠããŸã (ãã ãããŸã æºåãã§ããŠããŸãã)ã
root@pi-control:~# kubectl get no
NAME STATUS ROLES AGE VERSION
pi-control NotReady master 29s v1.18.6ãããã¯ãŒã¯èšå®
次ã«ãã€ã³ã¹ããŒã«åŸã®ã¡ãã»ãŒãžã«èšèŒãããŠããããã«ããããã¯ãŒã¯ãã¯ã©ã¹ã¿ãŒã«ã€ã³ã¹ããŒã«ããå¿ èŠããããŸãã ããã¥ã¡ã³ãã§ã¯ãCalicoãCiliumãcontiv-vppãKube-routerãWeave Net ããã®éžæè¢ãæäŸãããŠããŸã...ããã§ã¯ãå ¬åŒã®æé ããéžè±ããç§ã«ãšã£ãŠãã銎æã¿ã®ãããããããããªãã·ã§ã³ãéžæããŸããã host-gw ã¢ãŒã (å©çšå¯èœãªããã¯ãšã³ãã®è©³çްã«ã€ããŠã¯ããåç §ããŠãã ãã) ).
ã¯ã©ã¹ã¿ãŒãžã®ã€ã³ã¹ããŒã«ã¯éåžžã«ç°¡åã§ãã ãŸãããããã§ã¹ããããŠã³ããŒãããŸãã
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml 次ã«ãèšå®ã§ã¿ã€ãã倿ŽããŸã vxlan Ма host-gw:
sed -i 's/vxlan/host-gw/' kube-flannel.yml...ããã³ãããã®ãµãããã - ããã©ã«ãå€ããã¯ã©ã¹ã¿ãŒã®åæåäžã«æå®ãããå€ãŸã§:
sed -i 's#10.244.0.0/16#10.1.0.0/16#' kube-flannel.ymlãã®åŸããªãœãŒã¹ãäœæããŸãã
kubectl create -f kube-flannel.yml æºåãã§ããŠïŒ ãã°ãããããšãæåã® K8s ããŒããæ¬¡ã®ã¹ããŒã¿ã¹ã«åãæ¿ãããŸãã Ready:
NAME STATUS ROLES AGE VERSION
pi-control Ready master 2m v1.18.6ã¯ãŒã«ãŒããŒãã®è¿œå
ããã§ã¯ãŒã«ãŒã远å ã§ããããã«ãªããŸããã ãããè¡ãã«ã¯ãäžèšã®ã·ããªãªã«åŸã£ãŠ Kubernetes èªäœãã€ã³ã¹ããŒã«ããåŸã以åã«åãåã£ãã³ãã³ããå®è¡ããã ãã§ãã
kubeadm join 192.168.88.30:6443 --token a485vl.xjgvzzr2g0xbtbs4
--discovery-token-ca-cert-hash sha256:9da6b05aaa5364a9ec59adcc67b3988b9c1b94c15e81300560220acb1779b050ãã®æç¹ã§ãã¯ã©ã¹ã¿ãŒã®æºåãã§ããŠãããšæ³å®ã§ããŸãã
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.6æå ã« Raspberry Pi ã XNUMX ã€ãããªãã£ãã®ã§ããã®ãã¡ã® XNUMX ã€ããã¬ãŒã³ãããŸã ã®ã¿ ã³ã³ãããŒã«ãã¬ãŒã³ã®äžã«çœ®ããããããŸããã§ããã ããã§ã次ã®ã³ãã³ããå®è¡ããŠãèªåçã«ã€ã³ã¹ããŒã«ããããã€ã³ãã pi-control ããŒãããåé€ããŸããã
root@pi-control:~# kubectl edit node pi-control...ãããŠè¡ãåé€ããŸãã
- effect: NoSchedule
key: node-role.kubernetes.io/masterã¯ã©ã¹ã¿ã«å¿ èŠæå°éã®ãã®ãåã蟌ã
ãŸã第äžã«å¿ èŠãªã®ã¯ ãã«ã¡ããã ãã¡ãããHelm ã䜿çšããªããŠããã¹ãŠã®æäœãå®è¡ã§ããŸãããHelm ã䜿çšãããšããã¡ã€ã«ãç·šéããã«æåéãäžéšã®ã³ã³ããŒãã³ããèªç±è£éã§ã«ã¹ã¿ãã€ãºã§ããŸãã ãããŠå®éãããã¯ããã³ãèŠæ±ããªããåãªããã€ã㪠ãã¡ã€ã«ã§ãã
ããã§ã¯ãè¡ããŸããã docs/installation ã»ã¯ã·ã§ã³ã«ç§»åããããããã³ãã³ããå®è¡ããŸãã
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bashãã®åŸãã°ã©ã ãªããžããªã远å ããŸãã
helm repo add stable https://kubernetes-charts.storage.googleapis.com/次ã«ãèšç»ã©ããã«ã€ã³ãã©ã¹ãã©ã¯ã㣠ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ããŸãããã
- ã€ã³ã°ã¬ã¹ã³ã³ãããŒã©ãŒã
- ããã¡ããŠã¹ã
- ã°ã©ãã¡ãã
- èšŒææžãããŒãžã£ãŒã
ã€ã³ã°ã¬ã¹ã³ã³ãããŒã©ãŒ
æåã®ã³ã³ããŒãã³ã㯠ã€ã³ã°ã¬ã¹ã³ã³ãããŒã©ãŒ - ã€ã³ã¹ããŒã«ã¯éåžžã«ç°¡åã§ãç®±ããåºããŠããã«äœ¿çšã§ããŸãã ãããè¡ãã«ã¯ã次ã®å Žæã«ã¢ã¯ã»ã¹ããŠãã ãã ããããã€ã³ã¹ããŒã« ã³ãã³ããå®è¡ããŸãã
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yamlãã ãããã®æç¹ã§ãã©ãºããªãŒãã«è² æ ããããå§ãããã£ã¹ã¯ IOPS ã«éããŸããã å®éã«ã¯ãIngress ã³ã³ãããŒã©ãŒãšãšãã«å€æ°ã®ãªãœãŒã¹ãã€ã³ã¹ããŒã«ãããAPI ã«å¯Ÿããå€ãã®ãªã¯ãšã¹ããè¡ãããããã«å¿ããŠå€§éã®ããŒã¿ã etcd ã«æžã蟌ãŸããŸãã äžè¬ã«ãã¯ã©ã¹ 10 ã®ã¡ã¢ãª ã«ãŒãã¯ããŸãçç£æ§ããªãããSD ã«ãŒãã§ã¯åºæ¬çã«ãã®ãããªè² è·ã«ã¯ååã§ã¯ãããŸããã ãã ããçŽ 5 ååŸã«ãã¹ãŠãèµ·åããŸããã
åå空éãäœæãããã³ã³ãããŒã©ãŒãšããã«å¿ èŠãªãã®ããã¹ãŠãã®äžã«è¡šç€ºãããŸããã
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 48sããã¡ããŠã¹
次㮠XNUMX ã€ã®ã³ã³ããŒãã³ãã¯ããã£ãŒã ãªããžããªãã Helm ãä»ããŠéåžžã«ç°¡åã«ã€ã³ã¹ããŒã«ã§ããŸãã
æã ã¯æ°ã¥ã ããã¡ããŠã¹ãåå空éãäœæããæ¬¡ã®ããã«èšå®ããŸãã
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"}ããã©ã«ãã§ã¯ãPrometheus 㯠Prometheus ããŒã¿èªäœãš AlertManager ããŒã¿çšã® 2 ã€ã®ãã£ã¹ã¯ã泚æããŸãã ã¯ã©ã¹ã¿ãŒå ã«ã¹ãã¬ãŒãž ã¯ã©ã¹ãäœæãããŠããªãããããã£ã¹ã¯ã¯æ³šæãããããããã¯èµ·åããŸããã ãã¢ã¡ã¿ã« Kubernetes ã€ã³ã¹ããŒã«ã®å Žåãé垞㯠Ceph rbd ã䜿çšããŸãããRaspberry Pi ã®å Žåãããã¯æããã«éå°ã§ãã
ãããã£ãŠããã¹ããã¹äžã«åçŽãªããŒã«ã« ã¹ãã¬ãŒãžãäœæããŸãããã prometheus-server ãš prometheus-alertmanager ã® PV (æ°žç¶ããªã¥ãŒã ) ãããã§ã¹ãã XNUMX ã€ã®ãã¡ã€ã«ã«çµåãããŠããŸã prometheus-pv.yaml в ã PVçšã®ãã£ã¬ã¯ããªã¯å¿
é ã§ã ããããã Prometheus ããã€ã³ããããããŒãã®ãã£ã¹ã¯äžã«äœæããŸããäŸã§ã¯æ¬¡ã®ããã«èšè¿°ãããŠããŸãã nodeAffinity ãã¹ãåã§ pi-worker ãããŠãã®äžã«ãã£ã¬ã¯ããªãäœæãããŸã /data/localstorage/prometheus-server О /data/localstorage/prometheus-alertmanager.
ãããã§ã¹ããããŠã³ããŒã (ã¯ããŒã³äœæ) ããKubernetes ã«è¿œå ããŸãã
kubectl create -f prometheus-pv.yamlãã®æ®µéã§åã㊠ARM ã¢ãŒããã¯ãã£ã®åé¡ã«ééããŸããã Prometheus ãã£ãŒãã«ããã©ã«ãã§ã€ã³ã¹ããŒã«ããã Kube-state-metrics ãèµ·åãæåŠããŸããã ãšã©ãŒãçºçããŸãã:
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"å®éãkube-state-metrics 㯠ARM çšã«ã³ã³ãã€ã«ãããŠããªã CoreOS ãããžã§ã¯ãã®ã€ã¡ãŒãžã䜿çšããŠããŸãã
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.7ã¡ãã£ãšã°ãŒã°ã«ã§æ€çŽ¢ããŠãããšãã°æ¬¡ã®ãããªãã®ãèŠã€ããå¿ èŠããããŸããã ã ããã䜿çšããã«ã¯ããªãªãŒã¹ãæŽæ°ããŠã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.6ãã¹ãŠãéå§ãããããšã確èªããŠã¿ãŸãããã
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 ãšèšŒææžãããŒãžã£ãŒ
ãã£ãŒããšããã·ã¥ããŒãã«ã€ããŠã¯ã ã°ã©ãã¡ã:
helm install grafana --namespace monitoring stable/grafana --set ingress.enabled=true --set ingress.hosts={"grafana.home.pi"}åºåã®æåŸã«ãã¢ã¯ã»ã¹ ãã¹ã¯ãŒããååŸããæ¹æ³ã衚瀺ãããŸãã
kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echoèšŒææžãæ³šæããã«ã¯ã€ã³ã¹ããŒã«ããŸã èšŒææžãããŒãžã£ãŒã ã€ã³ã¹ããŒã«ããã«ã¯ã以äžãåç §ããŠãã ããã ã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=trueå®¶åºã§äœ¿çšããèªå·±çœ²åèšŒææžã®å Žåã¯ãããã§ååã§ãã åããã®ãååŸããå¿ èŠãããå Žå æå·åãããã®å Žåã¯ãã¯ã©ã¹ã¿ãŒçºè¡è ãæ§æããå¿ èŠããããŸãã ããã«ã€ããŠã®è©³çްã¯ãèšäºã'ã
ç§èªèº«ã¯ããã®ãªãã·ã§ã³ã«èœã¡çããŸãã ãLE ã®ã¹ããŒãžã³ã° ãªãã·ã§ã³ã§ååã§ãããšå€æããŸããã ãã®äŸã§ã¯é»åã¡ãŒã«ã倿Žãããã¡ã€ã«ã«ä¿åããŠã¯ã©ã¹ã¿ãŒã«è¿œå ããŸã ():
kubectl create -f cert-manager-cluster-issuer.yamlããã§ãããšãã° Grafana ã®èšŒææžã泚æã§ããããã«ãªããŸããã ããã«ã¯ããã¡ã€ã³ãšå€éšããã¯ã©ã¹ã¿ãŒãžã®ã¢ã¯ã»ã¹ãå¿ èŠã§ãã ç§ã¯ãã¡ã€ã³ãæã£ãŠãããäœæããã€ã³ã°ã¬ã¹ ã³ã³ãããŒã©ãŒ ãµãŒãã¹ã«åŸã£ãŠããŒã ã«ãŒã¿ãŒã®ããŒã 80 ãš 443 ã転éããããšã§ãã©ãã£ãã¯ãæ§æããŸããã
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 23dãã®å ŽåãããŒã 80 㯠31303 ã«å€æãããããŒã 443 㯠30498 ã«å€æãããŸãã (ããŒãã¯ã©ã³ãã ã«çæããããããå®éã®ãã®ãšã¯ç°ãªããŸãã)
èšŒææžã®äŸã次ã«ç€ºããŸã ():
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-stagingãããã¯ã©ã¹ã¿ãŒã«è¿œå ããŸãã
kubectl create -f cert-manager-grafana-certificate.yamlãã®åŸãIngress ãªãœãŒã¹ã衚瀺ããããããéã㊠Let's Encrypt æ€èšŒãè¡ãããŸãã
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 æ€èšŒã«åæ ŒãããšããªãœãŒã¹ã certificate æºåã¯ã§ããŠããŸãããããŠäžèšã®ç§å¯ã§ grafana-tls - èšŒææžãšããŒã èšŒææžã®çºè¡è
ãããã«ç¢ºèªã§ããŸãã
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 X1ã°ã©ãã¡ãã«æ»ããŸãããã çæãããèšŒææžãšäžèŽããããã« TLS ã®èšå®ã倿Žããããšã§ãHelm ãªãªãŒã¹ãè¥å¹²ä¿®æ£ããå¿ èŠããããŸãã
ãããè¡ãã«ã¯ããã£ãŒããããŠã³ããŒãããããŒã«ã« ãã£ã¬ã¯ããªããç·šéããŠæŽæ°ããŸãã
helm pull --untar stable/grafana ãã¡ã€ã«å
ã§ç·šéãã grafana/values.yaml TLSãã©ã¡ãŒã¿:
tls:
- secretName: grafana-tls
hosts:
- grafana.home.pi ããã§ãã€ã³ã¹ããŒã«ããã Prometheus ãããã«æ¬¡ã®ããã«æ§æã§ããŸãã datasource:
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-server:80
access: proxy
isDefault: true次ã«ãããŒã«ã« ãã£ã¬ã¯ããªãã Grafana ãã£ãŒããæŽæ°ããŸãã
helm upgrade grafana --namespace monitoring ./grafana --set ingress.enabled=true --set ingress.hosts={"grafana.home.pi"} Ingress ã®å
容ã確èªãã grafana ããŒã 443 ã远å ããã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; includeSubDomainsGrafana ã®åäœããã¢ã³ã¹ãã¬ãŒã·ã§ã³ããã«ã¯ãããŠã³ããŒãããŠè¿œå ã§ããŸãã ã ããã¯æ¬¡ã®ããã«ãªããŸãã

ãŸããããŒã ãšã¯ã¹ããŒã¿ãŒçšã®ããã·ã¥ããŒãã远å ããããšããå§ãããŸããããã·ã¥ããŒãã«ã¯ããã©ãºããªãŒãã§äœãèµ·ãã£ãŠããã (CPU è² è·ãã¡ã¢ãªããããã¯ãŒã¯ããã£ã¹ã¯äœ¿çšéãªã©) ã詳现ã«è¡šç€ºãããŸãã
ãã®åŸãç§ã¯ããæããŸã ã¯ã©ã¹ã¿ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãåãå ¥ããŠå®è¡ããæºåãã§ããŠããŸãã
çµã¿ç«ãŠäžã®æ³šæ
ARM ã¢ãŒããã¯ãã£çšã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ãå°ãªããšã 4 ã€ã®ãªãã·ã§ã³ããããŸãã ãŸããARM ããã€ã¹äžã«æ§ç¯ã§ããŸãã ããããçŸåšã® 4 å°ã® Raspberry Pi ã®åŠåç¶æ³ãèŠãŠãããããçµã¿ç«ãŠã«èããããªãããšã«æ°ã¥ããŸããã ãããã£ãŠãç§ã¯æ°ãã Raspberry Pi XNUMX (ãã匷åã§ XNUMX GB ãã®ã¡ã¢ãªãæèŒ) ãæ³šæããŸããããããããŒã¹ã«æ§ç¯ããäºå®ã§ãã
XNUMX çªç®ã®ãªãã·ã§ã³ã¯ããã匷åãªãã·ã³äžã«ãã«ã ã¢ãŒããã¯ã㣠Docker ã€ã¡ãŒãžãæ§ç¯ããããšã§ãã ãã®ããã«ã¯ã ã ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«æžã¿èšèªã§ããå ŽåãARM ã®ã¯ãã¹ã³ã³ãã€ã«ãå¿ èŠã«ãªããŸãã ãã®ãã¹ã®ãã¹ãŠã®èšå®ã«ã€ããŠã¯èª¬æããŸããã ããã«ã¯å¥ã®èšäºãå¿ èŠã«ãªããŸãã ãã®ã¢ãããŒããå®è£ ãããšãããŠãããŒãµã«ãã€ã¡ãŒãžãå®çŸã§ããŸããARM ãã·ã³äžã§å®è¡ããã Docker èªäœããã¢ãŒããã¯ãã£ã«å¯Ÿå¿ããã€ã¡ãŒãžãèªåçã«ããŠã³ããŒãããŸãã
ãŸãšã
å®éšã¯ç§ã®æåŸ ããã¹ãŠäžåããŸããã[å°ãªããšã] å¿ èŠãªããŒã¹ãåãããããã©ãKubernetes 㯠ARM äžã§å¿«é©ã«åäœãããã®æ§æã§çãã埮åŠãªéãã¯ã»ãã® XNUMX ã€ã ãã§ããã
Raspberry Pi 3B+ èªäœã¯ CPU ã«è² è·ãããç¶ããŸãããSD ã«ãŒããæãããªããã«ããã¯ã«ãªã£ãŠããŸãã ååã¯ãäžéšã®ããŒãžã§ã³ã§ã¯ SSD ãæ¥ç¶ã§ãã USB ããèµ·åã§ãããšææ¡ããŸãããããããã°ãããããç¶æ³ã¯æ¹åãããã§ãããã
Grafana ãã€ã³ã¹ããŒã«ãããšãã® CPU è² è·ã®äŸã次ã«ç€ºããŸãã

å®éšãã詊ããŠã¿ããå Žåãç§ã®æèŠã§ã¯ããã©ãºããªãŒãäžã® Kubernetes ã¯ã©ã¹ã¿ãŒã¯ãåã Minikube ãããæäœæãã¯ããã«åªããŠããŸããããã¯ãã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ãããã倧人ã®ããã«ãåäœããããã§ãã
å°æ¥çã«ã¯ãRaspberry Pi äžã§å®å šã«å®è£ ããã CI/CD ãµã€ã¯ã«å šäœãã¯ã©ã¹ã¿ãŒã«è¿œå ãããšããã¢ã€ãã¢ããããŸãã ãŸãã誰ãã AWS Gravitons ã§ã® K8 ã®ã»ããã¢ããã®çµéšãå ±æããŠããããå¬ããã§ãã
PS ã¯ãããæ¬çªãã¯ç§ãæã£ãŠãããããè¿ããããããŸããã

PPS
ç§ãã¡ã®ããã°ããèªã¿ãã ãã:
- «'ã
åºæïŒ habr.com
