Tungsten Fabric知識庫丨構建、安裝與公有云部署

TF中文社群發表於2020-09-08

作者:Tatsuya Naganawa 譯者:TF中文社群

如何構建Tungsten Fabric

這裡的repo檔案的說明文件大部分是有效的。

yum -y install docker git
git 
clone
 https://github.com/Juniper/contrail-dev-env
cd
 contrail-dev-env
./startup.sh
docker 
exec
 -it contrail-developer-sandbox bash
cd
 /root/contrail-dev-env
yum -y remove python-devel 
## it is needed to resolve dependency issue
make sync
make fetch_packages
make setup
make dep

要構建所有模組,可以使用此命令(需要1-2個小時時間,具體取決於計算機效能)。

make rpm
make containers

要構建更多具體的模組,也可以使用這些命令。一個注意事項是,rpm-contrail本身是一個大的資料包,並且不能分解為更多(controller、vrouter等都包含在內)。

make list

make rpm-contrail

make list-containers
make container-general-base
make container-base
make container-kubernetes_kube-manager

- those make targets are included from this file:
/root/contrail/tools/packages/Makefile


如果僅構建vrouter.ko,此命令比較有用。

build:
cd /root/contrail
scons --opt=production --kernel-dir=/lib/modules/3.10.0-1062.el7.x86_64/build build-kmodule

clean:
cd /root/contrail/vrouter
make KERNELDIR=/lib/modules/3.10.0-1062.el7.x86_64/build clean

注意:當安裝了其它發行版的kernel-devel軟體包(我嘗試過centos 8和amazon linux 2的軟體包)時,也可以將其指定為kernel-dir。

例如,此命令為centos 8.2建立了vrouter.ko。

  • 可以透過insmod命令手動載入。
# rpm -ivh --nodeps kernel-devel-4.18.0-147.8.1.el8_1.x86_64.rpm

# scons --opt=production --kernel-dir=/usr/src/kernels/4.18.0-147.8.1.el8_1.x86_64/ build-kmodule

charm安裝

Tungsten Fabric也可以透過juju charm安裝。

  • 使用了bionic和Openstack Queens,有4個節點(juju node, openstack controller, openstack compute, tunsten-fabric controller)
# apt update

# snap install --classic juju
# juju add-cloud

Select cloud type: manual
Enter a name for your manual cloud: manual-cloud-1
Enter the controller's hostname or IP address: (juju node's ip)

# ssh-keygen
# cd .ssh
# cat id_rsa.pub >> authorized_keys
# cd
# ssh-copy-id (other nodes' ip)

# juju bootstrap manual-cloud-1

# git clone -b R5

# juju add-machine ssh:root@(openstack-controller ip)
# juju add-machine ssh:root@(openstack-compute ip)
# juju add-machine ssh:root@(TungstenFabric-controller ip)

# vi set-juju.sh
juju deploy ntp
juju deploy rabbitmq-server --to lxd:0
juju deploy percona-cluster mysql --config root-password=contrail123 --config max-connections=1500 --to lxd:0
juju deploy openstack-dashboard --to lxd:0
juju deploy nova-cloud-controller --config console-access-protocol=novnc --config network-manager=Neutron --to lxd:0
juju deploy neutron-api --config manage-neutron-plugin-legacy-mode=false --config neutron-security-groups=true --to lxd:0
juju deploy glance --to lxd:0
juju deploy keystone --config admin-password=contrail123 --config admin-role=admin --to lxd:0

juju deploy nova-compute --config ./nova-compute-config.yaml --to 1

CHARMS_DIRECTORY=/root
juju deploy $CHARMS_DIRECTORY/contrail-charms/contrail-keystone-auth --to 2
juju deploy $CHARMS_DIRECTORY/contrail-charms/contrail-controller --config auth-mode=rbac --config cassandra-minimum-diskgb=4 --config cassandra-jvm-extra-opts="-Xms1g -Xmx2g" --to 2
juju deploy $CHARMS_DIRECTORY/contrail-charms/contrail-analyticsdb --config cassandra-minimum-diskgb=4 --config cassandra-jvm-extra-opts="-Xms1g -Xmx2g" --to 2
juju deploy $CHARMS_DIRECTORY/contrail-charms/contrail-analytics --to 2
juju deploy $CHARMS_DIRECTORY/contrail-charms/contrail-openstack
juju deploy $CHARMS_DIRECTORY/contrail-charms/contrail-agent

juju expose openstack-dashboard
juju expose nova-cloud-controller
juju expose neutron-api
juju expose glance
juju expose keystone

juju expose contrail-controller
juju expose contrail-analytics

juju add-relation keystone:shared-db mysql:shared-db
juju add-relation glance:shared-db mysql:shared-db
juju add-relation keystone:identity-service glance:identity-service
juju add-relation nova-cloud-controller:image-service glance:image-service
juju add-relation nova-cloud-controller:identity-service keystone:identity-service
juju add-relation nova-cloud-controller:cloud-compute nova-compute:cloud-compute
juju add-relation nova-compute:image-service glance:image-service
juju add-relation nova-compute:amqp rabbitmq-server:amqp
juju add-relation nova-cloud-controller:shared-db mysql:shared-db
juju add-relation nova-cloud-controller:amqp rabbitmq-server:amqp
juju add-relation openstack-dashboard:identity-service keystone

juju add-relation neutron-api:shared-db mysql:shared-db
juju add-relation neutron-api:neutron-api nova-cloud-controller:neutron-api
juju add-relation neutron-api:identity-service keystone:identity-service
juju add-relation neutron-api:amqp rabbitmq-server:amqp

