第一部分:创建集群
在部署集群运行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上。
第二部分:访问集群
为了访问在第一部分创建的集群,我们先创建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-infoKubernetes 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 servicesNAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 11.1.0.1443/TCP 3d my-nginx 11.1.116.61 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:80/TCP NodePort: 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:32386curl: (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
Welcome to nginx! Welcome to nginx!
If you see this page, the nginx web server is successfully installed and working. Further configuration is required.
For online documentation and support please refer to nginx.org.
Commercial support is available at nginx.com.Thank you for using nginx.
16. 现在你可以重新尝试访问。
正如图所示,现在你可以访问部署在Kubernetes集群的Nginx容器。