haku-maiのブログ

インフラエンジニアですが、アプリも作ります。

【kubernetes/k0s】VirtualBoxとCentOS7とk0s(v0.11.0)マルチクラスターとRancher(v2.5.6)とIngress controller環境の構築

f:id:n-guitar:20210314234836p:plain:w800

本記事で行うこと

  • macbook proを閉じてもスリープしない設定
  • VirtualBoxの設定
  • CentOS7のインストールと設定
  • Dockerのインストール
  • CentOS7のコピー&設定(nmcli ip固定)
  • Rancher2.5.6のインストール(Docker base)
  • k0s cluster(Kubernetes)構築
  • Rancherからk0sを操作
  • nginx podとtraefik Ingress controllerの動作確認

モチベーション

環境

$ sw_vers
ProductName:    macOS
ProductVersion: 11.2.2
BuildVersion:   20D80

f:id:n-guitar:20210314225700p:plain:w400

$ sw_vers
ProductName:    macOS
ProductVersion: 11.2.1
BuildVersion:   20D74

macbook proを閉じてもスリープしない設定

sudo pmset -a disablesleep 1

※戻す場合は0で更新する。

k0sとrancherの構成図

  • 今回は自宅のNWで以下のような構成とします。
    f:id:n-guitar:20210314232229p:plain:w600

CentOS7のインストールと設定

  • 以下の公式ページからCentOS7.9のisoファイルをダウンロード。
    https://www.centos.org/download/
  • インストール画面で今回はhaku-maiという管理者ユーザを作っておきました。
  • NWは自宅のNWからDHCPでIPが振られるようにブリッジアダプターにしています。
    f:id:n-guitar:20210314191515p:plain:w400

macからssh接続するまでの設定

$ sudo setenforce 0
  • fiewwalld停止
$ sudo systemctl stop firewalld
  • dhcpで振られたip確認
$ ip a
$ ssh haku-mai@ip
$ localectl set-locale LC_CTYPE=ja_JP.utf8
$ sudo sed -i -e "s/^SELINUX=enforcing$/SELINUX=disabled/g" /etc/selinux/config
$ 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固定)

  • 以下のようにコピーする。
    f:id:n-guitar:20210305215829p:plain:w400

  • 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の設定を行う。
    f:id:n-guitar:20210314202902p:plain:w600
    f:id:n-guitar:20210314202918p:plain:w400
    f:id:n-guitar:20210314203000p:plain:w600

k0s(v0.11.0)インストール

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.addressspec.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のインストール(オプション)

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を生成する。
    f:id:n-guitar:20210314203027p:plain:w600
    f:id:n-guitar:20210314203052p:plain:w600
    f:id:n-guitar:20210314203130p:plain:w600

controllerからRancherを適応する

  • controllerから生成したyamlを適応します。
$ curl --insecure -sfL https://192.168.68.139/v3/import/fqmlg9sl9p6wslcrz4gvsbjc24hlnm5tfcqmm8dx6kszsjzg4n4dfk_c-6hhlk.yaml | kubectl apply -f -
  • しばらく待って以下のように表示されれば完了。
    f:id:n-guitar:20210314210106p:plain:w600
    f:id:n-guitar:20210314210137p:plain:w600

動作確認(nginxをNode Portで起動)

  • 以下のように設定する。
    f:id:n-guitar:20210314210249p:plain:w600
    f:id:n-guitar:20210314210836p:plain:w600
    f:id:n-guitar:20210314210858p:plain:w600

  • Node Portで起動していることが確認できる。
    f:id:n-guitar:20210314210952p:plain:w600
    f:id:n-guitar:20210314211009p:plain:w600

動作確認(オプション: traefik Ingress Controllerの作成とL7ロードバランスの設定)

  • 以下のようにtraefikをsystem projectからdeployする。
    f:id:n-guitar:20210314212257p:plain:w600
    f:id:n-guitar:20210314214431p:plain:w600
    f:id:n-guitar:20210314214453p:plain:w600
    f:id:n-guitar:20210314214550p:plain:w600

  • わかりやすいようにNordPort30080,30443に変更します。(オプション)

  • Service Discoveryからtraefikをeditしshow advanced optionsからNordPortを変更。
    f:id:n-guitar:20210314215449p:plain:w600

  • default namespaceのworkloadでingressルールを作成。

  • 既存のルールを削除して、serviceルールを以下のように追加。
    f:id:n-guitar:20210314215732p:plain:w600

  • macからhost headerをつけてcurl実行。

  • 問題なくアクセスできていることを確認。
$ 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>

後書き