Kubernetes Server

【Kubernetes】UbuntuでMicrok8sを構築する手順

2024年2月6日



目的

– 簡易版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

Install & Uninstall Microk8s (Ubuntu 22.04.2 LTS)

– 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" "-"

CATEGORIES & TAGS

Kubernetes, Server,

Author:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

カテゴリー

むるし

フリーランスのインフラ系エンジニア。
備忘録で色々書いていきます。
お問い合わせは↓
mo-gyu@murci.net
LPIC303 Security
%d人のブロガーが「いいね」をつけました。