Skip to content

Latest commit

 

History

History
387 lines (310 loc) · 10.4 KB

README.md

File metadata and controls

387 lines (310 loc) · 10.4 KB

humstack

humstack is iaas. influenced by n0stack, kubernetes...

setup

依存パッケージ

sudo apt update
sudo apt install qemu qemu-kvm cloud-image-utils librbd-dev librados-dev qemu-system-arm qemu-efi-aarch64
echo 1 > /proc/sys/ipv4/ip_forward

ビルド

make all

実行

apiserver

./apiserver --listen-address 0.0.0.0 --listen-port 8080

agent

管理者権限で実行する。実行したマシンのホスト名が node 名として apiserver に登録される。

sudo ./agent --config config.yaml

config.yaml

# apiserverのアドレスとポート
apiServerAddress: localhost
apiServerPort: 8080

# agentのモード
# Core: corev0のリソース削除用(1ノードで動かすだけでよい)
# System: systemv0のリソース作成・削除用(各computeノードで動作させる)
# All: Singleノードで動作させる場合にCoreとSystemの両方を動かす
agentMode: All

# agentが動作するノードのリソース量(使われていない)
limitMemory: 8G
limitVcpus: 8000m

# nodeのアドレス
nodeAddress: 192.168.10.1

# blockStorageAgentの設定
blockStorageAgentConfig:
  # blockstorageを保存する場所
  blockStorageDirPath: ./blockstorages
  # imageが保存される場所
  imageDirPath: ./images
  # 処理の並行数
  parallelLimit: 1
  # DL用のListenアドレスとポート
  downloadAPI:
    # ダウンロード時のプロキシ先に指定される
    advertiseAddress: 192.168.10.1
    listenAddress: 0.0.0.0
    listenPort: 8082
  cephBackend:
    configPath: /etc/ceph/ceph.conf
    poolName: test-pool

# networkAgentの設定
networkAgentConfig:
  # vxlanの設定
  vxlan:
    # デバイス名
    devName: eth0
    # vxlanで使用するマルチキャストIP
    group: 239.0.0.1
  # vlanの設定
  vlan:
    # デバイス名
    devName: eth0

# imageAgentの設定
imageAgentConfig:
  # blockstorageが保存されている場所
  blockStorageDirPath: ./blockstorages
  # imageを保存する場所
  imageDirPath: ./images
  cephBackend:
    configPath: /etc/ceph/ceph.conf
    # blockstorageが保存されているceph pool
    poolName: test-pool


humcli

yaml ファイルを読み込んで apiserver にリクエストを送信するコマンドラインツール

humstack cli

Usage:
  humstack [command]

Available Commands:
  create
  delete
  get
  help        Help about any command
  update
  watch

Flags:
      --api-server-address string   apiserver address (default "localhost")
      --api-server-port int32       apiserver Port (default 8080)
      --config string               config file
      --g string                    group id (default "default")
  -h, --help                        help for humstack
      --n string                    namespace id (default "default")

Use "humstack [command] --help" for more information about a command.

リソース

corev0/group

グループ、組織

meta:
  apiType: corev0/group
  id: group1
  name: group1

corev0/namespace

グループ内でリソースを分離

meta:
  apiType: corev0/namespace
  id: ns1
  name: namespace1
  group: group1

corev0/externalippool

外部ネットワークの設定。group や namespace は指定しない

meta:
  apiType: corev0/externalippool
  id: eippool
  name: eippool
spec:
  ipv4CIDR: 192.168.10.0/24
  bridgeName: exBr
  defaultGateway: 192.168.10.254

corev0/externalip

外部ネットワークのアドレス。

meta:
  apiType: corev0/externalip
  id: eip1
  name: eip1
  group: group1
  namespace: ns1
spec:
  poolID: eippool
  ipv4Address: 192.168.10.100
  ipv4Prefix: 24

systemv0/network

仮想ネットワーク。Linux Bridge や vxlan などが作成される。

meta:
  apiType: systemv0/network
  id: net1
  name: network1
  group: group1
  namespace: ns1
  annotations:
    networkv0/network_type: VXLAN
spec:
  # vxlanやvlanで使用するID
  id: "100"
  # そのネットワークのCIDR
  ipv4CIDR: 10.0.0.0/24
annotations
key value description
networkv0/network_type VXLAN, VLAN, Bridge VXLANの場合vxlanの link と Bridge が作成される。VLAN link と Bridge が作成される。Bridgeは Bridge のみ作成される
networkv0/bridge_name agent によって作成された Bridge の名前が入る
networkv0/default_gateway xxx.xxx.xxx.xxx/xx 指定されたアドレスが Bridge に対して設定され、コンピュートノード上の iptables で NAPT される

systemv0/virtualrouter

仮想ルーター。指定したノード上で netns と iptables などを利用したルーティング、NAT を行う。

