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점입니다.
--iface
추가amd64
용 DaemonSet으로 설정했지만 환경에 따라 적절하게 설정하십시오. 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>
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
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
Reference
이 문제에 관하여(k3s를 Vagrant로 구축(3대 구성)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/omatztw/items/20b337b96595b6320be3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)