使用Ansible部署器设置一个小型的TF+K8s实验室



  • Kubernetes绝对是SDN和虚拟化世界中最热门的趋势之一。简单来说,对于虚拟机我们有OpenStack,而对于容器那就是Kubernetes了(或者RedHat的商业版本OpenShift)。

    和虚拟机一样,容器也需要网络,特别是需要一个软件来管理这个虚拟网络。在Kubernetes的世界里,我们可以把这个所谓的软件称为CNI,即容器网络接口(Container Network Interface)。

    我们不打算描述Kubernetes的基础和基本概念;要想了解什么是K8s,以及对docker容器的一些基本理解,我建议阅读下面这篇伟大的文章(它还谈到了作者工作的一个特定的“模块”,但以一种非常酷的方式解释了基本概念)。
    https://medium.com/@geraldcroes/kubernetes-traefik-101-when-simplicity-matters-957eeede2cf8

    在这里,我们将专注于使用Tungsten Fabric创建一个运行Kubernetes的小型实验室。

    架构

    我们将建立一个这样的实验室:
    7e8a7e23-6926-44dc-bb90-e48a2e8b7047-image.png

    所有的4个元素可能是裸机服务器,也可能是虚拟机;在这个实验室里,我使用了运行CentOS的虚拟机。

    那么这4个元素的实体是什么呢?

    首先,我们有Ansible部署器,它不会成为K8s集群(我们的“云”)的一部分,而只是利用Ansible安装Kubernetes和Tungsten Fabric。

    然后我们有一个控制节点,TF和K8s的控制功能都将在这里运行。用K8s的“语言”来说,这个节点将是master节点。

    另外两个节点将是kubernetes worker,容器将在这里运行。TF将在这里安装并运行vRouter,它将负责虚拟网络。

    TF vRouter并不能与所有的内核一起工作,而是需要一些特定的兼容版本。查看版本说明来了解你所需要的特定TF版本的内核版本。

    例如,我要安装Tungsten Fabric 5.0.3,它需要3.10.0-957内核。

    步骤

    首先,我们需要在master节点和两个节点上安装正确的内核版本:

    yum -y install kernel-3.10.0-957.el7.x86_64.rpm
    yum update
    reboot
    

    接下来,我们连接到Ansible部署器虚拟机并准备环境:

    yum -y install epel-release git ansible net-tools
    yum install -y python-pip
    pip install requests
    

    Ansible部署器以tgz文件的形式出现。

    我们将其解压:

    tar -xvf {contrail-ansible-deployer-vxxx.tgz}
    

    移动到提取的文件夹中:

    cd {contrail-ansible-deployer-vxxx}
    

    现在我们需要建立instances.yaml文件,一个描述我们的设置的文件。

    这个文件在yaml文件中。

    vi config/instances.yaml
    

    下面是一个示例:

    global_configuration:
     CONTAINER_REGISTRY: hub.juniper.net/contrail
     CONTAINER_REGISTRY_USERNAME: xxx
     CONTAINER_REGISTRY_PASSWORD: yyy
    provider_config:
      bms:
       ssh_pwd: Embe1mpls
       ssh_user: root
       domainsuffix: ulab
    instances:
      master:
       provider: bms
       roles:
          config_database:
          config:
          control:
          analytics_database:
          analytics:
          webui: 
          k8s_master:
          kubemanager:
       ip: 10.49.231.32
      w1:
       provider: bms
       roles:
         vrouter:
         k8s_node:
       ip: 10.49.230.206
      w1:
       provider: bms
       roles:
         vrouter:
         k8s_node:
       ip: 10.49.230.205
    contrail_configuration:
      CONTRAIL_CONTAINER_TAG: 5.0.3-0.493
      KUBERNETES_CLUSTER_PROJECT: {}
      CONFIG_NODEMGR__DEFAULTS__minimum_diskGB: 2
      DATABASE_NODEMGR__DEFAULTS__minimum_diskGB: 2
      CONFIG_DATABASE_NODEMGR__DEFAULTS__minimum_diskGB: 2
      RABBITMQ_NODE_PORT: 5673
    

    详解

    让我们把它分成小块,以便更好地理解它。

    首先,我们有全局配置部分:

    global_configuration:
     CONTAINER_REGISTRY: hub.juniper.net/contrail
     CONTAINER_REGISTRY_USERNAME: xxx
     CONTAINER_REGISTRY_PASSWORD: yyy
    

    这将告诉部署器在哪里获得Tungsten Fabric容器(记住,从5.0版本开始TF控制平面就已经是容器化的了)。你需要一个有效的账户。

    接下来,我们定义访问我们节点的凭证:

    provider_config:
      bms:
       ssh_pwd: Embe1mpls
       ssh_user: root
       domainsuffix: ulab
    

    所有的设备都需要用相同的凭证来配置,我们支持使用相同的凭证,但需要通过在单个节点定义中配置凭证来覆盖这些设置。

    接下来开始定义我们的资源:

    instances:
    

    定义master节点:

    master:
     provider: bms
     roles:
        config_database:
        config:
        control:
        analytics_database:
        analytics:
        webui: 
        k8s_master:
        kubemanager:
     ip: 10.49.231.32
    

    实例是一个bms(即使是虚拟机,也要用bms),那么所有典型的控制角色都会分配给它。

    Worker节点的定义也类似:

    w1:
     provider: bms
     roles:
       vrouter:
       k8s_node:
     ip: 10.49.230.206
    

    很显然,这里的角色是不同的,因为我们必须安装vRouter,并将节点配置为worker。

    我们省略了第二个worker的定义。

    最后,我们有TF配置部分:

    contrail_configuration:
      CONTRAIL_CONTAINER_TAG: 5.0.3-0.493
      KUBERNETES_CLUSTER_PROJECT: {}
      CONFIG_NODEMGR__DEFAULTS__minimum_diskGB: 2
      DATABASE_NODEMGR__DEFAULTS__minimum_diskGB: 2
      CONFIG_DATABASE_NODEMGR__DEFAULTS__minimum_diskGB: 2
      RABBITMQ_NODE_PORT: 5673
    

    在这里,我们指定了TF容器的具体标签。标签应该与我们要安装的版本相匹配。

    标签可以通过以下方式获取:

    [root@master ~]# curl -u XXX -X GET https://hub.juniper.net/v2/contrail/contrail-analytics-api/tags/list | python -mjson.tool
    Enter host password for user 'JNPR-Customer15':
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   423  100   423    0     0   1082      0 --:--:-- --:--:-- --:--:--  1087
    {
        "name": "contrail/contrail-analytics-api",
        "tags": [
            "5.0.0-0.40-ocata",
            "5.0.0-0.40",
            "5.0.1-0.214-ocata",
            "5.0.1-0.214-queens",
            "5.0.1-0.214-rhel-queens",
            "5.0.1-0.214",
            "5.0.2-0.360-ocata",
            "5.0.2-0.360-queens",
            "5.0.2-0.360-rhel-queens",
            "5.0.2-0.360",
            "5.0.3-0.493-ocata",
            "5.0.3-0.493-queens",
            "5.0.3-0.493-rhel-queens",
            "5.0.3-0.493",
            "5.1.0-0.38-ocata",
            "5.1.0-0.38-queens",
            "5.1.0-0.38-rhel-queens",
            "5.1.0-0.38-rocky",
            "5.1.0-0.38"
        ]
    }
    

    同样,我们需要一个有效的账户。

    当使用Tungsten Fabric时,你还可以简单地获得最新版本:

    contrail_configuration:
      CONTRAIL_VERSION: latest
    

    回到TF配置部分,将最小磁盘尺寸设置为低值,这样我们的小型实验室虚拟机就绰绰有余了。

    现在我们只需运行这三个Ansible命令(记住你是在Ansible部署器的解压文件夹里):

    ansible-playbook -e orchestrator=kubernetes -i inventory/ playbooks/configure_instances.yml
    ansible-playbook -e orchestrator=kubernetes -i inventory/ playbooks/install_k8s.yml
    ansible-playbook -e orchestrator=kubernetes -i inventory/ playbooks/install_contrail.yml
    

    一切都应该是正常的!

    验证

    现在我们可以连接到master,检查一切工作是否符合预期。

    首先我们列出节点:

    [root@master ~]# kubectl get nodes
    NAME      STATUS     ROLES     AGE       VERSION
    master    NotReady   master    9h        v1.9.2
    w1        Ready          9h        v1.9.2
    w2        Ready          9h        v1.9.2
    

    Worker已经准备好了,Master还没有准备好,但这不是问题。

    接下来,我们检查控制容器:

    [root@master ~]# kubectl get pods --all-namespaces
    NAMESPACE     NAME                                    READY     STATUS    RESTARTS   AGE
    kube-system   etcd-master                             1/1       Running   0          9h
    kube-system   kube-apiserver-master                   1/1       Running   0          9h
    kube-system   kube-controller-manager-master          1/1       Running   0          9h
    kube-system   kube-dns-6f4fd4bdf-nwjkt                3/3       Running   0          9h
    kube-system   kube-proxy-fzvt7                        1/1       Running   0          9h
    kube-system   kube-proxy-tt5nr                        1/1       Running   0          9h
    kube-system   kube-proxy-wvmzh                        1/1       Running   0          9h
    kube-system   kube-scheduler-master                   1/1       Running   0          9h
    kube-system   kubernetes-dashboard-846c4ddc5f-6fzdq   1/1       Running   0          9h
    

    所有的容器都在运行!请注意,K8s是我们用来管理容器及其核心功能的东西,让K8s工作的也是容器。它们运行在一个特殊的命名空间里,叫做kube-system。这些容器在主机上运行,只要运行“docker ps”来验证就可以了。

    我们可以在master和worker上运行经典的contrail-status命令:

    [root@master ~]# contrail-status
    

    最后,验证gui是可以通过https://%5Bmaster_ip}:8143打开。默认凭证(如果没有手动设置)是admin/trail23:
    0cde2458-0d66-4f9f-86e9-30225a9aa0a1-image.png
    就这样,已经设置好了……又快又简单。

    现在剩下的就是学习如何使用Kubernetes了。

    (注:原文出现Contrail的地方,本文都以Tungsten Fabric替代,绝大多数情况下两者功能一致。)


    作者:Umberto Manferdini  译者:TF编译组
    原文链接:
    https://iosonounrouter.wordpress.com/2019/05/30/setting-up-a-small-contrailkubernetes-lab-using-ansible-deployer/



Log in to reply