メインコンテンツまでスキップ

「kubernetes」タグの記事が5件件あります

全てのタグを見る

· 約3分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

テスト環境

項目内容
ホスト環境Windows 11
仮想化環境Multipass

仮想環境の作成

項目
CPU2コア
メモリ8GB
ストレージ20GB
コマンドプロンプト
multipass launch -n eks-anywhere2 -c 2 -m 8G -d 20G
multipass shell eks-anywhere

環境構築

Dockerのインストール

ubuntu
curl -fsSL https://get.docker.com -o get-docker.sh && \
sh ./get-docker.sh && \
sudo usermod -aG docker $USER

一度ログアウトして再ログイン

ubuntu
exit
コマンドプロンプト
multipass shell eks-anywhere

kubectlのインストール

ubuntu
curl -LO "https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl" && \
chmod +x ./kubectl && \
sudo mv ./kubectl /usr/local/bin/kubectl

EKS Anywhere CLIツールのインストール

ubuntu
curl "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" \
--silent --location \
| tar xz -C /tmp && \
sudo mv /tmp/eksctl /usr/local/bin/
ubuntu
export EKSA_RELEASE="0.6.0" OS="$(uname -s | tr A-Z a-z)" RELEASE_NUMBER=2 && \
curl "https://anywhere-assets.eks.amazonaws.com/releases/eks-a/${RELEASE_NUMBER}/artifacts/eks-a/v${EKSA_RELEASE}/${OS}/eksctl-anywhere-v${EKSA_RELEASE}-${OS}-amd64.tar.gz" \
--silent --location \
| tar xz ./eksctl-anywhere && \
sudo mv ./eksctl-anywhere /usr/local/bin/

インストール確認

ubuntu
eksctl anywhere version

EKSクラスターの作成

configファイルの生成

ubuntu
CLUSTER_NAME=dev-cluster
eksctl anywhere generate clusterconfig $CLUSTER_NAME \
--provider docker > $CLUSTER_NAME.yaml

クラスターの作成

ubuntu
eksctl anywhere create cluster -f $CLUSTER_NAME.yaml

できた。超簡単。

ubuntu
export KUBECONFIG=${PWD}/${CLUSTER_NAME}/${CLUSTER_NAME}-eks-a-cluster.kubeconfig
kubectl get ns
ubuntu@eks-anywhere:~$ kubectl get ns
NAME STATUS AGE
capd-system Active 110s
capi-kubeadm-bootstrap-system Active 2m8s
capi-kubeadm-control-plane-system Active 114s
capi-system Active 2m16s
capi-webhook-system Active 2m19s
cert-manager Active 3m40s
default Active 4m33s
eksa-system Active 61s
etcdadm-bootstrap-provider-system Active 2m4s
etcdadm-controller-system Active 2m1s
kube-node-lease Active 4m35s
kube-public Active 4m35s
kube-system Active 4m35s
ubuntu@eks-anywhere:~$

テストアプリケーションのデプロイ

ubuntu
kubectl apply -f "https://anywhere.eks.amazonaws.com/manifests/hello-eks-a.yaml"
ubuntu@eks-anywhere:~$ kubectl get pods -l app=hello-eks-a
NAME READY STATUS RESTARTS AGE
hello-eks-a-9644dd8dc-f2czp 1/1 Running 0 27s
ubuntu@eks-anywhere:~$

ポートフォワーディング

ubuntu
kubectl port-forward deploy/hello-eks-a 8000:80

この状態でもう一つターミナルを立ち上げて(コマンドプロンプトをもう一つ立ち上げてmultipass shell eks-anywhere)、アクセス

ubuntu@eks-anywhere:~$ curl localhost:8000
Handling connection for 8000
⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢

Thank you for using

███████╗██╗ ██╗███████╗
██╔════╝██║ ██╔╝██╔════╝
█████╗ █████╔╝ ███████╗
██╔══╝ ██╔═██╗ ╚════██║
███████╗██║ ██╗███████║
╚══════╝╚═╝ ╚═╝╚══════╝