meta:
  apiType: systemv0/virtualrouter
  id: vrouter1
  name: virtualrouter1
  group: group1
  namespace: ns1
  annotations:
    virtualrouterv0/node_name: worker2
spec:
  # 外部ネットワークのゲートウェイ
  externalGateway: 192.168.10.254

  # 外部ネットワークのIPのbind
  externalIPs:
      # 外部IP
    - externalIPID: eip1
      # 外部IPをどのアドレスにDNATするか
      bindInternalIPv4Address: 10.0.0.1
  # 外部IPのないVMのNAT用IP
  natGatewayIP: 192.168.10.200

  nics:
      # 接続するネットワーク
    - networkID: net1
      # 接続するインターフェースに設定するIPアドレス
      ipv4Address: 10.0.0.254/24

annotations
key value description
virtualrouterv0/node_name ホスト名 vRouter を動作させる node のホスト名

systemv0/imageentity

イメージの実体。namespace で分離しない。 .spec.sourceに指定した namespace にある blockstorage をコピーする。 blockstorage が Active なときにコピーする

meta:
  apiType: systemv0/imageentity
  id: ientity1
  group: group1
spec:
  source:
    namespace: ns1
    blockStorageID: bs1

systemv0/image

イメージ名とタグに実体を紐付ける。 追記していく必要がある。

meta:
  apiType: systemv0/image
  id: base-image
  group: group1
spec:
  entityMap:
    latest: test-entity-1
    "0.1": hogehoge

systemv0/blockstorage

仮想ディスク。

meta:
  apiType: systemv0/blockstorage
  id: bs1
  name: blockstorage1
  group: group1
  namespace: ns1
  annotations:
    blockstoragev0/node_name: worker1
    blockstoragev0/type: Local
spec:
  # リクエストサイズ
  requestSize: 1G
  # リミットサイズ
  limitSize: 10G
  # 何をベースにするか
  from:
    # HTTPでDLする
    type: HTTP
    http:
      # DLするイメージのURL
      url: http://192.168.20.2:8082/focal-server-cloudimg-amd64.img

from baseImage

例えばイメージ名がubuntu, タグが2004のイメージを元に作成する場合、spec は以下のようにする。

spec:
  requestSize: 1G
  limitSize: 10G
  from:
    type: BaseImage
    baseImage:
      imageName: ubuntu
      tag: "2004"
annotations
key value description
blockstoragev0/type Local BlockStorage をどこに保存するか。Localの場合はblockstoragev0/node_nameの指定が必要
blockstoragev0/node_name ホスト名 BlockStorage を保存する node のホスト名
bs-download-host advertise-address:listen-port agent が設定する

systemv0/virtualmachine

仮想マシン。blockstorage や network などに依存するため、それらが利用できる状態になるまで作成されない。

meta:
  apiType: systemv0/virtualmachine
  id: vm1
  name: virtualmachine1
  group: group1
  namespace: ns1
  annotations:
    virtualmachinev0/node_name: worker1
spec:

  requestVcpus: 1000m
  limitVcpus: 1000m
  requestMemory: 1G
  limitMemory: 1G
  # BlockStorageのIDの配列
  blockStorageIDs:
    - bs1
  # 接続するネットワークの配列
  nics:
    - networkID: net1
      # cloudinitで設定するIPアドレス
      ipv4Address: 10.0.0.1
      # cloudinitで設定するネームサーバー
      nameservers:
        - 8.8.8.8
      # cloudinitで設定するデフォルトゲートウェイ
      defaultGateway: 10.0.0.254
  # VMを起動
  actionState: PowerOn
  # cloudinitで設定するユーザーの配列
  loginUsers:
    - username: test
      sshAuthorizedKeys:
        - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCsf7CDppU1lSzUbsmszAXX/rAXdGxB71i93IsZtV4omO/uRz/z6dLIsBidf9vIqcEfCFTFR00ULC+GKULTNz2LOaGnGsDS28Bi5u+cx90+BCAzEg6cBwPIYmdZgASsjMmRvI/r+xR/gNxq2RCR8Gl8y5voAWoU8aezRUxf1Ra3KljMd1dbIFGJxgzNiwqN3yL0tr9zActw/Q7yBWKWi1c5sW2QZLAnSj/WWTSGGm0Ad88Aq22DakwN6itUkS6XNhr4YKehLVm90fIojrCrtZmClULAlnUk5lbdzou4jiETsZz3zk/q76ZQ3ugk+G00kcx9v6ElLkAFv2ZZqzWbMvUz6J0k2SzkAIbcBDz+aq2sXeY04FaIOFPiH41+DTQXCtOskWkaJBMKLTE/Z83nSyQGr9If2F/PbnuxGkwiZzeZaLWxqI2SebhLR5jPETgfhB1y83RP6u8Jq5+9BUURFqpb8mfG/riTnAj0ZR4Li23+/hWhc8We+fVB1BxdbWyRn/M=
annotations
key value description
virtualmachinev0/node_name ホスト名 vm を起動する node のホスト名