用户对容器编排工具的需求日益增加。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。

 

编译:Jonathan Zhang

作者Saverio Proto

来源:http://superuser.openstack.org/articles/deploy-kubernetes-openstack-ansible/

投稿邮箱:openstackcn@sina.cn