k3s를 Vagrant로 구축(3대 구성)

14569 단어 k3sVagrantkubernetes

소개



k3s 라는 경량의 Kubernetes 환경이 있다는 것으로, Vagrant로 구축해 보았습니다.
Vagrant로 구축하는 경우, 네트워크 설정(flannel)에서 주의점이 있기 때문에 기록을 남깁니다.

구성



아래와 같이 3대의 Ubuntu 16.04 머신을 각각, master, node1, node2로서 구성해, Node간은 프라이빗 네트워크로 접속합니다.



flannel의 VXLAN 인터페이스가 제대로 구성되지 않는 문제



여기 이슈 와 같습니다만, 그대로 인스톨 하면 Node간의 통신을 할 수 없습니다.

k3s에서 사용되고 있는 CNI의 flanel은 VXLAN 터널을 이용하여 Node간 통신을 실시합니다. 그때 이용하는 VXLAN의 출입구가 되는 NIC가 디폴트에서는 Node의 제일 최초의 NIC가 됩니다.

Vagrant의 경우 항상 NAT 용 NIC가 먼저 생성되기 때문에 기본적으로 NAT 용 인터페이스가 선택되어 편리하지 않습니다.
kubeadm등으로 구축하는 경우는, flanneld의 실행 인수 --iface 로 명시적으로 지정 가능합니다만, k3s에서는 flannel이 짜넣어지고 있기 때문에 지정을 할 수 없습니다.

따라서 이번에는 k3s에서는 --no-flannel 플래그를 붙여 flannel 설치를 건너 뛰고 별도 flannel을 설치했습니다.

또한 k3s의 실행 옵션으로 --flannel-iface를 붙이는 PR도 있기 때문에, 캡처되면 k3s의 flanel을 이용해도 설정할 수 있게 됩니다.

--2019/4/26 추가

병합되었습니다.

Master Node에 k3s 설치



공식 설치 프로그램을 사용하여 다음과 같이 설정합니다. INSTALL_K3S_EXEC 환경 변수를 사용하여 옵션을 전달합니다.
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-flannel --node-ip=192.168.33.11" sh -
/var/lib/rancher/k3s/server/node-token 에 Node 추가용의 토큰이 지불되고 있으므로, 메모해 둡니다.

Node1,2 추가



방금 메모한 토큰을 사용하여 Node1, 2를 agent로 추가합니다. 다음은 Node1용입니다.
export K3S_TOKEN=<トークン>
export K3S_URL=https://192.168.33.11:6443
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-flannel --node-ip=192.168.33.12" sh -

CNI 플러그인 설치



모든 노드에서 CNI 플러그인을 배치해야하므로 공식 출시 페이지에서 cni-plugins-xxxx.tgz를 설치하고 /opt/cni/bin에 배포하십시오.

flannel 설치



flannel 자체의 배포는 kubectl 를 사용해 실시합니다.

공식 매니페스트 파일를 다운로드하여 다음과 같이 수정합니다.

