第一部分:創建集群
在Openstack部署Kubernetes集群運行Nginx容器的步驟,其中包括:
- 利用Murano部署Kubernetes集群
- 配置Openstack的安全性使Kubernetes集群可以在Openstack使用
- 下載並配置kubernetes客戶端
- 創建Kubernetes應用程序
- 在Kubernetes上運行應用程序
現在讓我們開始:
利用Murano創建Kubernetes集群
第一步是創建kubernetes集群。有幾種方法都可以做到這一點,但是最簡單的方式是通過部署Mirantis Openstack平台與Murano組件實現。
導入Kubernetes集群應用
第一步在Openstack社區的應用目錄中獲取Kubernetes集群應用,遵循以下步驟:
1、登錄Horizon,進入Applications->Manage->Packages.
2、進入社區應用目錄並且選擇Murano Apps->Kubernetes Cluster獲取Kubernetes集群應用,找到應用包本身的URL:http://storage.apps.openstack.org/apps/com.mirantis.docker.kubernetes.KubernetesCluster.zip.
3、回到Horizon界面,點擊Import Package。
4、在Package Source選擇URL並且添加第二步的URL地址然后點擊下一步:
5、Murano自動開始下載應用所需的鏡像,然后將其標記為為Murano使用;你無需做任何操作只需點擊‘Import’后等待。點擊Project->Images查看下載中的鏡像狀態顯示為‘保存中’:
6、一旦他們完成保存,你可以看到鏡像狀態變為‘Active’:
接下來,我們將部署包Kubernetes master和minions的環境。
在Murnao環境下創建Kubernetes
1、在Horizon界面,選擇Applications->Browse.,你可以在Recent Activity下看到新的應用。
2、為了簡化步驟,點擊Quick Deploy直接進行快速部署。
3、選項默認值,點擊下一步。
4、選擇Debian鏡像點擊創建。
5、自動進入Environment界面,此時應用已經創建但並沒有部署:
6、點擊‘Deploy This Environment’,在此過程中進行一系列操作:創建VMs,網絡,安全組等。你可以在主環境頁面查看日志:
7、當部署完成后,你可以查看狀態變為Ready:
8、那么你從哪里可以訪問集群呢?點擊‘Latest Deployment Log’查看集群分配的IP地址:
現在你可以注意到4個不同的節點:網關-1,kube-1,kube-2和kube-3。點擊Project->Compute->Instances查看這些實例,Kubernetes API運行在Kube-1上。
第二部分:訪問集群
為了訪問在第一部分創建的kubernetes集群,我們先創建Ubuntu VM(如果已經有Ubuntu機器可以忽略)然后進行配置來訪問剛剛部署的Kubernetes API。
創建客戶端VM
1. 點擊Project->Compute->Intances->Launch Instance創建新的VM:
2. 你無須擔心獲取鏡像,因為你已經有了Ubuntu Kubernetes鏡像作為Murano應用的一部分下載完成了。點擊‘+’選擇。(你也可以選擇其他的發行版)。
3. 你需要為Ubuntu鏡像選擇足夠大的雲主機類型,所以至少選擇m1.small雲主機類型:
4. 網絡可以選擇集群已有的網絡,但是沒有關系,我們都是利用浮動IP,只要確保它在網絡上。
5. 接下來確保你有密鑰對,因為我們需要它來登錄機器:
6. 創建完成
7. 點擊實例的下拉按鈕選擇綁定浮動IP,如果沒有分配的浮動IP地址,點擊‘+’分配一個新的浮動IP地址:
8. 選擇合適的網絡並且點擊分配IP:
9. 將浮動IP綁定到VM上:
10. 你將看到實例上列出的新的浮動IP
11. 在登錄之前,需要確保安全組允許SSH訪問,點擊Project->Compute->Access & Security選擇默認安全組的管理規則菜單:
12. 點擊+添加規則:
13. 在Rule向導中選擇SSH並點擊Add:
14. 在管理規則頁面會看到添加的新的規則:
15. 現在使用SSH客戶端通過設定的用戶名和私鑰訪問創建的VM
現在你可以在集群中部署容器了。
第三部分:運行應用
在第二部分,你已經創建的集群,那么最后你可以准備與Kubernetes API實現交互,一般過程如下:
- 為訪問你的應用定義安全的身份認證
- 在集群中部署容器化應用
- 將應用暴露到外部環境提供訪問
現在讓我們來看看是如何操作。
為你的Kubernetes應用定義安全參數
你需要了解的第一件事是,我們有一組機器與Kubernetes API綁在一起,它可以支持多種環境,每個都有自己的安全憑證。
例如,如果你要創建依賴於特定認證授權的應用程序,我也可以創建依賴於另一個認證授權的應用,我們可以各自控制自己的應用,但是不能看到對方的應用。
1.首先我們需要創建一個新的認證憑證用來簽發其他的證書。采用以下命令創建:
$ sudo openssl genrsa -out ca-key.pem 2048 $ sudo openssl req -x509 -new -nodes -key ca-key.pem -days 10000 \ -out ca.pem -subj "/CN=kube-ca"
2. 這時你應該有兩個文件:ca-key.pem和ca.pem,你可以用他們來創建集群管理員密鑰對。為此,你將創建私鑰(admin-key.pem),之后創建一個認證簽名請求(admin.csr),然后簽名以創建公鑰(admin.pem)。
$ sudo openssl genrsa -out admin-key.pem 2048 $ sudo openssl req -new -key admin-key.pem -out admin.csr -subj "/CN=kube-admin" $ sudo openssl x509 -req -in admin.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial \ -out admin.pem -days 365
現在你有了這些文件,就可以利用他們來配置kubernetes客戶端。
下載並配置Kubernetes客戶端
1. 在機器上開始下載kubectl客戶端,此場景我們采用Linux,根據你的OS選擇合適的方式。
$ curl -O \ https://storage.googleapis.com/kubernetes-release/release/v1.4.3/bin/linux/amd64/kubectl
2. 設置kubectl為可執行:
$ chmod +x kubectl
3. 將它移到本地目錄:
$ sudo mv kubectl /usr/local/bin/kubectl
4. 現在開始設置默認集群,你需要使用從環境部署的日志中獲取的URL,此外確保你提供ca.pem文件的絕對路徑。
$ kubectl config set-cluster default-cluster --server=[KUBERNETES_API_URL] \ --certificate-authority=[FULL-PATH-TO]/ca.pem
5. 接下來你需要告知kubectl如何找到認證:
$ kubectl config set-credentials default-admin \ --certificate-authority=[FULL-PATH-TO]/ca.pem \ --client-key=[FULL-PATH-TO]/admin-key.pem \ --client-certificate=[FULL-PATH-TO]/admin.pem
6. 現在你需要設置環境讓kubectl知道去使用這些認證:
$ kubectl config set-context default-system --cluster=default-cluster --user=default-admin $ kubectl config use-context default-system
7. 現在你應該能夠看見集群信息:
$ kubectl cluster-info Kubernetes master is running at http://172.18.237.137:8080 To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
在kubernetes上運行應用
在kubernetes上運行應用十分簡單,涉及容器的啟動。我們之后會做詳細介紹。
1.開始創建Nginx web server的部署:
$ kubectl run my-nginx --image=nginx --replicas=2 --port=80
deployment "my-nginx" created
2. 默認容器只有集群的成員可見,為了將服務暴露給外部網絡,運行以下命令:
$ kubectl expose deployment my-nginx --target-port=80 --type=NodePort
service "my-nginx" exposed
3. 我們使用了NodePort類型,這意味着外部IP是正在運行的節點IP,你可以查看是否獲取了服務列表:
$kubectl get services NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 11.1.0.1 <none> 443/TCP 3d my-nginx 11.1.116.61 <nodes> 80/TCP 18s
4. 這里引用的節點是kube-2和kube-3(Kube-1是API服務器),我們可以從實例頁面獲取它們的IP地址:
5. 但是服務列表中並沒有告訴我們實際的端口數,為了獲取實際端口數,可以運行以下命令:
$ kubectl describe services my-nginx
Name: my-nginx Namespace: default Labels: run=my-nginx Selector: run=my-nginx Type: NodePort IP: 11.1.116.61 Port: <unset> 80/TCP NodePort: <unset> 32386/TCP Endpoints: 10.200.41.2:80,10.200.9.2:80 Session Affinity: None No events.
6. 這樣服務在端口32386可用,但是如果你嘗試訪問它會發現失敗:
$ curl http://172.18.237.138:32386 curl: (7) Failed to connect to 172.18.237.138 port 32386: Connection timed out
7. 默認情況下會出現上述問題,因為這個端口被默認的安全組關閉,為了解決這個問題,需要創建新的安全組適用於kubernetes節點,點擊Project->Compute->Access& Security->+Create Security Group。
8. 定義組名稱點擊‘創建安全組’。
9. 點擊步驟8創建的安全組的‘管理規則’:
10. 點擊‘+Add Rule’:
11. 此例中我們自定義TCP規則運行在端口32386(或者kubernetes在NodePort中分配的端口)的入口流量,你可以定義僅從特定的IP地址訪問,點擊‘Add’完成規則的添加。
12. 現在你可以將上述步驟設定的安全組添加到kubernetes集群中作為工作節點的實例中(kube-2和kube-3節點),點擊每個實例行末的小三角選擇‘編輯安全組’。
13. 在左邊面板可以看到之前創建新的安全組;點擊‘+’將它添加到實例中:
14. 點擊‘保存’。
15. 為集群的所有工作節點添加安全組。
$ curl http://172.18.237.138:32386
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
16. 現在你可以重新嘗試訪問。
正如圖所示,現在你可以訪問部署在Kubernetes集群的Nginx容器。