【kubernetes/k0s】VirtualBoxとCentOS7とk0s(v0.11.0)マルチクラスターとRancher(v2.5.6)とIngress controller環境の構築
- 本記事で行うこと
- モチベーション
- 環境
- macbook proを閉じてもスリープしない設定
- k0sとrancherの構成図
- CentOS7のインストールと設定
- Dockerのインストール&起動設定
- CentOS7のコピー&設定(nmcli ip固定)
- Rancher2.5.6のインストール(Docker base)
- k0s(v0.11.0)インストール
- kubectlのインストール(オプション)
- Rancherからk0sを操作
- 後書き
本記事で行うこと
- macbook proを閉じてもスリープしない設定
- VirtualBoxの設定
- CentOS7のインストールと設定
- Dockerのインストール
- CentOS7のコピー&設定(nmcli ip固定)
- Rancher2.5.6のインストール(Docker base)
- k0s cluster(Kubernetes)構築
- Rancherからk0sを操作
- nginx podとtraefik Ingress controllerの動作確認
モチベーション
- M1 macbook airを買ってmacbook proが一台余ったので、汎用的なkubernetes cluster serverとして利用したい。
- 社内でkubernetesのスキトラコンテンツ作成ために検証用kubernetes cluster serverが欲しかった。
- macbook proはそこまでスペックが高くないので軽量なk8s環境としてk0sを使って見ようと思った。
環境
- 余ったmacbook pro
$ sw_vers ProductName: macOS ProductVersion: 11.2.2 BuildVersion: 20D80
- macbook proのスペック
- m1 macbook air
$ sw_vers ProductName: macOS ProductVersion: 11.2.1 BuildVersion: 20D74
macbook proを閉じてもスリープしない設定
sudo pmset -a disablesleep 1
※戻す場合は0で更新する。
k0sとrancherの構成図
- 今回は自宅のNWで以下のような構成とします。
CentOS7のインストールと設定
- 以下の公式ページからCentOS7.9のisoファイルをダウンロード。
https://www.centos.org/download/ - インストール画面で今回はhaku-maiという管理者ユーザを作っておきました。
- NWは自宅のNWからDHCPでIPが振られるようにブリッジアダプターにしています。
macからssh接続するまでの設定
- 一時的にSELinux無効
$ sudo setenforce 0
- fiewwalld停止
$ sudo systemctl stop firewalld
- dhcpで振られたip確認
$ ip a
$ ssh haku-mai@ip
- ロケールの修正
$ localectl set-locale LC_CTYPE=ja_JP.utf8
- SELinux無効
$ sudo sed -i -e "s/^SELINUX=enforcing$/SELINUX=disabled/g" /etc/selinux/config
- fiewwalld自動起動OFF
$ sudo systemctl disable firewalld
Dockerのインストール&起動設定
以下スクリプトでインストールする。
Install Docker Engine on CentOS | Docker Documentation
$ cd /tmp $ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh get-docker.sh $ sudo usermod -aG docker haku-mai $ docker -v Docker version 20.10.5, build 55c4c88 $ systemctl status docker $ systemctl enable docker
- shutdown
$ sudo shutdown -h now
- 以上でテンプレート完了。
CentOS7のコピー&設定(nmcli ip固定)
以下のようにコピーする。
dhcpで振られたip確認
$ ip a
- そのipでそれぞれ固定化
$ nmcli d DEVICE TYPE STATE CONNECTION enp0s3 ethernet connected enp0s3 docker0 bridge unmanaged -- lo loopback unmanaged -- $ nmcli d show enp0s3<br> $ sudo nmcli con modify enp0s3 ipv4.method manual ipv4.addresses {サーバーに設定したいip} $ sudo nmcli con modify enp0s3 ipv4.gateway {gatway ip} $ sudo nmcli con modify enp0s3 ipv4.dns "{dns ip} {secondary dns ip} {gatway ip}" $ sudo nmcli con modify enp0s3 ipv4.routes "自宅のNWセグメント 自宅のルータのIP"
- ホスト名変更
$ sudo hostnamectl set-hostname rancher.haku-mai
$ sudo hostnamectl set-hostname k8s-controller.haku-mai
$ sudo hostnamectl set-hostname k8s-worker1.haku-mai
$ sudo hostnamectl set-hostname k8s-worker2.haku-mai
Rancher2.5.6のインストール(Docker base)
2021/3/5時点で最新のv2.5.6で実行。
[haku-mai@rancher ~]$ docker run -d --restart=unless-stopped \ -p 80:80 -p 443:443 \ --privileged \ rancher/rancher:v2.5.6
[haku-mai@rancher ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 88e931ff0047 rancher/rancher:v2.5.6 "entrypoint.sh" 35 seconds ago Up 33 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp peaceful_mcclintock
docker logs -f でログを見つつ気長に待つ。
以下のように起動して、adminのパスワードとURLの設定を行う。
k0s(v0.11.0)インストール
- 以下公式手順にしたがって行う。
- Install k0s - Documentation
worker, controller 共通
- 2021/3/14時点で最新の
v0.11.0
を導入する。
$ export K0S_VERSION=v0.11.0; echo $K0S_VERSION v0.11.0 $ curl -sSLf https://get.k0s.sh | sudo sh $ k0s version v0.11.0
controllerでclusterの構成ファイル作成
- 構成ファイルを作成する。
$ k0s default-config > k0s.yaml
spec.api.address
とspec.api.sans
がcontrollerのipになっていることを確認して保存します。
apiVersion: k0s.k0sproject.io/v1beta1 images: konnectivity: image: us.gcr.io/k8s-artifacts-prod/kas-network-proxy/proxy-agent version: v0.0.13 metricsserver: image: gcr.io/k8s-staging-metrics-server/metrics-server version: v0.3.7 kubeproxy: image: k8s.gcr.io/kube-proxy version: v1.20.4 coredns: image: docker.io/coredns/coredns version: 1.7.0 calico: cni: image: calico/cni version: v3.16.2 flexvolume: image: calico/pod2daemon-flexvol version: v3.16.2 node: image: calico/node version: v3.16.2 kubecontrollers: image: calico/kube-controllers version: v3.16.2 installConfig: users: etcdUser: etcd kineUser: kube-apiserver konnectivityUser: konnectivity-server kubeAPIserverUser: kube-apiserver kubeSchedulerUser: kube-scheduler kind: Cluster metadata: name: k0s spec: api: address: 192.168.68.140 sans: - 192.168.68.140 storage: type: etcd etcd: peerAddress: 192.168.68.140 network: podCIDR: 10.244.0.0/16 serviceCIDR: 10.96.0.0/12 provider: calico calico: mode: vxlan vxlanPort: 4789 vxlanVNI: 4096 mtu: 1450 wireguard: false flexVolumeDriverPath: /usr/libexec/k0s/kubelet-plugins/volume/exec/nodeagent~uds withWindowsNodes: false overlay: Always podSecurityPolicy: defaultPolicy: 00-k0s-privileged telemetry: interval: 10m0s enabled: true
controllerのインストール
$ sudo k0s install controller $ sudo systemctl start k0scontroller $ sudo systemctl enable k0scontroller $ sudo k0s status Version: v0.11.0 Process ID: 1849 Parent Process ID: 1 Role: controller Init System: linux-systemd
controllerでworker参加用のtokenを作成
$ sudo k0s token create --role=worker > k0s.token
workerのインストール
- controllerから構成ファイルと、tokenを取得する。
$ scp haku-mai@192.168.68.140:~/k0s.yaml ./ $ scp haku-mai@192.168.68.140:~/k0s.token ./ $ sudo mkdir /opt/k0s $ sudo mv ./k0s.token /opt/k0s/ $ ls /opt/k0s/ k0s.token
- workerのインストール
$ sudo k0s install worker --token-file /opt/k0s/k0s.token $ sudo systemctl start k0sworker $ sudo systemctl status k0sworker $ sudo systemctl enable k0sworker
controllerから確認
- k0sではcontrollerはk8sのnodeとして扱われない。
- したがって、controllerもworkerとして参加しないと何も稼働しない。
$ sudo k0s kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-worker1.haku-mai Ready <none> 3m5s v1.20.4-k0s1 k8s-worker2.haku-mai Ready <none> 89s v1.20.4-k0s1
kubectlのインストール(オプション)
- 毎回
k0s kubectl
とコマンドを打つのが面倒なのでkubectl
をインストールします。(エイリアスで誤魔化してもいいのです。) - 以下公式手順にしたがってインストールします。
kubectlのインストールおよびセットアップ | Kubernetes
controllerでkubectlのインストール
- インストールしたk0sに合わせて
v1.20.4
とします。
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.20.4/bin/linux/amd64/kubectl $ chmod +x ./kubectl $ sudo mv ./kubectl /usr/local/bin/kubectl $ kubectl version --client Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.4", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"clean", BuildDate:"2021-02-18T16:12:00Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"} $ mkdir .kube $ sudo cp /var/lib/k0s/pki/admin.conf .kube/k0s.conf $ sudo chown haku-mai:haku-mai .kube/k0s.conf $ echo "export KUBECONFIG=$HOME/.kube/k0s.conf" >> .bashrc $ source .bashrc $ echo $KUBECONFIG /home/haku-mai/.kube/k0s.conf
- 確認
$ kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-worker1.haku-mai Ready <none> 26m v1.20.4-k0s1 k8s-worker2.haku-mai Ready <none> 25m v1.20.4-k0s1
Rancherからk0sを操作
Rancherからk0sをimportする
- 以下のように既存clusterをimportするようのyamlを生成する。
controllerからRancherを適応する
- controllerから生成したyamlを適応します。
$ curl --insecure -sfL https://192.168.68.139/v3/import/fqmlg9sl9p6wslcrz4gvsbjc24hlnm5tfcqmm8dx6kszsjzg4n4dfk_c-6hhlk.yaml | kubectl apply -f -
- しばらく待って以下のように表示されれば完了。
動作確認(nginxをNode Portで起動)
以下のように設定する。
Node Portで起動していることが確認できる。
動作確認(オプション: traefik Ingress Controllerの作成とL7ロードバランスの設定)
以下のようにtraefikをsystem projectからdeployする。
わかりやすいようにNordPort
30080
,30443
に変更します。(オプション)Service Discoveryからtraefikをeditしshow advanced optionsからNordPortを変更。
default namespaceのworkloadでingressルールを作成。
既存のルールを削除して、serviceルールを以下のように追加。
- 問題なくアクセスできていることを確認。
$ curl -H "Host:test-ingress" http://192.168.68.141:30080 <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
後書き
- この環境の今後、簡易検証環境 and 自宅アプリの実行環境として利用していきます。
- k0sを初めて使ってみましたが、rancherでRKEをインストールする場合より(定性的ですが)かなり軽いなという印象です。
- という良り、上記macbook proのスペックだとRKEの推奨動作環境を満たしておらず、実際にデプロイしてみたのですが、通信が切れたり、podが落ちたりしまいなかなかまともに動かなたっかです。
- k0sのマルチクラスターの例があまりネット似なかったので、記事にしてみました。
- 最後に、k8sの勉強でお世話になっている本とこの記事を書いていた時に飲んでいた第3のビールをのせておきます。
[Amazon限定ブランド] 【新ジャンル/第3のビール】2ケースまとめ買い サントリー 金麦 [ 350ml×48本 ] SPBC
- 発売日: 2020/03/17
- メディア: 食品&飲料
【新ジャンル/第3のビール】アサヒ ザ・リッチ [ ビール 350ml×24本 ]
- 発売日: 2020/03/17
- メディア: 食品&飲料