开发人员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)时,输入群集或应用程序的的各种配置参数值。然后由主节点负责解析参数,并把其应用到集群中,生成符合需求的各个容器。

开发人员Kubernetes的实用介绍

工作节点负责提供K8s运行时,进行具体的镜像注册,容器生成,并对各个容器进行监控。所有的应用容器都跑在工作节点。

开发人员Kubernetes的实用介绍

关于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的实用介绍的主要内容,如果未能解决你的问题,请参考以下文章

AndroidGradle最实用的指南

开发人员如何理解kubernetes

为什么开发人员应该学习 Kubernetes?

为什么开发人员应该学习 Kubernetes?

kubernetes系列之开发人员需要了解的

20 个实用的 Angular.js 工具