目前,我們建議用戶在SWITCHENGINE之上部署自己的Kubernetes集群。為了確保我們的Openstack部署適用于此解決方案,我們也試了一下。
在使用kubeadm手動(dòng)部署以學(xué)習(xí)該工具之后,筆者發(fā)現(xiàn)了一個(gè)由Francois Deppierraz撰寫(xiě)的很棒的可編輯的playbook(https://github.com/infraly/k8s-on-openstack)。我擴(kuò)展了此playbook,使Kubernetes知道SWITCHENGINE實(shí)施了LBaaSv2,該補(bǔ)丁已經(jīng)被合并在原始版本中。
筆者發(fā)現(xiàn)部署Kubernetes的第一個(gè)問(wèn)題是完全不支持IPv6。由于SWITCHENGINE中的實(shí)例默認(rèn)獲取IPv6地址,所以在運(yùn)行該playbook時(shí)碰到了問(wèn)題。你該做的第一件事是用路由器創(chuàng)建自己的租戶網(wǎng)絡(luò),只連接IPv4。這已經(jīng)在我們的標(biāo)準(zhǔn)文檔中詳細(xì)解釋了。
現(xiàn)在準(zhǔn)備好克隆Ansible playbook:
- git clone https://github.com/infraly/k8s-on-openstack
Ansible playbook通過(guò)Openstack API創(chuàng)建實(shí)例,所以你必須提供Openstack配置文件。我們把常見(jiàn)的配置文件做了一些擴(kuò)展,其中包含更多特定于此ansible playbook的變量。下面是一個(gè)模板:
- 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也很重要,因?yàn)閯?chuàng)建負(fù)載均衡器的Kubernetes代碼需要此值,并且無(wú)法從項(xiàng)目名稱中提取它。要找到uuid只需要使用Openstack cli:
openstack project show myprojectname -f value -c id
KEY是將用于啟動(dòng)實(shí)例的現(xiàn)有密鑰對(duì)的名稱。 IMAGE也是自我說(shuō)明的,目前我只測(cè)試了Xenial。變量NETWORK是你之前創(chuàng)建的租戶網(wǎng)絡(luò)的名稱。創(chuàng)建網(wǎng)絡(luò)時(shí),你還創(chuàng)建了一個(gè)子網(wǎng),你需要將uuid設(shè)置為SUBNET_UUID。最后一個(gè)變量是FLOATING_IP_NETWORK_UUID,它告訴kubernetes網(wǎng)絡(luò)哪里可以獲取浮動(dòng)IP。在SWITCHengines這個(gè)網(wǎng)絡(luò)總是被稱為public,所以你可以這樣獲得uuid:
openstack network show public -f value -c id
你可以進(jìn)一步自定義配置——閱讀git存儲(chǔ)庫(kù)中的README文件,你會(huì)發(fā)現(xiàn)更多選項(xiàng),如要使用的風(fēng)格或集群大小。當(dāng)配置文件準(zhǔn)備就緒時(shí),你可以運(yùn)行該playbook:
- source / path / to / config_file
- cd k8s-on-openstack
- ansible-playbook site.yaml
完成所有任務(wù)需要幾分鐘的時(shí)間。當(dāng)一切都完成后,你可以將ssh插入到kubernetes主實(shí)例中,并檢查一切是否按預(yù)期運(yùn)行:
- 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
筆者發(fā)現(xiàn)添加bash完成對(duì)kubectl非常有用:
- source <(kubectl completion bash)
部署一個(gè)nignx實(shí)例來(lái)測(cè)試一切是否正常:
- kubectl run my-nginx --image=nginx --replicas=2 --port=80
這將用nginx創(chuàng)建兩個(gè)容器。你可以使用以下命令監(jiān)視進(jìn)度:
- kubectl get pods
- kubectl get events
在這個(gè)階段,容器在運(yùn)行,但仍然無(wú)法從外部訪問(wèn)服務(wù)。一個(gè)辦法是使用Openstack LBaaS來(lái)公開(kāi)它,你可以使用這個(gè)命令:
- kubectl expose deployment my-nginx --port=80 --type=LoadBalancer
公開(kāi)命令將創(chuàng)建Openstack負(fù)載均衡器,并將其配置。要知道公共浮動(dòng)ip地址,你可以使用此命令來(lái)描述該服務(wù):
- 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
結(jié)論
有了這篇博文,你應(yīng)該能夠在OpenStack上部署Kubernetes來(lái)了解整個(gè)過(guò)程。對(duì)于真正的部署,你可能需要進(jìn)行一些定制化。你可以使用github pull請(qǐng)求將補(bǔ)丁共享到ansible playbook。
請(qǐng)注意,Kubernetes不是沒(méi)有bug。當(dāng)刪除部署時(shí),你可能會(huì)發(fā)現(xiàn)Kubernetes無(wú)法正確刪除負(fù)載均衡器的bug。