目前,我们建议用户在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。