æè¿ã§ã¯ãæåãªäŒç€Ÿãèªç€Ÿã®ã©ãããããã©ã€ã³ãARMã¢ãŒããã¯ãã£ã«ç§»è¡ãããšçºè¡šããŸããããã®ãã¥ãŒã¹ãèããŠãç§ã¯æãåºããŸãããAWSã§EC2ã®äŸ¡æ ŒãããäžåºŠèª¿ã¹ãŠãããšãéåžžã«ããããäŸ¡æ Œã®Gravitonsã«æ°ã¥ããŸããããã¡ããããã£ããã¯ãããARMã ãšããããšã§ããããã®ãšããARMãããªãæ·±å»ã§ãããšã¯æããããŸããã§ãã...
ç§ã«ãšã£ãŠããã®ã¢ãŒããã¯ãã£ã¯åžžã«å€ãã®ã¢ãã€ã«ããã®ä»ã®IoTã®ãã®ã§ããã ARMã®ãå®éã®ããµãŒããŒã¯ããªãããã®åœ¢ã§çãããããæå³ã§ã¯ã€ã«ãã§ã...ããããæ°ããèããé ã«æµ®ããã ã®ã§ããã鱿«ã仿¥ARMã§äœãèµ·åã§ãããã確èªããããšã«ããŸããããããŠãã®ããã«ãç§ã¯èŠªæãªããã®ãã€ãŸãKubernetesã¯ã©ã¹ã¿ãŒããå§ããããšã«ããŸããããããŠãããã€ãã®æ¡ä»¶ä»ãã®ãã¯ã©ã¹ã¿ãŒãã ãã§ãªãããã¹ãŠããå€§äººã®æ¹æ³ã§ãè¡ããããããæ¬çªç°å¢ã§èŠæ £ããŠãããã®ãšå¯èœãªéãåãã«ãªããŸãã
ç§ã®èãã«ããã°ãã¯ã©ã¹ã¿ãŒã¯ã€ã³ã¿ãŒãããããã¢ã¯ã»ã¹å¯èœã§ãããããã€ãã®Webã¢ããªã±ãŒã·ã§ã³ããã®äžã§å®è¡ãããå°ãªããšãç£èŠãè¡ãããŠããå¿ èŠããããŸãããã®ã¢ã€ãã¢ãå®è£ ããã«ã¯ããã¢ïŒãŸãã¯ãã以äžïŒã®RaspberryPiã¢ãã«3B以éãå¿ èŠã§ããAWSãå®éšã®ãã©ãããã©ãŒã ã«ãªãå¯èœæ§ããããŸãããç§ã«ãšã£ãŠè峿·±ãã®ã¯ãã©ãºããªãŒãã§ããïŒãŸã ã¢ã€ãã«ç¶æ ã§ããïŒãããã§ãIngressãPrometheusãGrafanaãæèŒããKubernetesã¯ã©ã¹ã¿ãŒããããã€ããŸãã
ãã©ãºããªãŒãã®æºå
OSãšSSHã®ã€ã³ã¹ããŒã«
ã€ã³ã¹ããŒã«ããOSã®éžæã«ã€ããŠã¯ãããŸãæ°ã«ããŸããã§ãããå ¬åŒWebãµã€ãããææ°ã®Raspberry Pi OSLiteãå ¥æããã ãã§ããã€ã³ã¹ããŒã«ããã¥ã¡ã³ããããã«ãããããããã®ãã¹ãŠã®ã¹ããããå°æ¥ã®ã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ããŒãã§å®è¡ããå¿ èŠããããŸããæ¬¡ã«ãæ¬¡ã®æäœãå®è¡ããå¿ èŠããããŸãïŒããããã¹ãŠã®ããŒãã§ïŒã
ã¢ãã¿ãŒãšããŒããŒããæ¥ç¶ããåŸãæåã«ãããã¯ãŒã¯ãš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ã®èŠä»¶ã§ãããã®ãããã¯ã®è©³çްã«èå³ãããå Žåã¯ãåé¡çªå·53533ãåç
§ããŠãã ããïŒã
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-persistentãipv4ã®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.ioã®å ¬åŒããã¥ã¡ã³ãã䜿çšããŸãïŒã³ã¡ã³ããšçç¥åœ¢ãå°ã远å ãããŠããŸãïŒã
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ã®ãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããå¿ èŠããããŸããç§ã¯portmapãã©ã°ã€ã³ãéžæããŸãããããã¯ç§ã«ãšã£ãŠãªãã¿ãããæç¢ºã§ãïŒå®å šãªãªã¹ãã«ã€ããŠã¯ããã¥ã¡ã³ããåç §ããŠãã ããïŒã
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/ ./portmap
Kubernetesã®æ§æ
ã³ã³ãããŒã«ãã¬ãŒã³ããŒã
ã¯ã©ã¹ã¿ãŒèªäœã®ã»ããã¢ããã¯ããªãç°¡åã§ãããŸãããã®ããã»ã¹ãé«éåãã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
æå ã«ããã©ãºããªãŒãã€ã¯2ã€ãããªãã£ãã®ã§ããã®ãã¡ã®1ã€ãã³ã³ãããŒã«ãã¬ãŒã³ã®äžã ãã«é 眮ããããããŸããã§ãããããã§ã次ã®ã³ãã³ããå®è¡ããŠãèªåã€ã³ã¹ããŒã«ãããæ±æãpi-controlããŒãããåé€ããŸããã
root@pi-control:~# kubectl edit node pi-control
...ãããŠè¡ãåé€ããŸãïŒ
- effect: NoSchedule
key: node-role.kubernetes.io/master
å¿ èŠæå°éã§ã¯ã©ã¹ã¿ãŒãåãã
ãŸããHelmãå¿ èŠã§ãããã¡ãããããããªããŠããã¹ãŠãè¡ãããšãã§ããŸãããHelmã䜿çšãããšãæåéããã¡ã€ã«ãç·šéããã«ãå¿ èŠã«å¿ããŠããã€ãã®ã³ã³ããŒãã³ããæ§æã§ããŸãããããŠå®éãããã¯ããã³ãèŠæ±ããªããåãªããã€ããªãã¡ã€ã«ã§ãã
ãããã£ãŠãdocs / installã»ã¯ã·ã§ã³ã®helm.shã«ç§»åããããããã³ãã³ããå®è¡ããŸãã
curl -s https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
ãã®åŸããã£ãŒããªããžããªã远å ããŸãã
helm repo add stable https://kubernetes-charts.storage.googleapis.com/
ããã§ã¯ã次ã®ã¢ã€ãã¢ã«åŸã£ãŠã€ã³ãã©ã¹ãã©ã¯ãã£ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ããŸãããã
- å ¥åã³ã³ãããŒã©ãŒ;
- ããã¡ããŠã¹;
- ã°ã©ãã¡ã;
- cert-managerã
å ¥åã³ã³ãããŒã©ãŒ
æåã®ã³ã³ããŒãã³ãã§ããIngressã³ã³ãããŒã©ãŒã¯ãã€ã³ã¹ããŒã«ãéåžžã«ç°¡åã§ãç®±ããåºããŠããã«äœ¿çšã§ããŸãããããè¡ãã«ã¯ããµã€ãã®ãã¢ã¡ã¿ã«ã»ã¯ã·ã§ã³ã«ç§»åããããããã€ã³ã¹ããŒã«ã³ãã³ããå®è¡ããŸãã
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
ããã¡ããŠã¹
次ã®2ã€ã®ã³ã³ããŒãã³ãã¯ããã£ãŒããªããžããªããHelmãä»ããŠã€ã³ã¹ããŒã«ããã®ã¯ããªãç°¡åã§ããPrometheus
ãèŠã€ããååãäœæããŠã€ã³ã¹ããŒã«ããŸãã
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ïŒæ°žç¶ããªã¥ãŒã ïŒãããã§ã¹ãã¯ãèšäºã®äŸãå«ãGitãªããžããªå ã®ãã¡ã€ã«
prometheus-pv.yamlã«ããŒãžãããŸããPVã®ããã®ãã£ã¬ã¯ããªãããªããã°ãªããªãã§äœæãããäºåã®äŸã§ã¯ïŒç§ãã¡ã¯ããã¡ããŠã¹ããã€ã³ãããå
ã®ããŒãã®ãã£ã¹ã¯äžã«ããã¹ãåããããŠæå®ãããã£ã¬ã¯ããªãšããããã®äžã«äœæãããŸãããnodeAffinitypi-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 4m52s
ã°ã©ãã¡ããšèšŒææžãããŒãžã£ãŒ
ãã£ãŒããšããã·ã¥ããŒãã®å Žåã¯ãGrafanaãã€ã³ã¹ããŒã«ããŸãã
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
èšŒææžãæ³šæããã«ã¯ãcert-managerãã€ã³ã¹ããŒã«ããŸãããããã€ã³ã¹ããŒã«ããã«ã¯ã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
å®¶åºã§äœ¿çšããèªå·±çœ²åèšŒææžã®å Žåãããã§ååã§ããåãLet'sEncryptãåãåãå¿ èŠãããå Žåã¯ãå¥ã®ã¯ã©ã¹ã¿ãŒçºè¡è ãæ§æããå¿ èŠããããŸãã詳现ã«ã€ããŠã¯ãèšäºãKubernetesã®cert-managerã䜿çšããŠLet'sEncryptããã®SSLèšŒææžããåç §ããŠãã ããã
ç§èªèº«ãããã¥ã¡ã³ãã®äŸã®ããªã¢ã³ããæ±ºå®ããã¹ããŒãžã³ã°LEããªã¢ã³ãã§ååã§ãããšå€æããŸãããäŸã®é»åã¡ãŒã«ã倿Žãããã¡ã€ã«ã«ä¿åããŠãã¯ã©ã¹ã¿ãŒïŒcert-manager-cluster-issuer.yamlïŒã«è¿œå ããŸãã
kubectl create -f cert-manager-cluster-issuer.yaml
ããã§ãããšãã°Grafanaã®èšŒææžã泚æã§ããŸããããã«ã¯ããã¡ã€ã³ãšã¯ã©ã¹ã¿ãŒãžã®å€éšã¢ã¯ã»ã¹ãå¿ èŠã«ãªããŸãããã¡ã€ã³ããããäœæãããingress-controllerãµãŒãã¹ã«åŸã£ãŠãããŒã ã«ãŒã¿ãŒã®ããŒã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ã«å€æãããŸãïŒããŒãã¯ã©ã³ãã ã«çæããããããç°ãªãããŒãããããŸãïŒã
èšŒææžã®äŸïŒcert-manager-grafana-certificate.yamlïŒã次ã«ç€ºããŸãã
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'sEncryptã®æ€èšŒãè¡ãããŸãã
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"}
grafanaããŒã443ã
Ingressã«è¿œå ãããŠããããšãããã³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; includeSubDomains
Grafanaã®åäœã瀺ãããã«ãkube -state-metricsã®ããã·ã¥ããŒããããŠã³ããŒãããŠè¿œå ã§ããŸããå€èŠ³ã¯æ¬¡ã®ãšãã
ã§ããããŒããšã¯ã¹ããŒã¿ã®ããã·ã¥ããŒãã远å ããããšããå§ãããŸããããã·ã¥ããŒãã«ã¯ããã©ãºããªãŒãã«äœãèµ·ãããïŒCPUè² è·ãã¡ã¢ãªããããã¯ãŒã¯ããã£ã¹ã¯äœ¿çšéãªã©ïŒã詳现ã«è¡šç€ºãããŸãã
ãã®åŸãã¯ã©ã¹ã¿ãŒã¯ã¢ããªã±ãŒã·ã§ã³ãåä¿¡ããŠââå®è¡ããæºåãã§ããŠãããšæããŸãã
çµã¿ç«ãŠã¡ã¢
ARMã¢ãŒããã¯ãã£ã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ãå°ãªããšã2ã€ã®ãªãã·ã§ã³ããããŸãããŸããARMããã€ã¹äžã«æ§ç¯ã§ããŸãããããã2ã€ã®ã©ãºããªãŒãã€ã®çŸåšã®åŠåãèŠãŠãç§ã¯ããããã¢ã»ã³ããªãçãæ®ãããšãã§ããªãããšã«æ°ã¥ããŸããããã®ãããæ°ããRaspberry Pi 4ãæ³šæããŸããïŒãã匷åã§ã4 GBã®ã¡ã¢ãªãæèŒãããŠããŸãïŒ-ãã®äžã«æ§ç¯ããäºå®ã§ãã
2çªç®ã®ãªãã·ã§ã³ã¯ããã匷åãªãã·ã³ã§ãã«ãã¢ãŒããã¯ãã£ã®Dockerã€ã¡ãŒãžãæ§ç¯ããããšã§ãããã®ããã®dockerbuildxæ¡åŒµæ©èœããããŸããã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«æžã¿èšèªã§ããå Žåã¯ãARMã®çžäºã³ã³ãã€ã«ãå¿ èŠã§ãããã®ãã¹ã®ãã¹ãŠã®èšå®ã«ã€ããŠã¯èª¬æããŸãããããã¯å¥ã®èšäºã«ã€ãªãããŸãããã®ã¢ãããŒããå®è£ ãããšãããŠãããŒãµã«ãã€ã¡ãŒãžãå®çŸã§ããŸããARMãã·ã³ã§å®è¡ãããŠããDockerã¯ãã¢ãŒããã¯ãã£ã«å¯Ÿå¿ããã€ã¡ãŒãžãèªåçã«ããŒãããŸãã
çµè«
å®è¡ãããå®éšã¯ç§ã®æåŸ ããã¹ãŠäžåããŸããã[å°ãªããšã]å¿ èŠãªããŒã¹ãåãããããã©ãKubernetesã¯ARMã§å¿«é©ã§ããããã®æ§æã§ã¯ãããã2ã3ã®ãã¥ã¢ã³ã¹ãçããŸããã
Raspberry Pi 3B +èªäœã¯CPUãããžãŒç¶æ ã«ä¿ã¡ãŸãããSDã«ãŒãã¯æããã«ããã«ããã¯ã§ããååã¯ãäžéšã®ããŒãžã§ã³ã§ã¯SSDãæ¥ç¶ã§ããUSBããèµ·åã§ããããšãææ¡ããŸãããããããã°ãç¶æ³ã¯ããããè¯ããªãã§ãããã
Grafanaãã€ã³ã¹ããŒã«ãããšãã®CPUè² è·ã®äŸã次ã«ç€ºããŸã
ãå®éšãšã詊ããããã«ãç§ã®æèŠã§ã¯ããã©ãºããªãŒãäžã®Kubernetesã¯ã©ã¹ã¿ãŒã¯ãã¯ã©ã¹ã¿ãŒã®ãã¹ãŠã®ã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ãããŠæ©èœãããããåãMinikubeãããã¯ããã«åªããæäœæèŠãäŒããŸãã ãå€§äººã®æ¹æ³ã§ãã
å°æ¥çã«ã¯ãCI / CDãµã€ã¯ã«å šäœãã¯ã©ã¹ã¿ãŒã«è¿œå ããå®å šã«RaspberryPiã«å®è£ ãããšããã¢ã€ãã¢ããããŸãããŸããAWSGravitonsã§K8ãã»ããã¢ããããçµéšã誰ããå ±æããŠãããã°å¬ããã§ãã
PSã¯ãããçç£ãã¯ç§ãæã£ãŠãããããè¿ããããããŸããïŒ
PPS
ç§ãã¡ã®ããã°ãèªãã§ãã ããïŒ