█████╗ ███╗ ██╗██╗ ██╗██╗ ██╗██╗ ██╗███████╗██████╗ ███████╗
██╔══██╗████╗ ██║╚██╗ ██╔╝██║ ██║██║ ██║██╔════╝██╔══██╗██╔════╝
███████║██╔██╗ ██║ ╚████╔╝ ██║ █╗ ██║███████║█████╗ ██████╔╝█████╗
██╔══██║██║╚██╗██║ ╚██╔╝ ██║███╗██║██╔══██║██╔══╝ ██╔══██╗██╔══╝
██║ ██║██║ ╚████║ ██║ ╚███╔███╔╝██║ ██║███████╗██║ ██║███████╗
╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═╝ ╚══╝╚══╝ ╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝╚══════╝

You have successfully deployed the hello-eks-a pod hello-eks-a-9644dd8dc-f2czp

For more information check out
https://anywhere.eks.amazonaws.com

⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢⬡⬢
ubuntu@eks-anywhere:~$

かっちょいい。

· 約5分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

Re:Invent 2020でAmazon EKS Distro (EKS-D)が発表されましたね。

公式ブログはこちら なぜか日本語の方にはEKS-Dの表記がないですね

Amazon EKS Distro: Amazon EKS で使用される Kubernetes ディストリビューション https://aws.amazon.com/jp/blogs/news/amazon-eks-distro-the-kubernetes-distribution-used-by-amazon-eks/

Introducing Amazon EKS Distro (EKS-D) https://aws.amazon.com/jp/blogs/opensource/introducing-amazon-eks-distro/

早速手持ちのRaspberry Pi 4でやってみました。

先にまとめ

環境

Raspberry Pi 4 (メモリ8GB) microSDカード 32GB ※EKS-Dのビルドを行う際に10GBほど必要です

OSはUbuntu 20.04(64bit)です。

前準備

sudo apt update && sudo apt upgrade -y
  • snapcraftのインストール
sudo snap install snapcraft --classic
  • /boot/firmware/cmdline.txtcgroup_enable=memory cgroup_memory=1を追加(1行目の末尾)
- net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc
+ net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc cgroup_enable=memory cgroup_memory=1
  • LXDの初期化

ビルド時にLXDを使ってみました。初期化します。ディスクスペースが5GBでは不足するので10GBにしました。それ以外はデフォルト設定です。

sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]:
Name of the new storage pool [default=default]:
Name of the storage backend to use (btrfs, dir, lvm, zfs, ceph) [default=zfs]:
Create a new ZFS pool? (yes/no) [default=yes]:
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]:
Size in GB of the new loop device (1GB minimum) [default=5GB]: 10GB ←ここだけ!
Would you like to connect to a MAAS server? (yes/no) [default=no]:
Would you like to create a new local network bridge? (yes/no) [default=yes]:
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
Would you like LXD to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:

EKS-Dのsnapパッケージのビルド

cd /tmp/
git clone https://github.com/canonical/eks-snap.git
cd eks-snap/
snapcraft --use-lxd

45分ほど待つと、eks_v1.18.9_arm64.snapが出来上がります 私のビルド成果物はこちらに格納しました。 https://github.com/moritalous/eks-snap/releases/tag/eks_v1.18.9_arm64

EKS-Dのインストール

sudo snap install eks_v1.18.9_arm64.snap --classic --dangerous

EKS-Dの起動

sudo eks.start

ステータス確認

ubuntu@ubuntu:~$ sudo eks status
eks is running
high-availability: no
datastore master nodes: 127.0.0.1:19001
datastore standby nodes: none
ubuntu@ubuntu:~$

ubuntuユーザーで動作するように設定

mkdir ~/.kube
cd ~/.kube
sudo eks.config > config
chmod 600 config
sudo usermod -a -G eks ubuntu
sudo chown -f -R ubuntu ~/.kube

一度ログアウトして再ログインすると、eks.kubectlコマンドが使えると思います。

色々確認

eksに含まれるコマンドの確認

ubuntu@ubuntu:~$ eks help
Available subcommands are:
add-node
config
ctr
dashboard-proxy
dbctl
join
kubectl
leave
refresh-certs
remove-node
reset
start
status
stop
inspect
ubuntu@ubuntu:~$

