当前位置: 首页 > 科技观察

使用Ansible的Kubernetes模块自动化容器编排

时间:2023-03-18 01:09:34 科技观察

将Kubernetes与Ansible结合起来实现云自动化。另外,请查看我们的Ansiblek8s模块备忘单。Ansible是一个出色的自动化工作工具,而Kubernetes是一个强大的容器编排工具。如果把两者结合起来,会是什么效果呢?你可能猜到了,Ansible+Kubernetes确实可以实现容器编排的自动化。Ansible模块Ansible本身实际上只是一个解释YAML文件的框架。它真正的强大在于其丰富的模块。所谓模块modules就是一些工具,可以让你在Ansible脚本playbook中通过简单的配置来调用外部应用程序。Ansible中有可以直接操作Kubernetes的模块,也有实现对一些相关组件(如Docker、Podman)操作的模块。学习使用新模块的过程与学习新的终端命令和API的过程相同。你可以先从文档中了解到这个模块在调用时需要接受哪些参数,以及这些参数在外部应用中的具体作用。访问Kubernetes集群在使用AnsibleKubernetes模块之前,您必须首先具有访问Kubernetes集群的权限。如果您没有权限,可以尝试使用短期在线试用帐户,但我们建议根据Kubernetes官网的指南安装Minikube,或者参考BrayntSon《入门 Kubernetes》的教程。Minikube为单节点Kubernetes实例提供安装过程,您可以像完整集群一样对其进行配置和交互。下载Ansiblek8s速记表(需要注册)在安装Minikube之前,需要确保你的环境支持虚拟化并安装libvirt,然后授权libvirt用户组:$sudodnfinstalllibvirt$sudosystemctlstartlibvirtd$sudousermod--append--groupslibvirt`whoami`$newgrplibvirtinstallPythonmodules为了在Ansible中使用Kubernetes相关模块,您需要安装以下Python模块:$pip3.6installkubernetes--user$pip3.6installopenshift--用户启动Kubernetes如果您使用Minikube而不是完整的Kubernetes集群,请使用minikube命令在本地创建一个最小的Kubernetes实例:$minikubestart--driver=kvm2--kvm-networkdefault并等待Minikube完成初始化,这个过程所需的时间会根据实际情况而有所不同。获取集群信息集群启动后,可以通过cluster-info选项获取集群相关信息:$kubectlcluster-infoKubernetesmasterisrunningathttps://192.168.39.190:8443KubeDNSisrunningathttps://192.168。39.190:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy要进一步调试和诊断集群问题,请使用“kubectlcluster-infodump”。使用k8s模块Ansible使用k8s模块实现Kubernetes操作,在脚本中使用k8s模块管理Kuvernetes对象。该模块描述了kubectl命令的最终状态。例如,对于以下使用kubectl创建新命名空间的操作:$kubectlcreatenamespacemy-namespace这是一个非常简单的操作,这个操作的最终状态由YAML文件定义,描述如下:-hosts:localhosttasks:-name:createnamespacek8s:name:my-namespaceapi_version:v1kind:Namespacestate:present如果你使用的是Minikube,那么主机名(hosts)应该定义为localhost。请务必注意,所使用的模块还定义了可用参数的语法(例如api_version和kind参数)。在运行这个playbook之前,通过yamllint命令验证没有错误:$yamllintexample.yaml确保没有错误之后,运行脚本:$ansible-playbook./example.yaml来验证新的命名空间是否已经生效created:$kubectlgetnamespacesNAMESTATUSAGEdefaultActive37hkube-node-leaseActive37hkube-publicActive37hkube-systemActive37hdemoActive11hmy-namespaceActive3s使用Podman拉取容器镜像容器是Linux系统,几乎是最小的,可以由Kubernetes管理。LXC项目和Docker定义了大部分容器规范。容器工具集的最新成员是Podman,它因其无需守护进程即可运行的能力而受到许多用户的欢迎。Podman可以从DockerHub或Quay.io等存储库中拉取容器镜像。这个操作对应的Ansible语法也很简单,只需要在脚本的相应位置写上仓库网站提供的镜像路径即可:-name:pullanimagepodman_image:name:quay.io/jitesoft/nginx使用yamllint验证:$yamllintexample.yaml运行playbook:$ansible-playbook./example.yaml[WARNING]:提供的主机列表为空,只有localhost可用。请注意,隐式localhost不匹配'all'PLAY[localhost]************************任务[收集事实]************************ok:[localhost]TASK[createk8snamespace]*************************ok:[localhost]TASK[pullanimage]*************************已更改:[localhost]PLAYRECAP*************************localhost:ok=3changed=1unreachable=0failed=0skipped=0rescued=0ignored=0使用Ansible部署Ansible除了执行小的维护任务外,其他kubectl实现也可以通过脚本功能,因为只有两者的YAML文件之间存在一些差异。Kubernetes中使用的YAML文件只需稍作改动即可用于Ansible剧本。例如,以下用于使用kubectl命令部署Web服务器的YAML文件:apiVersion:apps/v1kind:Deploymentmetadata:name:my-webserverspec:selector:matchLabels:run:my-webserverreplicas:1template:metadata:labels:run:my-webserverspec:containers:-name:my-webserverimage:nginxports:-containerPort:80如果熟悉参数,只需要将YAML文件中的大部分内容放到定义部分脚本,你可以在Ansible中使用:-name:deployawebserverk8s:api_version:v1namespace:my-namespacedefinition:kind:Deploymentmetadata:labels:app:nginxname:nginx-deployspec:replicas:1selector:matchLabels:app:nginxtemplate:metadata:labels:app:nginxspec:containers:-name:my-webserverimage:quay.io/jitesoft/nginxports:-containerPort:80protocol:TCP执行完成后,使用kubectl命令以查看部署中的预期部署:$kubectl-nmy-namespacegetpodsNAM乙READYSTATUSnginx-deploy-7fdc9-t9wc21/1Running在云端使用模块随着越来越多的开发和部署工作迁移到云端的趋势,我们必须了解如何在云端进行自动化。其中,k8s和podman_image这两个模块只是云开发的一小部分。您可以在您的工作流程中寻找一些需要自动化的任务,并学习如何使用Ansible让您事半功倍。