juju add-relation contrail-controller ntp
juju add-relation nova-compute:juju-info ntp:juju-info

juju add-relation contrail-controller contrail-keystone-auth
juju add-relation contrail-keystone-auth keystone
juju add-relation contrail-controller contrail-analytics
juju add-relation contrail-controller contrail-analyticsdb
juju add-relation contrail-analytics contrail-analyticsdb

juju add-relation contrail-openstack neutron-api
juju add-relation contrail-openstack nova-compute
juju add-relation contrail-openstack contrail-controller

juju add-relation contrail-agent:juju-info nova-compute:juju-info
juju add-relation contrail-agent contrail-controller

# vi nova-compute-config.yaml
nova-compute:
   virt-type: qemu
   enable-resize: True
   enable-live-migration: True
   migration-auth-type: ssh

# bash set-juju.sh

(to check status, it takes 20 minutes for every application to be active)
# juju status
# tail -f /var/log/juju/*log | grep -v -w DEBUG

為了使其成功執行,有以下兩點需要注意。

1.由於juju在內部使用LXD及其自己的子網,因此至少Tungsten Fabric節點需要具有到該子網的一些靜態路由(如果透過AWS,則可以使用VPC的路由表,還需要禁用源/目標檢查)
2.由於預設情況下LXD不允許docker執行,因此需要透過lxc config設定為允許。

juju ssh 0

 sudo su -
   lxc list
   lxc config set juju-cb8047-0-lxd-4 security.nesting true
   lxc config show juju-cb8047-0-lxd-4
   lxc restart juju-cb8047-0-lxd-4
   
Tungsten fabric在公有云上的部署

gatewayless和snat
當安裝在公有云上時,由於沒有可用的支援MPLS over IP或VXLAN的硬體,vRouter需要具有來自underlay IP的浮動IP。

話雖如此,由於Tungsten Fabric支援gatewayless功能,因此從該虛擬網路為浮動IP提供服務不會有太大困難(辦法是將另一個IP與ENI相連,並使之成為浮動IP的來源,從而可以從外部訪問vRouter上的服務)

注意:當使用kubernetes時,我個人更喜歡將服務網路設定為gatewayless(此設定將不使用外部IP)。如果使用了帶有裸金屬例項的虛擬機器管理程式,則首選帶有一些gatewayless子網的浮動IP。

從vRouter到外部網路,分散式SNAT功能都可以解決問題。

  • 帶有浮動IP的SNAT也可以很好地工作

AZ高可用性WIP
此外,還可以在vRouters上定義兩個單獨的負載均衡器以訪問同一應用程式,以使其可以從兩個不同的可用區域進行訪問,從而確保更高的可用性。

要進行此設定,需要配置幾項內容:

1.vRouter有一個gatewayless子網,其子網範圍未包含在VPC子網中。
2.在路由表中配置一個例項路由,它將gatewayless子網轉發到其中一個vRouter節點。
3.ELB將設定為gatewayless IP的IP地址。(當指定IP時,需要為“子網”配置“其它IP地址”)
4.由於在這種情況下,安全組(security-group)不會自動允許ELB的地址,因此需要手動允許VPC的CIDR進行ELB的執行狀況檢查,以使其正常工作。

vRouter的gatewayless功能的一個限制是,只有將目的地vRouter與原始接收資料包的vRouter放在同一個L2子網中,才能將資料包轉發到其它vRouter。

  • 如果位於不同的子網中,vRouter會將資料包轉發到VROUTER_GATEWAY,而後者又將其傳送到vRouter,這會形成環路。

由於AWS子網不能包含相同的子網,因此,要使此設定AZ具有高可用性,需要為同一應用程式配置兩個負載均衡器,每個AZ都具有兩個不同的gatewayless子網。

由於ELB可以將資料包轉發到兩個vRouter負載均衡器,因此在ELB的幫助下它可以實現AZ高可用。

EKS整合

vRouter CNI AWS EKS是另一種可能的整合方案。

要進行此設定,首先要透過web console為EKS配置一些IAM使用者。

  • 由於kubectl可以與建立該kubernetes叢集的IAM使用者一起使用,因此不建議對web console進行root訪問。
    然後,以下命令將從每個工作節點中刪除VPC CNI。

注意:儘管預設情況下,無法將dockerhub容器中的vrouter.ko載入到amazon linux 2核心中,但是可以使用此步驟為該核心建立vrouter.ko。

CNI MTU設定

值得注意的是,在公有云例項中安裝vRouter時,可能會發生一些MTU問題。
更改物理介面MTU可以解決大部分問題,但是當來自容器的資料包被分段時,可能需要更改CNI的MTU設定。


vi /etc/cni/net.d/10-contrail.conf
{
    
"cniVersion"
: 
"0.3.1"
,
    
"contrail"
 : {
        
"meta-plugin"
   : 
"
$KUBERNETES_CNI_META_PLUGIN
"
,
        
"vrouter-ip"
    : 
"127.0.0.1"
,
        
"vrouter-port"
  : 
$VROUTER_PORT
,
        
"config-dir"
    : 
"/var/lib/contrail/ports/vm"
,
        
"poll-timeout"
  : 5,
        
"poll-retries"
  : 15,
+       
"mtu"
  : 1300,
        
"log-file"
      : 
"
$LOG_DIR
/cni/opencontrail.log"
,
        
"log-level"
     : 
"4"
    },
    
"name"
: 
"contrail-k8s-cni"
,
    
"type"
: 
"contrail-k8s-cni"
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69957171/viewspace-2717979/,如需轉載,請註明出處,否則將追究法律責任。

相關文章