kube-systemで起動しているPodの確認

ubuntu@ubuntueks kubectl get pods -n kube-system 
NAME READY STATUS RESTARTS AGE
calico-node-7js69 1/1 Running 1 83m
metrics-server-f59887c58-5wxdp 1/1 Running 0 83m
calico-kube-controllers-555fc8cc5c-6v286 1/1 Running 0 83m
coredns-6788f546c9-vtbq5 1/1 Running 0 83m
hostpath-provisioner-c77bfc987-vnbzk 1/1 Running 0 83m
ubuntu@ubuntu:~$

Serviceの確認

ubuntu@ubuntu:~$ eks kubectl get svc --all-namespaces 
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.152.183.1 <none> 443/TCP 87m
kube-system kube-dns ClusterIP 10.152.183.10 <none> 53/UDP,53/TCP,9153/TCP 87m
kube-system metrics-server ClusterIP 10.152.183.182 <none> 443/TCP 87m
ubuntu@ubuntu:~$

イマイチどのあたりがEKSなのか、わかりませんでした。。。

· 約4分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

arm64向けのKibanaのコンテナイメージの作成に成功したので、Kubernetes上で構築してみました。 (コンテナイメージの作成方法とDocker Composeでの構築はこちらを参照)

Helmのインストール

wget https://get.helm.sh/helm-v3.3.1-linux-arm64.tar.gz
tar zxvf helm-v3.3.1-linux-arm64.tar.gz
cd linux-arm64/
sudo install helm /usr/local/bin

動作確認

 $ helm version
version.BuildInfo{Version:"v3.3.1", GitCommit:"249e5215cde0c3fa72e27eb7a30e8d55c9696144", GitTreeState:"clean", GoVersion:"go1.14.7"}
$

HelmのElasticリポジトリ設定

Elastic Stack Kubernetes Helm Charts https://github.com/elastic/helm-charts

helm repo add elastic https://helm.elastic.co
$ helm search repo elastic
NAME CHART VERSION APP VERSION DESCRIPTION
elastic/elasticsearch 7.9.1 7.9.1 Official Elastic helm chart for Elasticsearch
elastic/apm-server 7.9.1 7.9.1 Official Elastic helm chart for Elastic APM Server
elastic/filebeat 7.9.1 7.9.1 Official Elastic helm chart for Filebeat
elastic/kibana 7.9.1 7.9.1 Official Elastic helm chart for Kibana
elastic/logstash 7.9.1 7.9.1 Official Elastic helm chart for Logstash
elastic/metricbeat 7.9.1 7.9.1 Official Elastic helm chart for Metricbeat
$

Elasticsearch環境の構築

PersistentVolumeの作成

Helmのインストールの前にPersistentVolumeを作成します。

apiVersion: v1
kind: PersistentVolume
metadata:
name: es-pv-volume
labels:
type: local
app: elasticsearch-master
spec:
storageClassName: standard
capacity:
storage: 1Gi
persistentVolumeReclaimPolicy: Delete
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/elasticsearch"

/data/elasticsearchディレクトリを自動生成させると、rootユーザーが所有者となってPodの起動が失敗しましたので、先にホストOS側で準備しておきます

mkdir /data/elasticsearch
chown 1000:1000 /data/elasticsearch

Elasticsearch Helm Chartのインストール

minikube環境向けのサンプルがありますので、そちらを元にしました。imageTagreplicasだけ独自に足しました。

https://github.com/elastic/helm-charts/tree/master/elasticsearch/examples/minikube

---
imageTag: 7.9.1

replicas: 1

## Permit co-located instances for solitary minikube virtual machines.
antiAffinity: "soft"

## Shrink default JVM heap.
esJavaOpts: "-Xmx128m -Xms128m"

## Allocate smaller chunks of memory per pod.
resources:
requests:
cpu: "100m"
memory: "512M"
limits:
cpu: "1000m"
memory: "512M"

## Request smaller persistent volumes.
volumeClaimTemplate:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "standard"
resources:
requests:
storage: 100M
helm install elasticsearch elastic/elasticsearch --values ./values.yml

