k0s:単一のバイナリのKubernetes

新しい 翻訳記事では、新しいKubernetesディストリビューションの概要を簡単に説明します。この記事がHabrの読者にとって興味深いものになることを願っています。


数日前、友人がミランティスからのk0sと呼ばれる 新しいKubernetesディストリビューションについて教えてくれ ました私たちは皆、K8を知っていて、大好きですよね?またRancher Labsによって開発され、しばらく前CNCFに引き渡さ れた軽量のKubernetesであるK3sも魅了され ました新しいk0sディストリビューションを発見する時が来ました!







k0の簡単な紹介の後、次の手順に従って3つのノードのクラスターを作成します。



  • 3台の仮想マシンの準備(マルチパスの実行)
  • それらのそれぞれにk0をインストールする
  • 単純なk0sクラスター構成ファイルのセットアップ
  • クラスターの初期化
  • クラスターへのアクセスの取得
  • ワーカーノードの追加
  • ユーザーを追加する


k0sとは何ですか?



k0sは最新のKubernetesディストリビューションです。現在のリリースは0.8.0です。2020年12月に発行され、プロジェクト全体の最初のコミットは2020年6月に行われました。



k0sは、OSに依存しない単一のバイナリとして出荷されます。したがって、これは、摩擦ゼロ/深さゼロ/コストゼロの特性(構成の容易さ/依存関係なし/無料)を備えたKubernetes分布として定義され ます。



