Kubernetes

来自智得网
跳转至: 导航、​ 搜索

简介

K8S整体架构图

Kubernetes因为在英文名称首字母k和尾字母s中间一共有8个字符,而简称为k8s,k8s最早源自google公司内部的borg项目。

k8s是一种容器编排技术,主要解决下列问题:

  • 自动上线和回滚

k8s有完善的部署方案,可以对应用/配置进行分批上线,而确保不会同时终止所有的实例。在应用出现问题的时候,可以回滚到指定版本。

  • 服务发现与负载均衡

k8s为容器提供了单独的IP地址(IPv4和IPv6双协议栈)以及DNS名称,可以实现负载均衡。

  • 存储编排

k8s支持NFS、Ceph等文件系统以及AWS等公有云存储设施,可以实现自动挂载。

  • Secret和配置管理

k8s支持隐私配置。

  • 自动装箱

根据资源需求或者其他约束条件,自动调节容器数量,实现水平扩缩容,更好的提高资源利用率。

  • 批量执行

k8s可以管理批处理和CI工作负载,自动替换失效的容器,可以进行自我修复。

编排工具对比

Kubernetes Swarm Mesos ECS
基本功能 容器集群功能,提供应用的部署,维护以及水平扩缩容 Docker原生的集群管理工具 基于数据中心的操作系统 基于云的高可用,高扩展容器集群
高层次抽象 Pod Job Service Task Service
应用扩展性 支持 框架支持 支持
高可用性 支持 框架支持 支持
服务发现 etcd etcd Zookeeper Consul Zookeeper /
调度策略 内置 内置,可扩展 两级别,可扩展 可扩展
监控 Heapter, ELK Addon Logging Driver 内置 CloudWatch
管理界面 CLI api ui CLI api UCP ui API ui ALIapi AWS console
开发语言 Go Go Java --
开源
节点能力 官方1000 非官方2000 官方1000 非官方5000 10000 --

原理

Large-scale cluster management at Google with Borg

名词解释

Pod

pod是最小的调度单元,pod里面会包含若干个容器。

Deployment

Deployment是pod的管理和控制单元,会通过自动扩缩容控制pod集群的数量。

Ingress

Ingress管控pod的网络。

Namespace

通过namespace的命名空间可以把k8s集群分成若干个资源不共享的虚拟集群。

节点类型

K8S 集群将节点分为两类,Master节点和Worker节点。

Master节点的组件如下:

  • API Server,K8S的请求的入口服务。API Server负责接收来自客户端或者CLI命令行的所有请求,API Server根据用户的请求类型,会路由给其他组件,通知其他组件执行具体操作。
  • Scheduler,K8S的调度器。当需要部署服务时,Scheduler会选择合适的Worker Node(服务器)进行部署。
  • Controller Manager,K8S的监控器。Controller Manager有一系列的Controller,例如Node Controller、Service Controller、Volume Controller等。Controller负责监控和调整在Worker Node上部署的服务的状态,例如集群中的副本数量因为宕机等问题少于要求的数量,controller会执行部署达到配置的数量。
  • etcd,K8S的存储服务。etcd存储了K8S的关键配置和用户配置,K8S中仅API Server才具备读写权限,其他组件通过API Server的接口才能读写数据。

Workder节点的组件如下:

  • Kubelet,负责对Worker Node的监视以及和Master Node的通讯职责。Kubelet会定期收集Worker Node的服务状态等信息,并定期向Master Node汇报,同时接受来自Master Node的指示采取调整措施。
  • Kube-Proxy,K8S的网络代理。Kube-Proxy负责Node在K8S的网络通讯、以及对外部网络流量的负载均衡。
  • Container Runtime,Worker Node的运行环境,比如Docker Engine。通过Container Runtime的软件环境才能让容器化程序运行。
  • Logging Layer,K8S的监控状态收集器。Logging Layer负责采集Node上所有服务的CPU、内存、磁盘、网络等监控项信息。
  • Add-Ons,K8S管理运维Worker Node的插件组件。

网络通信

K8S的网络通信可以大致分为四层,自顶而下依次是:

  • 外部接入网络,提供外部流量接入的能力,NodePort/LoadBalance/Ingress
  • service网络,用于提供服务发现和负载均衡的能力。
  • pod网络,提供pod虚拟机互联互通。
  • node节点网络,提供节点主机互联互通。