うまく行けば一式起動します

 $ kubectl get service,statefulset,pod,persistentvolumeclaim,persistentvolume --namespace=default -l app=elasticsearch-master
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/elasticsearch-master ClusterIP 10.103.52.98 <none> 9200/TCP,9300/TCP 6h38m
service/elasticsearch-master-headless ClusterIP None <none> 9200/TCP,9300/TCP 6h38m

NAME READY AGE
statefulset.apps/elasticsearch-master 1/1 6h38m

NAME READY STATUS RESTARTS AGE
pod/elasticsearch-master-0 1/1 Running 2 6h38m

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/elasticsearch-master-elasticsearch-master-0 Bound es-pv-volume 1Gi RWO standard 6h38m

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/es-pv-volume 1Gi RWO Delete Bound default/elasticsearch-master-elasticsearch-master-0 standard 6h43m
$

Kibana環境の構築

Kibana Helm Chartのインストール

Kibanaもvalues.ymlを用意します。

Kibanaはarm64向けコンテナイメージが提供されていないので、自前で作成しました。 (詳しい説明はこちら

---
image: "ghcr.io/moritalous/ghcr/kibana-arm64"
imageTag: 7.9.1

service:
type: NodePort
port: 5601
nodePort: 30601
helm install kibana elastic/kibana --values ./values.yml

起動確認

$ kubectl get service,deployment,pod --namespace=default -l app=kibana
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kibana-kibana NodePort 10.109.131.74 <none> 5601:30601/TCP 8h

NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/kibana-kibana 1/1 1 1 8h

NAME READY STATUS RESTARTS AGE
pod/kibana-kibana-56b7b6c95c-vj6sv 1/1 Running 0 7h37m
$

動作確認

http://raspberrypi.local:30601/

image.png

· 約6分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

前回構築したRaspberry Pi上のKubernetesで、WordPressを構築してみました。

ポイント

  • Dockerイメージはオフィシャルのものを使用
  • DBはMariaDB
  • MariaDBの/var/lib/mysqlとWordPressの/var/www/htmlはホスト(Raspberry Pi)上のディスクに永続化

構築

Yamlの構成はこんな感じです。

./
├── mariadb
│ ├── mariadb-persistentvolume.yaml
│ ├── mariadb-service.yaml
│ └── mariadb-statefulset.yaml
└── wordpress
├── wordpress-persistentvolume.yaml
├── wordpress-service.yaml
└── wordpress-statefulset.yaml

2 directories, 6 files

ディスク

Minikubeは以下のホスト上のディレクトで永続ができるように設定済みのようです。 https://minikube.sigs.k8s.io/docs/handbook/persistent_volumes/

  • /data
  • /var/lib/minikube
  • /var/lib/docker
  • /tmp/hostpath_pv
  • /tmp/hostpath-provisioner

/dataディレクトリを使用しようと思いますので、作成します。

mkdir -p /data

MariaDBの構築

使用したリソースは以下のものです。パスワードが平文で書かれていますので、Secretリソースを使うべきかと思います。

リソース説明
StatefulSetデータの永続化が必要なのでDeployment(ReplicaSet)ではなくStatefulSetを使いました
ServicePod間での通信を行うため、ClusterIP ServiceでMariaDBのポート3306を公開します
PersistentVolumeRaspberry Pi上の/data/mariadbをPersistentVolumeとして定義します。
mariadb-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mariadb-statefulset
spec:
selector:
matchLabels:
app: mariadb-app
serviceName: mariadb-service
replicas: 1
template:
metadata:
labels:
app: mariadb-app
spec:
containers:
- name: mariadb
image: mariadb:latest
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: somewordpress
- name: MYSQL_DATABASE
value: wordpress
- name: MYSQL_USER
value: wordpress
- name: MYSQL_PASSWORD
value: wordpress
volumeMounts:
- name: mariadb-pvc
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mariadb-pvc
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: manual
selector:
matchLabels:
app: mariadb
resources:
requests:
storage: 1Gi
mariadb-service.yaml
apiVersion: v1
kind: Service
metadata:
name: mariadb-service
spec:
type: ClusterIP
selector:
app: mariadb-app
ports:
- port: 3306
mariadb-persistentvolume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mariadb-pv-volume
labels:
type: local
app: mariadb
spec:
storageClassName: manual
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/mariadb"

WordPressの構築

WordPressもMariaDBとほぼ同じです。違うのはこれぐらいです。

  • Serviceの種別がNodePortで、外部に公開
  • DB接続先をMariaDBのClusterIPで指定
リソース説明
StatefulSetMariaDB同様、データの永続化をするため、StatefulSetを使いました
Service外部から接続するため、NodePortを使用してコンテナ内の80番ポートを30080番として外部公開します。
PersistentVolumeRaspberry Pi上の/data/wordpressをPersistentVolumeとして定義します。
wordpress-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: wordpress-statefulset
spec:
selector:
matchLabels:
app: wordpress-app
serviceName: wordpress-service
replicas: 1
template:
metadata:
labels:
app: wordpress-app
spec:
containers:
- name: wordpress
image: wordpress:latest
ports:
- containerPort: 80
env:
- name: WORDPRESS_DB_HOST
value: mariadb-service:3306
- name: WORDPRESS_DB_USER
value: wordpress
- name: WORDPRESS_DB_PASSWORD
value: wordpress
volumeMounts:
- name: wordpress-pvc
mountPath: /var/www/html
volumeClaimTemplates:
- metadata:
name: wordpress-pvc
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: manual
selector:
matchLabels:
app: wordpress
resources:
requests:
storage: 1Gi
wordpress-service.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-nodepod
spec:
type: NodePort
selector:
app: wordpress-app
ports:
- port: 80
nodePort: 30080
wordpress-persistentvolume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: wordpress-pv-volume
labels:
type: local
app: wordpress
spec:
storageClassName: manual
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data/wordpress"

起動

サブディレクトリ含めて全Yamlを適用します

$ kubectl apply -f ./ -R
persistentvolume/mariadb-pv-volume created
service/mariadb-service created
statefulset.apps/mariadb-statefulset created
persistentvolume/wordpress-pv-volume created
service/wordpress-nodepod created
statefulset.apps/wordpress-statefulset created
$

起動したか確認

$ kubectl get svc,po,pv,pvc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 24h
service/mariadb-service ClusterIP 10.105.29.150 <none> 3306/TCP 36s
service/wordpress-nodepod NodePort 10.100.194.70 <none> 80:30080/TCP 36s

NAME READY STATUS RESTARTS AGE
pod/mariadb-statefulset-0 1/1 Running 0 36s
pod/wordpress-statefulset-0 1/1 Running 0 36s

NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/mariadb-pv-volume 1Gi RWO Retain Bound default/mariadb-pvc-mariadb-statefulset-0 manual 36s
persistentvolume/wordpress-pv-volume 1Gi RWO Retain Bound default/wordpress-pvc-wordpress-statefulset-0 manual 36s

NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/mariadb-pvc-mariadb-statefulset-0 Bound mariadb-pv-volume 1Gi RWO manual 36s
persistentvolumeclaim/wordpress-pvc-wordpress-statefulset-0 Bound wordpress-pv-volume 1Gi RWO manual 36s
$

Raspberry Pi上の/dataディレクトリ配下にファイルが作成されていることを確認できます。

$ ls /data/mariadb/
aria_log.00000001 ib_buffer_pool ib_logfile0 multi-master.info performance_schema
aria_log_control ibdata1 ibtmp1 mysql wordpress
$ ls /data/wordpress/
index.php wp-activate.php wp-comments-post.php wp-content wp-links-opml.php wp-mail.php wp-trackback.php
license.txt wp-admin wp-config.php wp-cron.php wp-load.php wp-settings.php xmlrpc.php
readme.html wp-blog-header.php wp-config-sample.php wp-includes wp-login.php wp-signup.php
$

ブラウザでも確認

Raspberry Piの外部からhttp://raspberrypi.local:30080/へアクセス

raspberrypi.local_30080_wp-admin_install.php(iPad).png

無事疎通ができました。 1件画像つきで投稿してみました。

raspberrypi.local_30080__p=5(iPad).png

この状態で、MariaDBのPodを強制的に削除してみます。

$ kubectl delete po mariadb-statefulset-0 
pod "mariadb-statefulset-0" deleted
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mariadb-statefulset-0 0/1 ContainerCreating 0 3s ←自動的にPodが再作成される
wordpress-statefulset-0 1/1 Running 0 9m29s
$ kubectl get po
NAME READY STATUS RESTARTS AGE
mariadb-statefulset-0 1/1 Running 0 9s
wordpress-statefulset-0 1/1 Running 0 9m35s
pi@raspberrypi:~/k8s/minikube-wordpress $

データは/data/mariadbで永続化されているのでMariaDBのPodが再作成された後は、問題なく画面表示ができます。同様に、WordPressのPodを削除しても、問題ありませんでした。

参考

https://minikube.sigs.k8s.io/docs/handbook/persistent_volumes/ https://kubernetes.io/docs/tasks/configure-pod-container/configure-persistent-volume-storage/ https://docs.docker.jp/compose/wordpress.html

· 約4分
moritalous
お知らせ

過去にQiitaに投稿した内容のアーカイブです。

何番煎じかわかりませんが、Raspberry PiにKubernetes環境を構築したので、記録を残します。 複数台でクラスターを組むこともなく、1台構成です。

環境

Raspberry Pi 4 (8GBメモリ) Raspberry Pi OS 64bit https://www.raspberrypi.org/forums/viewtopic.php?f=117&t=275370

手順

Swapの無効化

sudo apt-get purge -y --auto-remove dphys-swapfile
sudo rm -fr /var/swap

cgroupの有効化

/boot/cmdline.txtの末尾にcgroup_enable=memory cgroup_memory=1を追加。(改行はせず、1行目の末尾に追加)

/boot/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=8226b72e-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles cgroup_enable=memory cgroup_memory=1

設定後、再起動しましょう

Dockerのインストール

https://docs.docker.com/engine/install/debian/

sudo apt remove docker docker-engine docker.io containerd runc
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -
sudo add-apt-repository \
"deb [arch=arm64] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y

kubectlのインストール

https://kubernetes.io/ja/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

Minikubeにkubectlコマンドが内蔵されているようでしたが、別でインストールしたほうが使いやすい気がしましたのでインストールしました。 kubeadmkubeletはminikubeがインストールしているような気がしましたので、インストールしません。

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 update
sudo apt install -y kubectl

Minikubeのインストール

https://kubernetes.io/ja/docs/tasks/tools/install-minikube/

Raspberry PiはARM64アーキテクチャのため、ダウンロードする実行ファイルはminikube-linux-amd64ではなくminikube-linux-arm64です。

sudo apt install conntrack -y

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-arm64
chmod +x minikube
sudo mkdir -p /usr/local/bin/
sudo install minikube /usr/local/bin/

kubernetesクラスタの作成

vm-driverはnoneとします

sudo minikube start --vm-driver=none

aliasと入力補完の設定

minikubekubectlも毎回sudoが必要で、毎回入力するのは面倒なのでaliasを作成します。 また、入力補完のcompletionも設定します。

~/.bashrc
alias minikube='sudo minikube'
source <(minikube completion bash)
alias kubectl='sudo kubectl'
source <(kubectl completion bash)

動作確認

動作確認としてNginxコンテナを起動してみます。

nginx.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-nodeport
spec:
type: NodePort
selector:
app: nginx-app
ports:
- protocol: "TCP"
port: 80
nodePort: 30080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx-app
template:
metadata:
labels:
app: nginx-app
spec:
containers:
- name: nginx-container
image: nginx:latest
kubectl apply -f nginx.yaml

Raspberry Piからはcurl http://localhost:30080で応答がありますし、外部のPCからはhttp://raspberrypi.local:30080/で応答が受け取れました。

感想

  • ARM64対応のイメージが有るものと無いものがあるので注意
  • kubeadmでの構築を試みたのですが、なぜかPOD間通信ができなかったので、Minikubeにしました
  • さてどう活用しようかな