目的
– 簡易版KubernetesのMicrok8sをUbuntu上に構築する
– masterノードとworkerノードをそれぞれ構築する
環境
– k8s-master.local:192.168.9.1 ubuntu 22.04(master)
– k8s-worker1.local:192.168.9.2 ubuntu 20.04(worker)
– lb.local:192.168.9.3 (LB)
– microk8s:version 1.27.8
参考
– microk8sのInstall/Uninstall
– dashboard関連
https://qiita.com/ohtsuka-shota/items/adfc66087ab0bb058307
– Podのデプロイ
https://www.server-world.info/query?os=Ubuntu_22.04&p=microk8s&f=2
– nginxによるLoad Balancer
https://engineering.nifty.co.jp/blog/6253
Master/Worker共通手順
– Master/Workerノードで下記手順を実行
swap領域を使用しない設定
$ sudo swapoff -a
$ free -h
Swap: 0B 0B 0B
※ Swapが0Bであること
$ sudo vi /etc/fstab
#/swap.img none swap sw 0 0
※ コメントアウトする
Microk8sのインストール対象バージョン確認
$ snap info microk8s
1.27/stable: v1.27.8 2023-12-05 (6239) 177MB classic
Microk8s v1.27.8をインストール
– 1.27/stableをインストールする
$ sudo snap install microk8s --classic --channel=1.27/stable
– microk8sグループに現在のユーザを追加する
$ sudo usermod -a -G microk8s $USER
$ cat /etc/group | grep microk8s
microk8s:x:1003:admin
– ~/.kubeディレクトリを作成して、所有者を現在のユーザにする
$ mkdir ~/.kube
$ sudo chown -f -R $USER ~/.kube
$ ll ~/ | grep kube
drwxrwxr-x 3 admin admin 4096 Feb 1 14:12 .kube
– kubectlコマンドの実行で、microk8s.kubectlが実行されるようにエイリアスを設定する
$ sudo snap alias microk8s.kubectl kubectl
– 新しいグループID(GID)で新しいシェルを起動
$ newgrp microk8s
– microk8sが起動していること
$ microk8s.status
microk8s is running
Master手順
– Masterノードで下記手順を実行
– 必要なプラグインを有効にする
$ microk8s enable dns
$ microk8s enable dashboard
$ microk8s enable hostpath-storage
k8s Dashboardの起動
– dashboardプラグインを有効にしたことで、dashboardが起動する
– 外部からアクセスするには、プロキシを経由してClusterIPにforwardする必要がある
– enabledにdashboardが含まれていること
$ microk8s.status
– k8s dashboardを外部公開する
– 稼働中のk8s dashboardに対して、ポートフォワーディングを行う
$ microk8s dashboard-proxy
Checking if Dashboard is running.
Infer repository core for addon dashboard
Waiting for Dashboard to come up.
Trying to get token from microk8s-dashboard-token
Waiting for secret token (attempt 0)
Dashboard will be available at https://127.0.0.1:10443
Use the following token to login:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
※ ログイントークンが表示されるのでコピーしておく
– k8s dashboardにWebブラウザでログインする
– https://192.168.9.1:10443
– トークンにログイントークンをペーストして、サインインする
– どのノードでk8s dashboardのPodが動いているか確認する
– 下記の場合、Dashboard自体はクラスタ内のノード(192.168.9.2)で稼働しているが、microk8s dashboard-proxy コマンドを実行したノード(192.168.9.1)からポートフォワーディングでDashboardに接続している状態
$ kubectl get all -o wide --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system pod/kubernetes-dashboard-6768866d7-h97j9 1/1 Running 1 (4h12m ago) 4h13m 10.1.210.65 k8s-2.local
Podsのデプロイ
– test用のnginxを起動する
$ microk8s kubectl create deployment test-nginx --image=nginx
Podsに入る
– 下記コマンドでPodsが使ってるnamespaceが分かる
$ kubectl get service,pod -A
default pod/test-nginx-5ccf576fbd-jddf2 1/1 Running 0 17m
– 上記で確認したpodに入る
$ kubectl exec -it test-nginx-5ccf576fbd-jddf2 -n default bash
root@test-nginx-5ccf576fbd-jddf2:/# /etc/init.d/nginx status
nginx is running.
Podsの詳細
$ kubectl describe pod test-nginx-5ccf576fbd-jddf2 -n default
クラスタリング
masterでクラスタIDを発行
$ microk8s add-node
workerでクラスタ参加コマンド実行
$ microk8s join 192.168.9.1:25000/xxxxxxxxxxxx/zzzzzzzz --worker
エラー発生時「Connection failed. Invalid token (500).」
$ microk8s join 192.168.9.1:25000/xxxxxxxxxxxx/zzzzzzzz --worker
Contacting cluster at IP
Connection failed. Invalid token (500).
– /etc/hostsに対応を記載して解消しました
192.168.9.1 k8s-master
192.168.9.2 k8s-worker1
masterで追加されたか確認する
$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master.local Ready 24h v1.27.8
k8s-worker1.local Ready 5h26m v1.27.8
PodとServiceがどのNamespaceで動作しているかを確認
$ kubectl get service,pod -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.152.183.1 443/TCP 5d4h
kube-system service/kube-dns ClusterIP 10.152.183.10 53/UDP,53/TCP,9153/TCP 5d4h
kube-system service/metrics-server ClusterIP 10.152.183.81 443/TCP 5d4h
kube-system service/kubernetes-dashboard ClusterIP 10.152.183.232 443/TCP 5d4h
kube-system service/dashboard-metrics-scraper ClusterIP 10.152.183.197 8000/TCP 5d4h
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/calico-node-95c8q 1/1 Running 0 5d
kube-system pod/kubernetes-dashboard-6768866d7-h97j9 1/1 Running 1 (4d5h ago) 4d5h
kube-system pod/calico-node-b827t 1/1 Running 0 5d
kube-system pod/kubernetes-dashboard-fc86bcc89-9d79n 1/1 Terminating 0 5d4h
default pod/test-nginx-5ccf576fbd-jddf2 1/1 Terminating 0 5d3h
kube-system pod/hostpath-provisioner-58694c9f4b-zvnbj 1/1 Terminating 1 (5d ago) 5d4h
kube-system pod/dashboard-metrics-scraper-5cb4f4bb9c-l65p5 1/1 Terminating 0 5d4h
kube-system pod/metrics-server-7747f8d66b-5nnmh 1/1 Terminating 0 5d4h
kube-system pod/calico-kube-controllers-6c99c8747f-cs2ft 1/1 Terminating 0 5d4h
kube-system pod/coredns-7745f9f87f-ttbfs 1/1 Terminating 0 5d4h
kube-system pod/coredns-7745f9f87f-ghmr5 1/1 Running 0 4d5h
kube-system pod/dashboard-metrics-scraper-5cb4f4bb9c-9qwst 1/1 Running 0 4d5h
kube-system pod/hostpath-provisioner-58694c9f4b-nhnkw 1/1 Running 1 (3h15m ago) 4d5h
default pod/test-nginx-5ccf576fbd-7nthd 1/1 Running 1 (3h15m ago) 4d5h
kube-system pod/calico-node-qbmxf 0/1 CrashLoopBackOff 1198 (4m35s ago) 4d5h
kube-system pod/metrics-server-7747f8d66b-q8m6j 0/1 CrashLoopBackOff 1976 (2m41s ago) 4d5h
kube-system pod/calico-kube-controllers-6c99c8747f-4tj2g 0/1 CrashLoopBackOff 1569 (46s ago) 4d5h
nginxのクラスタを作成して、外部からアクセス可能にする
– それぞれdeploymentとserviceの定義を記載した定義ファイルを作成して、microk8sに適用する
イメージ
– Deploymentはラベルを使い、それをServiceのSelectorで指定することで、クライアントからのリクエストを転送するPod(nginxコンテナ)を判別している
masterで定義ファイルを作成する
– nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
ports:
- name: nginx
port: 80
selector:
app: nginx
type: LoadBalancer
externalIPs:
- 192.168.9.3
– microk8sに適用する
$ kubectl apply -f nginx.yaml
– 追加されたか確認する
$ kubectl get all -o wide --all-namespaces | grep -e NAMESPACE -e nginx
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
default pod/nginx-deployment-f7599d4c-x9g76 1/1 Running 0 5m33s 10.1.2.71 k8s-mster.local
default pod/nginx-deployment-f7599d4c-sb4p5 1/1 Running 0 5m33s 10.1.210.65 k8s-worker1.local
default pod/nginx-deployment-f7599d4c-4vsrw 1/1 Running 0 5m33s 10.1.210.66 k8s-worker1.local
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
default service/nginx LoadBalancer 10.152.183.176 192.168.9.3 80:30327/TCP 28m app=nginx
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE CONTAINERS IMAGES SELECTOR
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
default deployment.apps/nginx-deployment 3/3 3 3 5m33s nginx nginx:1.7.9 app=nginx
NAMESPACE NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
default replicaset.apps/nginx-deployment-f7599d4c 3 3 3 5m33s nginx nginx:1.7.9 app=nginx,pod-template-hash=f7599d4c
nginxでLoad Balancerを構築する
– 外部アクセス用のload balancer(LB)をnginxで構築する
– 作業対象:192.168.9.3(lb.local)
– nginx.confにログの設定
– /etc/nginx/nginx.conf
log_format upstreamlog '[$time_local] $remote_addr $host $upstream_addr $request’;
access_log /var/log/nginx/upstream.log upstreamlog;
# access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
– default無効化
– /etc/nginx/sites-available/default
$ pwd
/etc/nginx/sites-available/
$ mv default default_bk20240213
– proxy.conf作成
– /etc/nginx/sites-available/proxy.conf
– パラメータについて
– server:UpstreamのIP、ポート。必要に応じて振り分け先を追加削除
– server_name:LBのIP
– proxy_next_upstream_tries:upstreamへアクセスエラー時の試行回数、超えると次のupstreamを試す
– proxy_next_upstream_timeout:upstreamへアクセスエラー時のTO値
– proxy_connect_timeout:upstreamに接続するTO値
– proxy_send_timeout:upstreamへリクエスト送信TO値
– proxy_read_timeout:upstreamからのレスポンスTO値
upstream pool1 {
server k8s-master.local:30327 max_fails=100 fail_timeout=10s;
# server 振り分け先IP2 max_fails=100 fail_timeout=10s;
# server 振り分け先IP3 max_fails=100 fail_timeout=10s;
}
server {
listen 80;
server_name lb.local;
location / {
proxy_pass http://k8s-master.local:30327;
proxy_next_upstream error http_500 http_404 invalid_header http_502 http_503 http_504 http_403 http_429 timeout;
proxy_next_upstream_tries 3;
proxy_next_upstream_timeout 10s;
proxy_connect_timeout 3s;
proxy_send_timeout 5s;
proxy_read_timeout 10s;
}
}
– proxy.confのincludeについて
– sites-enabledを既にincludeしているため、nginx.confにproxy.confのincludeの記載は不要。sites-available配下に実ファイル作成して、sites-enabled配下にシンボリックリンクを貼る
– シンボリックリンク作成
$ sudo ln -s /etc/nginx/sites-available/proxy.conf /etc/nginx/sites-enabled/proxy.conf
– nginxのreload
$ /etc/init.d/nginx reload
動作確認
– クライアントからLBへアクセスしたときの、LBのupstream.logとPodのnginxログを確認する
– ブラウザアクセス
– http://192.168.9.3:80
– LBのupstream.log(192.168.9.3)
– /var/log/nginx/upstream.log
[13/Feb/2024:05:27:03 +0000] 192.168.9.100 192.168.9.3 192.168.9.1:30327 GET / HTTP/1.1
[13/Feb/2024:05:27:04 +0000] 192.168.9.100 192.168.9.3 192.168.9.1:30327 GET / HTTP/1.1
[13/Feb/2024:05:27:05 +0000] 192.168.9.100 192.168.9.3 192.168.9.1:30327 GET / HTTP/1.1
[13/Feb/2024:05:27:06 +0000] 192.168.9.100 192.168.9.3 192.168.9.1:30327 GET / HTTP/1.1
[13/Feb/2024:05:27:07 +0000] 192.168.9.100 192.168.9.3 192.168.9.1:30327 GET / HTTP/1.1
[13/Feb/2024:05:27:11 +0000] 192.168.9.100 192.168.9.3 192.168.9.1:30327 GET / HTTP/1.1
[13/Feb/2024:05:27:12 +0000] 192.168.9.100 192.168.9.3 192.168.9.1:30327 GET / HTTP/1.1
– Podのnginxログ(192.168.9.1)
/var/log/pods/default_nginx-deployment-xxxxxxxxxxxxxxxxxxx/nginx/0.log
2024-02-13T14:27:03.449651817+09:00 stdout F 192.168.9.1 - - [13/Feb/2024:05:27:03 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0" "-"
2024-02-13T14:27:05.397252898+09:00 stdout F 192.168.9.1 - - [13/Feb/2024:05:27:05 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0" "-"
2024-02-13T14:27:12.310050834+09:00 stdout F 192.168.9.1 - - [13/Feb/2024:05:27:12 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:121.0) Gecko/20100101 Firefox/121.0" "-"