Kubernetes
简介
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 | -- |
原理
名词解释
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}