您当前的位置是:  首页 > 新闻 > 国内 >
 首页 > 新闻 > 国内 >

用Ansible在Openstack上部署Kubernetes

2017-08-15 10:27:38   作者:Jonathan Zhang   来源:开源云中文社区   评论:0  点击:


  用户对容器编排工具的需求日益增加。Kubernetes目前备受关注,经常有人问会不会在SWITCH(运营瑞士学术网络的基金会)提供一个Kubernetes集群。
  目前,我们建议用户在SWITCHENGINE之上部署自己的Kubernetes集群。为了确保我们的Openstack部署适用于此解决方案,我们也试了一下。
  在使用kubeadm手动部署以学习该工具之后,笔者发现了一个由Francois Deppierraz撰写的很棒的可编辑的playbook(https://github.com/infraly/k8s-on-openstack)。我扩展了此playbook,使Kubernetes知道SWITCHENGINE实施了LBaaSv2,该补丁已经被合并在原始版本中。
  笔者发现部署Kubernetes的第一个问题是完全不支持IPv6。由于SWITCHENGINE中的实例默认获取IPv6地址,所以在运行该playbook时碰到了问题。你该做的第一件事是用路由器创建自己的租户网络,只连接IPv4。这已经在我们的标准文档中详细解释了。
  现在准备好克隆Ansible playbook:
  • git clone https://github.com/infraly/k8s-on-openstack
  Ansible playbook通过Openstack API创建实例,所以你必须提供Openstack配置文件。我们把常见的配置文件做了一些扩展,其中包含更多特定于此ansible playbook的变量。下面是一个模板:
  • export OS_USERNAME=username
  • export OS_PASSWORD=mypassword
  • export OS_PROJECT_NAME=myproject
  • export OS_PROJECT_ID=myproject_uuid
  • export OS_AUTH_URL=https://keystone.cloud.switch.ch:5000/v2.0
  • export OS_REGION_NAME=ZH
  • export KEY=keyname
  • export IMAGE="Ubuntu Xenial 16.04 (SWITCHengines)"
  • export NETWORK=k8s
  • export SUBNET_UUID=subnet_uuid
  • export FLOATING_IP_NETWORK_UUID=network_uuid
  让我们回顾一下有什么变化。添加变量OS_PROJECT_ID也很重要,因为创建负载均衡器的Kubernetes代码需要此值,并且无法从项目名称中提取它。要找到uuid只需要使用Openstack cli:
  openstack project show myprojectname -f value -c id
  KEY是将用于启动实例的现有密钥对的名称。 IMAGE也是自我说明的,目前我只测试了Xenial。变量NETWORK是你之前创建的租户网络的名称。创建网络时,你还创建了一个子网,你需要将uuid设置为SUBNET_UUID。最后一个变量是FLOATING_IP_NETWORK_UUID,它告诉kubernetes网络哪里可以获取浮动IP。在SWITCHengines这个网络总是被称为public,所以你可以这样获得uuid:
  openstack network show public -f value -c id
  你可以进一步自定义配置——阅读git存储库中的README文件,你会发现更多选项,如要使用的风格或集群大小。当配置文件准备就绪时,你可以运行该playbook:
  • source / path / to / config_file
  • cd k8s-on-openstack
  • ansible-playbook site.yaml
  完成所有任务需要几分钟的时间。当一切都完成后,你可以将ssh插入到kubernetes主实例中,并检查一切是否按预期运行:
  • ubuntu@k8s-master:~$ kubectl get nodes
  • NAME         STATUS    AGE       VERSION
  • k8s-1        Ready     2d        v1.6.2
  • k8s-2        Ready     2d        v1.6.2
  • k8s-3        Ready     2d        v1.6.2
  • k8s-master   Ready     2d        v1.6.2
  笔者发现添加bash完成对kubectl非常有用:
  • source <(kubectl completion bash)
  部署一个nignx实例来测试一切是否正常:
  • kubectl run my-nginx --image=nginx --replicas=2 --port=80
  这将用nginx创建两个容器。你可以使用以下命令监视进度:
  • kubectl get pods
  • kubectl get events
  在这个阶段,容器在运行,但仍然无法从外部访问服务。一个办法是使用Openstack LBaaS来公开它,你可以使用这个命令:
  • kubectl expose deployment my-nginx --port=80 --type=LoadBalancer
  公开命令将创建Openstack负载均衡器,并将其配置。要知道公共浮动ip地址,你可以使用此命令来描述该服务:
  • ubuntu@k8s-master:~$ kubectl describe service my-nginx
  • Name:my-nginx
  • Namespace:default
  • Labels:run=my-nginx
  Annotations:
  • Selector:run=my-nginx
  • Type:LoadBalancer
  • IP:10.109.12.171
  • LoadBalancer Ingress:10.8.10.15, 86.119.34.151
  • Port:80/TCP
  • NodePort:30620/TCP
  • Endpoints:10.40.0.1:80,10.43.0.1:80
  • Session Affinity:None
  Events:
  • FirstSeenLastSeenCountFromSubObjectPathTypeReasonMessage
  • ------------------------------------------------------------
  • 1m1m1service-controllerNormalCreatingLoadBalancerCreating load balancer
  • 10s10s1service-controllerNormalCreatedLoadBalancerCreated load balancer
  结论
  有了这篇博文,你应该能够在OpenStack上部署Kubernetes来了解整个过程。对于真正的部署,你可能需要进行一些定制化。你可以使用github pull请求将补丁共享到ansible playbook。
  请注意,Kubernetes不是没有bug。当删除部署时,你可能会发现Kubernetes无法正确删除负载均衡器的bug。
【免责声明】本文仅代表作者本人观点,与CTI论坛无关。CTI论坛对文中陈述、观点判断保持中立,不对所包含内容的准确性、可靠性或完整性提供任何明示或暗示的保证。请读者仅作参考,并请自行承担全部责任。

专题