最新のk0sリリース:



  • 認定済み(インターネットセキュリティセンター認定済み)のKubernetes1.19を提供
  • デフォルトのコンテナランタイムとしてcontainerd使用します
  • Intel(x86-64)およびARM(ARM64)アーキテクチャをサポート
  • クラスタ内などを使用
  • デフォルトでCalicoネットワークプラグインを使用します(これにより、ネットワークポリシーがアクティブ化されます
  • ポッドセキュリティポリシーアクセスコントローラーが含まれています
  • CoreDNSでDNSを使用
  • 経由して、クラスタの指標を提供するメトリックサーバー
  • 水平ポッドオートスケール(HPA)の使用を許可します。


将来のリリースでは、次のような多くの優れた機能が提供される予定です。



  • コンパクトVMランタイム(この機能のテストを本当に楽しみにしています)
  • ゼロダウンタイムクラスターアップグレード
  • クラスターのバックアップとリカバリ


印象的ですね。次に、k0を使用して3ノードクラスターを展開する方法を見ていきます。



仮想マシンの準備



まず、3つの仮想マシンを作成します。各仮想マシンは、クラスター内のノードになります。この記事では、すばやく簡単な方法で、優れたマルチパスツール(大好きです)を使用して、 MacOSでローカル仮想マシンを準備します。



次のコマンドは、xhyve上にUbuntuの3つのインスタンスを作成します。各仮想マシンには、5 GBのディスク、2 GBのRAM、および2つの仮想プロセッサ(vCPU)があります。



for i in 1 2 3; do 
  multipass launch -n node$i -c 2 -m 2G
done
      
      





次に、仮想マシンのリストを表示して、すべてが正常に機能していることを確認できます。



$ multipass list
Name      State       IPv4             Image
node1     Running     192.168.64.11    Ubuntu 20.04 LTS
node2     Running     192.168.64.12    Ubuntu 20.04 LTS
node3     Running     192.168.64.13    Ubuntu 20.04 LTS
      
      





次に、これらの各ノードにk0をインストールします。



最新のk0sリリースのインストール



k0の最新リリースは、GitHubリポジトリからダウンロードでき ます



便利なインストールスクリプトがあります。



curl -sSLf get.k0s.sh | sudo sh
      
      





このスクリプトを使用して、すべてのノードにk0をインストールします。



for i in 1 2 3; do 
  multipass exec node$i --bash -c "curl -sSLf get.k0s.sh | sudo sh"
done
      
      





上記のスクリプトは、k0sを/ user / bin / k0にインストールします 使用可能なすべてのコマンドを取得するには、引数なしでバイナリを実行します。





使用可能なk0sコマンド



現在のバージョンを確認できます



$ k0s version
v0.8.0
      
      





次のステップでいくつかのコマンドを使用します。



構成ファイルの作成



まず、k0sがクラスターを作成するために必要な情報を含む構成ファイルを定義する必要があります。上の ノード1、我々は実行することができ、デフォルト・コンフィギュレーションコマンドを 完全なデフォルト設定を取得します。 とりわけ、これにより、以下を決定できます。



ubuntu@node1:~$ k0s default-config

apiVersion: k0s.k0sproject.io/v1beta1

kind: Cluster

metadata:

  name: k0s

spec:

  api:

    address: 192.168.64.11

    sans:

    - 192.168.64.11

    - 192.168.64.11

    extraArgs: {}

  controllerManager:

    extraArgs: {}

  scheduler:

    extraArgs: {}

  storage:

    type: etcd

    kine: null

    etcd:

      peerAddress: 192.168.64.11

  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

  podSecurityPolicy:

    defaultPolicy: 00-k0s-privileged

  workerProfiles: []

extensions: null

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.19.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

  repository: ""

telemetry:

  interval: 10m0s

  enabled: true













  • APIサーバー、コントローラーマネージャー、およびスケジューラの起動オプション
  • クラスタ情報(etcd)の保存に使用できるストレージ
  • ネットワークプラグインとその構成(Calico
  • 管理コンポーネントを含むコンテナイメージのバージョン
  • クラスターの開始時に展開するいくつかの追加の管理スキーム


この構成をファイルに保存して、ニーズに適合させることができます。ただし、この記事では、非常に単純な構成を使用して、/ etc / k0s /k0s.yamlに保存し ますnode1クラスターを初期化しているため 、このノードはAPIサーバーにサービスを提供します。このノードのIPアドレスは 、上記の構成ファイルのapi.addressおよび api.sans(サブジェクトの代替名)で使用されます。追加のマスターノードとその上にロードバランサーがある場合は、設定でapi.sansも使用します



apiVersion: k0s.k0sproject.io/v1beta1

kind: Cluster

metadata:

  name: k0s

spec:

  api:

    address: 192.168.64.11

    sans:

    - 192.168.64.11

  network:

    podCIDR: 10.244.0.0/16

    serviceCIDR: 10.96.0.0/12









各ホストとロードバランサーのIPアドレス(または対応するドメイン名)。



クラスターの初期化



まず、k0を管理するためnode1systemdユニットを作成します



[Unit]
Description="k0s server"
After=network-online.target
Wants=network-online.target
 
[Service]
Type=simple
ExecStart=/usr/bin/k0s server -c /etc/k0s/k0s.yaml --enable-worker
Restart=always
      
      





メインコマンドはここExecStartにリストされて ます; 前の手順でファイルに保存した構成でk0sサーバーを起動します。また、この最初のマスターノードがワーカーとしても機能するように--enable-workerパラメーターを指定します



次にこのファイルを/lib/systemd/system/k0s.serviceにコピーし 、systemdを再起動して、新しく作成されたサービスを開始します。



ubuntu@node1:~$ sudo systemctl daemon-reload
ubuntu@node1:~$ sudo systemctl start k0s.service
      
      





好奇心のために、k0sサーバーによって開始されたプロセスを確認できます。



ubuntu@node1:~$ sudo ps aux | awk ‘{print $11}’ | grep k0s
/usr/bin/k0s
/var/lib/k0s/bin/etcd
/var/lib/k0s/bin/konnectivity-server
/var/lib/k0s/bin/kube-controller-manager
/var/lib/k0s/bin/kube-scheduler
/var/lib/k0s/bin/kube-apiserver
/var/lib/k0s/bin/containerd
/var/lib/k0s/bin/kubelet
      
      





上記の出力から、すべての主要コンポーネント( kube-apiserverkube -controller-managerkube-schedulerなど)と、マスターノードとワーカーノードに共通のコンポーネント( containeredkubelet)が実行されていることわかります。k0sは、これらすべてのコンポーネントの管理を担当します。



これで、1ノードのクラスターができました。次のステップでは、それにアクセスする方法を見ていきます。



クラスターへのアクセスの取得



まず、クラスターの作成中に生成されたkubeconfigファイルを取得する必要 があります。それが上に作成された ノード1/var/lib/k0s/pki/admin.confこのファイルは、ローカルマシンでkubectlを構成するために使用する必要があります



まず、node1からクラスターkubeconfigを取得し ます



# Get kubeconfig file
$ multipass exec node1 cat /var/lib/k0s/pki/admin.conf > k0s.cfg
      
      





次に、内部IPアドレスを外部IPアドレスnode1に置き換えます



# Replace IP address
$ NODE1_IP=$(multipass info node1 | grep IP | awk '{print $2}')
sed -i '' "s/localhost/$NODE1_IP/" k0s.cfg
      
      





次に、k0sAPIサーバーと通信するようにローカルkubectlクライアントを構成します。



export KUBECONFIG=$PWD/k0s.cfg
      
      





確かに、新しいクラスターに入るときに最初に実行するコマンドの1つは、使用可能なすべてのノードのリストを表示するコマンドです。試してみましょう。



$ kubectl get no
NAME    STATUS   ROLES    AGE   VERSION
node1   Ready    <none>   78s   v1.19.4
      
      





ここで驚くべきことは何もありません。結局のところ、 node1はメインであるだけでなく、startコマンドで指定した--enable-workerフラグのおかげで、最初のクラスターの作業ノードでもあります このフラグがないとnode1は機能するだけで、ここのノードのリストには表示されません。



ワーカーノードの追加



node2node3をクラスター追加するには 、最初にnode1から接続トークンを作成する必要があります (これは、kubeadmで作成されたDocker SwarmおよびKubernetesクラスターで使用されるため、かなり一般的な手順です)。



$ TOKEN=$(k0s token create --role=worker)
      
      





上記のコマンドは、長い(非常に長い)トークンを生成します。これを使用して、node2node3をクラスターに参加させることができます



ubuntu@node2:~$ k0s worker $TOKEN
ubuntu@node3:~$ k0s worker $TOKEN
      
      





注:実際のクラスターでは、マスターノードの場合と同様に、systemd(または他のスーパーバイザー)を使用してワーカーノードのk0sプロセスを管理します。



ノードのリストを表示し、ノードを再度リストすることで確認できるため、3ノードクラスターが稼働しています。



$ kubectl get no
NAME    STATUS  ROLES    AGE   VERSION
node1   Ready   <none>   30m   v1.19.4
node2   Ready   <none>   35s   v1.19.4
node3   Ready   <none>   32s   v1.19.4
      
      





また、すべての名前名で実行されているポッドを確認することもでき





ます。すべての名前名でクラスターで実行されているポッドのリスト



ここで注意すべき点がいくつかあります。



  • いつものように、kube -proxyポッド、ネットワークプラグインポッド(Calicoに基づく)、およびCoreDNSポッドが表示されます。
  • api-server, scheduler controller-manager , , .




K0sバージョン0.8.0には、ユーザーサブコマンドが含まれてい ますこれにより、追加のユーザー/グループのkubeconfigを作成できます たとえば、次のコマンドは、開発という名前の架空のグループ内にある 、新しいユーザー用のdemoという名前の kubeconfigファイルを作成します 注: Kubernetesでは、ユーザーとグループはクラスター外の管理者によって管理されます。つまり、K8にはユーザーではないグループのリソースはありません。







$ sudo k0s user create demo --groups development > demo.kubeconfig
      
      





理解を深めるために、このkubeconfigファイルからクライアント証明書を抽出 し、base64表現からデコードします。



$ cat demo.kubeconfig | grep client-certificate-data | awk '{print $2}' | base64 --decode > demo.crt
      
      





次に、opensslコマンドを使用して 、証明書の内容を取得します。



ubuntu@node1:~$ openssl x509 -in demo.crt -noout -text

Certificate:

    Data:

        Version: 3 (0x2)

        Serial Number:

            71:8b:a4:4d:be:76:70:8a:...:07:60:67:c1:2d:51:94

        Signature Algorithm: sha256WithRSAEncryption

        Issuer: CN = kubernetes-ca

        Validity

            Not Before: Dec  2 13:50:00 2020 GMT

            Not After : Dec  2 13:50:00 2021 GMT

        Subject: O = development, CN = demo

        Subject Public Key Info:

            Public Key Algorithm: rsaEncryption

                RSA Public-Key: (2048 bit)

                Modulus:

                    00:be:87:dd:15:46:91:98:eb:b8:38:34:77:a4:99:

                    da:4b:d6:ca:09:92:f3:29:28:2d:db:7a:0b:9f:91:

                    65:f3:11:bb:6c:88:b1:8f:46:6e:38:71:97:b7:b5:

                    9b:8d:32:86:1f:0b:f8:4e:57:4f:1c:5f:9f:c5:ee:

                    40:23:80:99:a1:77:30:a3:46:c1:5b:3e:1c:fa:5c:









  • 発行者のプロパティkubernetes-caです。これは、k0sクラスターのCAです。
  • 件名O =開発、CN =デモ; この部分は、ユーザーの名前とグループが入る場所であるため、重要です。証明書はクラスターCAによって署名されているため、api-server上のプラグインは、証明書のサブジェクトの共通名(CN)と組織(O)によってユーザー/グループを認証できます。


まず、この新しいkubeconfigファイルで定義されたコンテキストを使用するようにkubectlに指示します



$ export KUBECONFIG=$PWD/demo.kubeconfig
      
      





次に、ノードのリストを再度表示し、クラスターノードを列挙します。



$ kubectl get no
Error from server (Forbidden): nodes is forbidden: User “demo” cannot list resource “nodes” in API group “” at the cluster scope
      
      





このエラーメッセージは予期されていました。api-server



ユーザーが識別された場合(ユーザー要求で送信された証明書がクラスターCAによって署名された場合)でも 、ユーザーはクラスターに対してアクションを実行できません。



追加の権限は、を作成Role/ClusterRole



してユーザーに割り当てることで簡単に追加でき ますが RoleBinding/ClusterRoleBinding



、このタスクは読者の演習として残しておきます。



結論



k0sは間違いなく検討する価値があります。このアプローチは、単一のバイナリファイルがすべてのプロセスを管理する場合、非常に興味深いものです。



この記事ではk0の概要のみを説明しますが、私は間違いなくその開発を追跡し、この新しい有望なKubernetesディストリビューションに今後の記事を捧げます。将来の機能のいくつかは本当に有望であるように思われます、そして私はそれらをテストすることを楽しみにしています。



All Articles