开发人员Kubernetes的实用介绍
Posted 虫虫搜奇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开发人员Kubernetes的实用介绍相关的知识,希望对你有一定的参考价值。
随着docker容器虚拟技术的广泛使用,对于docker容器集群的管理、自动部署、扩容成了迫切的需要。由谷歌2014年推出的docker容器管理平台Kubernetes(简称k8s,下文同)顺应需求,被大家广泛地采纳,可以说k8s目前的成了容器管理平台的代名词。越来越多的码农和开发人员开始尝试使用k8s kubectl CLI工具。
本文的目的是为开发人员提供k8s常用工具介绍和最佳实践,学会熟练地与 K8s群集交互和操作。
K8s架构简介
尽管做为一个码农与开发人员,你不需要去学会从零开始自己搭建K8s群集。你只需学会熟练的使用已有的环境即可,同样你也不必了解K8s的的底层实现。但是,虫虫还是建议对k8s的架构做下总体的了解,k8s的基础知识也有助于我们解决使用和调试过程中遇到一些问题,所以在此首先简单介绍下k8s架构和相关的基础知识。
K8s是一个管理主节点和若干工作节点组成的体系架构,整个体系由一个主节点(master)和多个计算节点构成,计算节点又叫工人节点(worker)。
主节点为集群提供管理和控制接口(API)。我们可以使用kubectl(CLI)时,输入群集或应用程序的的各种配置参数值。然后由主节点负责解析参数,并把其应用到集群中,生成符合需求的各个容器。
工作节点负责提供K8s运行时,进行具体的镜像注册,容器生成,并对各个容器进行监控。所有的应用容器都跑在工作节点。
关于k8s更详细的体系架构,请参考官方问题,不在详述。
k8s架构中的概念介绍
Pod
Pod运行在工作节点上,由容器和卷构成,同一个Pod里的容器共享网络命名空间,可以使用localhost互相通信。Pod是短暂的,不是持续性实体。
Lable
一个Label命名到到Pod的键/值对,用来传递用户定义的属性。比如,你可能创建了一个"tier"和"app"标签,通过Label(tier=frontend, app=myapp)来标记前端Pod容器,使用Label(tier=backend, app=myapp)标记后台Pod。
Service
Node
是我们常说的工作节点或者计算节点,是具体的一台物理服务器或者虚拟VPS,在k8s中也叫Minion。每个节点有如下功能组件:
Kubelet:是主节点代理。
Kube-proxy:Service使用其将链接路由到Pod。
Docker或Rocket:具体的应用容器。
应用程序生命周期
在k8s集群中,所有应用程序都运行在K8s中Pod上。pod是k8s中的基本的功能单元,每个pod代表一个或多个正在运行的容器组。
pod由以下几种状态:
Pending
Running
Succeeded
Failed
Unknown
K8s通过这些状态来确定容器所处的阶段,并根据状态做进一步的行为(如重启)。状态的信息,需要部署探测器来获得,活性探测器(liveness probe)可用于确定何时应用程序必须由K8s重新启动,而准备就绪探测器(readiness probe)可用于确定容器何时可以提供访问。
使用K8s进行本地开发—skaffold
为了方便k8s的持续开发,谷歌开源了工具skaffold,使得K8s集群的开发更加便捷。Skaffold由一些列工具栈构成,可以实现一键创建、推送并部署应用程序到K8s集群。需要提及的是其他公司也都推出了类似的工具,比如微软的Draft,IBM的 Cloud Container Service。
Skaffold详细功能包括:
检测源代码中的更改并自动构建,推送和部署。
自动更新图像标签,无需手动更改在K8s manifest文件。
一键构建/部署/推送不同的应用程序,非常适合微服务架构。
支持开发和生产环境,只需运行一次manifests,或持续监控其变化。
要详细的Skaffold设置和使用的文档,请查阅其官方文档。
kubectl使用
kubectl是一个k8s的命令行用户管理界面,通过其实现对K8s群集的管理操作。
kubectl使用格式如下所示:
kubectl [command] [TYPE] [NAME] [flags]
其中:
command表示你要执行的操作,例如create创建或delete删除;
TYPE用来指定资源类型,如pod,
NAME用来指定资源的名称, 用户-可以忽略名称,将显示给定类型的所有资源信息。
flags用来指定可选项,比如namespace,如果不使用默认标志。
设定日志
对线上系统故障排查来说,日志必不可少。虽然一般都建议通过集中式日志收集,比如通过ELK栈做日志收集处理。通过kubectl也可以设定日志收集。通过下面步骤可以设定pod的日志:
kubectl logs my-pod-name
如果你想通过滚动方式,持续的查看日志,可以通过以下命令(类似大家都熟悉的tail -f 也是-f选项):
kubectl -f logs my-pod-name
或者,如果你在同一个pod中跑多个容器,执行下面命令:
kubectl -f logs my-pod-name internal-container-name
在运行中的Pod交互式执行命令
在故障排除时候,交互式即时命令执行很有用,可以在启动时候追加-it的选项(和docker容器启动选项一样)。
kubectl exec -it my-pod-name -- /bin/sh
一旦你运行了它,容器会获得控制终端,通过终端就可以执行命令。
回滚部署
异常难免,为了避免业务中断,最快的回复方式就是回滚到上一次部署。在kubectl中,我们使用rollout命令实现回滚。
为了实现Pod和复制集的申明式更新更新。实践中,应用程序部署到K8s集群时,都是通过创建部署而不是pod来实现。实际上,一个简单的部署manifest(XML格式)实例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
运行kubectl apply -f manifest.yml后,会基于nginx 1.7.9的docker镜像创建三个正在运行的pod。
要列出所有的部署,可以使用下面的命令:
kubectl rollout history deployment/DEPLOYMENT-NAME
一旦查到需要回滚的到部署,可以运行以下命令(比如你现在想要回滚到第100个部署):
kubectl rollout undo deployment/DEPLOYMENT_NAME --to-revision=100
如果你想回滚上一个部署,你可以简单地运行:
kubectl rollout undo deployment/DEPLOYMENT_NAME
以上是关于开发人员Kubernetes的实用介绍的主要内容,如果未能解决你的问题,请参考以下文章