K8S的网络通信可以分为同pod的通信,以及同node跨pod的通信,跨node的通信。

因为每个pod都有自己的虚拟网卡,可以支持pod内容器互相连通。内部容器可以通过localhost相互访问。

同一个node上不同的pod在同一个网桥docker0里,所以可以相互连通。

跨节点pod的通信基于1.1之后开始采用的全新 CNI(Container Network Interface) 网络标准。

实现一个 CNI 网络插件只需要一个配置文件和一个可执行文件:

配置文件描述插件的版本、名称、描述等基本信息;

可执行文件会被上层的容器管理平台调用,一个 CNI 可执行文件需要实现将容器加入到网络的 ADD 操作以及将容器从网络中删除的 DEL 操作(以及一个可选的 VERSION 查看版本操作);

Kubernetes 使用 CNI 网络插件的基本工作流程:

kubelet 先创建 pause 容器创建对应的网络命名空间;

根据配置调用具体的 CNI 插件,可以配置成 CNI 插件链来进行链式调用;

当 CNI 插件被调用时,它根据环境变量以及命令行参数来获得网络命名空间、容器的网络设备等必要信息,然后执行 ADD 操作;

CNI 插件给 pause 容器配置正确的网络,pod 中其他的容器都是复用 pause 容器的网络;

CNI 插件通常有三种实现:Overlay、路由及 Underlay。

使用

常用指令

# 查看所有pods
kubectl get pods --all-namespaces

# 查看gmp的pods
kubectl get pods -n gmp

# 查看实际依赖的yaml信息,也可以通过describe指令查询
kubectl get pods -n gmp gmp-fe-7f7b68b787-lhz44 -o yaml

# 拉到最后看Events,可以看到pod为什么被拉起失败
# 常见错误:镜像地址前缀没有替换为dockerhub.vpc.com:5000
kubectl describe pods -n gmp gmp-fe-7f7b68b787-lhz44

# 查看带网络信息的pod状态
kubectl get pods -n gmp gmp-fe-7f7b68b787-lhz44 -o wide

# 单个pod查日志
kubectl logs -n gmp gmp-fe-7f7b68b787-lhz44

# 多个pod一起查日志
kubectl logs --all-containers=true -f --tail=20 -n gmp -lapp=gmp-data-analysis

# 多个pod日志查询
# 不要用 kubectl logs deployment/<app-name> --all-containers=true -n <namespace>
kubectl logs -ngmp --tail=-1 -lapp=<app-name> 

# 查gmp所有服务的日志(2.12以后)
kubectl logs -ngmp --tail=-1 -lprod=gmp

# 重启pod,如果pod不存在,会新建
kubectl apply -f ve-gmp-backend.yaml

# 没有yaml的情况下,先配置为0,然后再配置为1,实现重启
kubectl scale deployment {deployment} --replicas=0 -n {namespace}
kubectl scale deployment {deployment} --replicas=1 -n {namespace}

# 删除pod,由于Deployment还存在,所以删掉之后过一会pod又会被创建
# 如果Deployment被删除,下面的pod也会被彻底删掉
kubectl delete pod gmp-frontier-minimal-59c7ccdd98-tq4rc

# 进入pod,进行调试
kubectl exec -it -n gmp gmp-frontier-minimal-6994b59f5-57mrt /bin/bash

# global配置(原ve-gmp-global-conf.yaml)
kubectl describe cm -ngmp base-conf

# 服务配置
kubectl describe cm -ngmp ${服务名}

# k8s deployment 配置
kubectl describe deployment -ngmp ${服务名}

# 服务发现
sd lookup {psm}
# 查看所有注册的psm
curl "http://localhost:2280/v1/catalog/services?pretty"
# 也可以按pattern直接搜素
sd search {psm_pattern}

# 常用场景
# 找环境mysql写节点(第一个是主节点)
sd lookup vpc.mysql.gmpdb_write
# 查看redis部署节点
sd lookup redis
# 查找rocketmq相关服务
sd search rocketmq

注册服务
sd -h {host} up {psm} {port}

注销服务
sd -h {host} down {psm} {port}