포인트는 이하의 2점입니다.
  • flanneld의 DaemonSet에서 부팅 옵션에 --iface 추가
  • 다음 예제는 amd64 용 DaemonSet으로 설정했지만 환경에 따라 적절하게 설정하십시오.

  • CNI 설정의 ConfigMap을 환경에 맞추어 설정
  • k3s의 디폴트에 맞추어 10.42.0.0/16 로 설정했습니다.

  • --- kube-flannel.yaml.org       2019-03-21 09:28:45.427370300 +0000
    +++ kube-flannel.yaml   2019-03-20 14:37:30.155241900 +0000
    @@ -124,7 +124,7 @@
         }
       net-conf.json: |
         {
    -      "Network": "10.244.0.0/16",
    +      "Network": "10.42.0.0/16",
           "Backend": {
             "Type": "vxlan"
           }
    @@ -174,6 +174,7 @@
             args:
             - --ip-masq
             - --kube-subnet-mgr
    +        - --iface=enp0s8
             resources:
               requests:
                 cpu: "100m"
    

    수정된 파일을 kubectl 로 적용합니다.
    vagrant@master:~$ kubectl apply -f kube-flannel.yaml
    

    확인



    이상으로 구축이 완료되었습니다. VXLAN 인터페이스 설정과 노드 간 통신이 문제가 되는지 확인합니다.

    VXLAN 인터페이스


    vagrant@master:~$ ip -d a show flannel.1
    4: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
        link/ether 6a:02:aa:4b:49:0d brd ff:ff:ff:ff:ff:ff promiscuity 0
        vxlan id 1 local 192.168.33.11 dev enp0s8 srcport 0 0 dstport 8472 nolearning ageing 300
        inet 10.42.0.0/32 scope global flannel.1
           valid_lft forever preferred_lft forever
        inet6 fe80::6802:aaff:fe4b:490d/64 scope link
           valid_lft forever preferred_lft forever
    

    개인 인터페이스가 설정되었습니다.

    노드 간 통신



    Nginx의 Deployment를 적절하게 작성해 둡니다.
    vagrant@master:~$ kubectl run --image=nginx --replicas=5 nginx
    kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
    deployment.apps/nginx created
    vagrant@master:~$ kubectl get pod -o wide
    NAME                     READY   STATUS    RESTARTS   AGE   IP           NODE     NOMINATED NODE   READINESS GATES
    nginx-7cdbd8cdc9-824qd   1/1     Running   0          25s   10.42.1.12   node1    <none>           <none>
    nginx-7cdbd8cdc9-9sct7   1/1     Running   0          25s   10.42.2.11   node2    <none>           <none>
    nginx-7cdbd8cdc9-bxfhb   1/1     Running   0          25s   10.42.2.12   node2    <none>           <none>
    nginx-7cdbd8cdc9-csd4p   1/1     Running   0          25s   10.42.1.13   node1    <none>           <none>
    nginx-7cdbd8cdc9-wcn9s   1/1     Running   0          25s   10.42.0.13   master   <none>           <none>
    
  • Master -> Pods 통신
  • vagrant@master:~$ ping 10.42.1.12 -c 1
    PING 10.42.1.12 (10.42.1.12) 56(84) bytes of data.
    64 bytes from 10.42.1.12: icmp_seq=1 ttl=63 time=0.425 ms
    
    --- 10.42.1.12 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.425/0.425/0.425/0.000 ms
    
    vagrant@master:~$ ping 10.42.2.11 -c 1
    PING 10.42.2.11 (10.42.2.11) 56(84) bytes of data.
    64 bytes from 10.42.2.11: icmp_seq=1 ttl=63 time=0.802 ms
    
    --- 10.42.2.11 ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.802/0.802/0.802/0.000 ms
    
  • Pod -> Pods 통신
  • vagrant@master:~$ kubectl run --generator=run-pod/v1 -it test --image=busybox /bin/sh
    If you don't see a command prompt, try pressing enter.
    / # ping 10.42.0.13 -c 1
    PING 10.42.0.13 (10.42.0.13): 56 data bytes
    64 bytes from 10.42.0.13: seq=0 ttl=64 time=0.075 ms
    
    --- 10.42.0.13 ping statistics ---
    1 packets transmitted, 1 packets received, 0% packet loss
    round-trip min/avg/max = 0.075/0.075/0.075 ms
    
    / # ping 10.42.1.12 -c 1
    PING 10.42.1.12 (10.42.1.12): 56 data bytes
    64 bytes from 10.42.1.12: seq=0 ttl=62 time=0.484 ms
    
    --- 10.42.1.12 ping statistics ---
    1 packets transmitted, 1 packets received, 0% packet loss
    round-trip min/avg/max = 0.484/0.484/0.484 ms
    
    / # ping 10.42.2.11 -c 1
    PING 10.42.2.11 (10.42.2.11): 56 data bytes
    64 bytes from 10.42.2.11: seq=0 ttl=62 time=0.433 ms
    
    --- 10.42.2.11 ping statistics ---
    1 packets transmitted, 1 packets received, 0% packet loss
    round-trip min/avg/max = 0.433/0.433/0.433 ms
    

    모두 통신할 수 있는 것을 확인할 수 있었습니다.

    Vagrantfile



    마지막으로 모든 것을 결합한 Vagrant 파일을 아래에 둡니다.kube-flannel.yaml 는 수정된 것이 이미 Vagrantfile과 같은 폴더에 있다고 가정합니다.

    Vagrantfile
    # -*- mode: ruby -*-
    # vi: set ft=ruby :
    
    $configureCommon = <<-SHELL
    
      # apt-get update
      # apt-get upgrade -y
    
      ## cni pluginsを展開
      mkdir -p /opt/cni/bin
      curl -sSL https://github.com/containernetworking/plugins/releases/download/v0.7.5/cni-plugins-amd64-v0.7.5.tgz | tar xzf - -C /opt/cni/bin
    
    SHELL
    
    $configureMaster = <<-SHELL
    
      # プライベートネットワークのNICのIPアドレスを変数に格納
      IPADDR=$(ip a show enp0s8 | grep "inet " | awk '{print $2}' | cut -d / -f1)
    
      ## k3sのデプロイ flannelをOFF プライベートIPをkubeletのIPとするように指定
      ## ここで、flannelをOFFにしているのは、現在ではVxLANの送出IFの指定ができず、Vagrant環境の場合、NATインターフェースが選択されてしまうため都合が悪い
      ## k3sのFlannelはあきらめて、flannelは別途構築する
      curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-flannel --node-ip=${IPADDR}" sh -
    
      ## flannelのデプロイ
      kubectl apply -f /vagrant/kube-flannel.yaml
    
      ## agent登録用のトークンを共有フォルダに配置
      cp /var/lib/rancher/k3s/server/node-token /vagrant/token
    
    SHELL
    
    $configureNode = <<-SHELL
    
      export K3S_TOKEN=$(cat /vagrant/token)
      export K3S_URL=https://192.168.33.11:6443
      # プライベートネットワークのNICのIPアドレスを変数に格納
      IPADDR=$(ip a show enp0s8 | grep "inet " | awk '{print $2}' | cut -d / -f1)
    
      ## k3sのデプロイ flannelをOFF プライベートIPをkubeletのIPとするように指定
      curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--no-flannel --node-ip=${IPADDR}" sh -
    
    SHELL
    
    Vagrant.configure(2) do |config|
    
      node_num = 3
    
      (1..node_num).each do |i|
    
        if i == 1 then
          vm_name = "master"
        else
          vm_name = "node#{i-1}"
        end
    
        config.vm.define vm_name do |s|
    
          # ホスト名
          s.vm.hostname = vm_name
          # ノードのベースOSを指定
          s.vm.box = "ubuntu/xenial64"
          # ネットワークを指定
          private_ip = "192.168.33.#{i+10}"
          s.vm.network "private_network", ip: private_ip
    
          # 共通
          s.vm.provision "shell", inline: $configureCommon
    
          if i == 1 then
            # For Master
            s.vm.provision "shell", inline: $configureMaster
          else
            # For Nodes
            s.vm.provision "shell", inline: $configureNode
          end
    
        end
      end
    end
    

    좋은 웹페이지 즐겨찾기