作者简介:好好先生
kubernetes是容器管理编排引擎,是继openstack之后又一个优秀的云计算系统。kubernetes有着灵活,快速,健壮等特点,同时全面拥抱微服务架构,是当前容器管理方面主流的系统。本文简单总结kubernetes系统的命令行,dashboard和客户端使用方法。通过三种使用方式的操作,给初学者一个直观的认识。
安装方式
kubernetes的安装方式参考:
https://github.com/gjmzj/kubeasz/blob/master/docs/setup/quickStart.md
一、命令行操作
查看系统信息
kubectl version 查看kubernetes版本信息。该版本是1.9.8,最新版本是2018.9.27发布的1.12。
查看kubernetes系统的节点信息。由于我是all in one安装,所以只有一个节点。
创建
启动一个应用。test-two是应用的名字;—image指定了应用的镜像,是一个安装好web应用的镜像;—replicas指定应用副本数。不用担心没有镜像,当docker启动一个不存在的镜像时会去远端请求镜像,kubernetes同样也是。
验证
查看系统中的deployment。可以看到刚刚创建的test-two应用。
查看pod的ip地址,通过ip地址可以检验docker中的应用是否启动。
httpd镜像里安装的是web应用,通过80端口能够访问到应用。
Kubernetes的一个优点是能够保持应用的稳定性,通过维持docker的数量来完成。删除一个副本,可以发现立刻又重新创建了一个。这就是kubernetes保持应用健壮性的关键。
前面使用是命令行参数创建应用,这种方式缺点是参数复杂,不易记忆。更常用的创建方式是使用文件来创建应用。简单比较基于命令行和基于配置文件两种方式的特点:
基于命令的方式:
- 简单,直观,快捷上手快
- 适合临时测试或实验
基于配置文件的方式:
- 配置文件提供了创建资源的模板,能够重复部署
- 配置文件能够像代码一样管理部署
- 适合正式的、跨环境的、规模化部署
使用文件创建deployment
deployment的定义文件。
关键参数:
- kind:表明创建服务的类型,这里是deployment。
- name:应用的名字。
- labels:将创建的pod贴上一个标签。通过标签能够区分不同的pod。
- images:使用的镜像。
- ports:容器监听系统的80端口
使用命令:kubectl creat -f httpd.yaml,成功创建应用。
查看创建好的pod,可以发现新建的两个以httpd-deployment开头的docker。
为了能够从浏览器访问到创建好的应用,这里要再创建一个service。可以简单理解service是访问控制。
service定义文件
- kind:service,表示创建的是一个service。
- name:service 名字。
- type:NodePort service类型的一种,动态分配一个端口用于外部访问。
- app:httpd 指定为拥有app:httpd这个标签的pod创建service。
- port:8080 监听系统的8080端口的请求
- targetPort 将8080端口的请求转发给80端口。因为httpd docker使用80端口,所有能够将请求转发进来。
查看创建好的service,service负责监听主机的36980端口,流量转发给8080,8080再转发给80,这样通过访问node节点的ip+36980端口就能访问到应用。
通过浏览器访问
更多命令行操作参考:
http://docs.kubernetes.org.cn/683.html
二、Dashboard操作
Dashboard是界面操作,登录系统之后的界面如下:
部署的应用
所有的容器
所有的副本
所有的服务
目前系统中没有用户创建的服务,kubernetes是系统自带的服务
创建:
界面创建的过程比较直观,首先右上角创建按钮
创建界面。界面有三种创建方式:可以选择从文本创建、从文件创建、从应用创建。这里使用从文本创建,输入刚刚在命令行时使用的yaml文件。
创建中:
验证:
应用创建完成。
除了部署里显示最新的应用,创建完成之后容器组更新了所有容器状态,
再创建一个service。将service的yaml文件内容输入。
创建好之后可以发现,26896是外部能够访问应用的端口。
浏览器打开,是成功的。
通过dashboard也可以访问docker容器。选择一个容器组进入,点击运行命令。
进入http-deployment-two其中一份副本中,可以直接对docker操作。
三、python客户端2
通过以上两种方式基本上能够满足kubernetes管理,运维的工作,但是如果要对其进一步开发和使用,还需要调用kubernetes的API接口完成相应的工作。
kubernetes的核心组件apiserver,提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。通过apiserver,可以完成对Controller,Pod,Service等服务的增删改查。
目前官方自持的客户端库
使用python客户端需要分为三步:
- 从github下载代码
- 安装python客户端
- 配置访问控制
- 下载客户端代码
- 安装客户端
首先安装pip工具
进入代码文件夹,安装客户端
-
客户端访问权限
客户端想要访问系统,必须要拥有访问权限。可以通过配置文件来完成访问者的权限鉴别。系统中的~/.kube/config,这个文件包含kubernates集群的入口地址,访问的用户和相应的认证信息,使用时,将这个配置文件拷贝到本地,然后客户端通过加载这个配置文件来定位和认证apiserver。 -
创建:
以对deployment的创建,删除为例,简单说明客户端的使用方式。在库文件中的example.py文件中,有对应用的增,删,改。
创建主要代码:
创建一个应用主要完成4步:
- 加载配置文件,找到endpoint和获取权限。
- 创建python客户端api。
- 创建客户端对象。
- 调用客户端对象,完成创建具体请求。
其中,创建deployment的具体参数如镜像、名称、副本、api版本等在第3步中,下面具体查看创建的参数。
deployment的名称
参数:
第一个:docker镜像版本,监听端口。
第二个:应用的副本数。
第三个:api的版本。
python deployment_examples.py执行命令,返回信息。
验证:
查看应用,kubectl-client-demo即创建好的应用。
删除:
删除一共也是4步:
- 加载配置文件,拥有访问endpoint和权限。
- 创建python客户端api。
- 创建客户端端对象。
- 调用客户端对象,完成删除具体请求。
python deployment_example.py执行删除,返回显示信息。
验证:
更多客户端操作参见:
http://docs.kubernetes.org.cn/31.html
总结:
- 图形化操作的优点是简单,直观,同时缺点也很明显,那就是请求数量过大时会造成拥塞或者需要自动化运维的场景无法完成。所以图形化操作适用于日常管理和学习。
- 命令行操作本质是调用Restful api,但相对于调用接口的复杂,命令行优势在于简化了其复杂性,同时也最大程度的保留了接口的全面性。
- 客户端能够完成使用者所希望的所有的操作,无论是直接操作还是被其他程序调用。不同语言都可以调用接口编写自己的客户端程序,极大提高了系统的兼容性。
Kubernetes的三种使用方式,涵盖了日常管理、运维、开发等多个场景。对于管理和运维来说,图形化和命令行就能很好的胜任,对于系统集成或者深度使用,客户端是一个很好的选择。
附 完整客户端使用示例文件deployment_examples.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
from os import path import yaml from kubernetes import client, config DEPLOYMENT_NAME = "kubectl-client-test" def create_deployment_object(): # Configureate Pod template container container = client.V1Container( name="httpd-client", image="httpd", ports=[client.V1ContainerPort(container_port=80)]) # Create and configurate a spec section template = client.V1PodTemplateSpec( metadata=client.V1ObjectMeta(labels={"app": "nginx"}), spec=client.V1PodSpec(containers=[container])) # Create the specification of deployment spec = client.ExtensionsV1beta1DeploymentSpec( replicas=2, template=template) # Instantiate the deployment object deployment = client.ExtensionsV1beta1Deployment( api_version="extensions/v1beta1", kind="Deployment", metadata=client.V1ObjectMeta(name=DEPLOYMENT_NAME), spec=spec) return deployment def create_deployment(api_instance, deployment): # Create deployement api_response = api_instance.create_namespaced_deployment( body=deployment, namespace="default") print("Deployment created. status='%s'" % str(api_response.status)) def update_deployment(api_instance, deployment): # Update container image deployment.spec.template.spec.containers[0].image = "nginx:1.9.1" # Update the deployment api_response = api_instance.patch_namespaced_deployment( name=DEPLOYMENT_NAME, namespace="default", body=deployment) print("Deployment updated. status='%s'" % str(api_response.status)) def delete_deployment(api_instance): # Delete deployment api_response = api_instance.delete_namespaced_deployment( name=DEPLOYMENT_NAME, namespace="default", body=client.V1DeleteOptions( propagation_policy='Foreground', grace_period_seconds=5)) print("Deployment deleted. status='%s'" % str(api_response.status)) def main(): # Configs can be set in Configuration class directly or using helper # utility. If no argument provided, the config will be loaded from # default location. config.load_kube_config() extensions_v1beta1 = client.ExtensionsV1beta1Api() # Create a deployment object with client-python API. The deployment we # created is same as the `nginx-deployment.yaml` in the /examples folder. deployment = create_deployment_object() #create_deployment(extensions_v1beta1, deployment) #update_deployment(extensions_v1beta1, deployment) delete_deployment(extensions_v1beta1) if __name__ == '__main__': main() |