k8sKubernetes全栈技术体系介绍
Posted Cry丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了k8sKubernetes全栈技术体系介绍相关的知识,希望对你有一定的参考价值。
本文将从以下6个方面介绍Kubernetes的全栈体系:
1.Kubernetes架构
2.Kubernetes工作负载
3.Kubernetes网络
4.Kubernetes存储
5.Kubernetes运维
6.DevOps
Kubernetes起源
Kubernetes项目来源于谷歌内部的Borg,Borg是集群的管理器,在它的系统中,运行着众多集群,而每个集群可由成千上万的服务器联接组成,Borg每时每刻都在处理来自众多应用程序所提交的成百上千的Job, 对这些Job进行接收、调度、启动、停止、重启和监控。
Kubernetes于2015年7月22日迭代到 v 1.0并正式对外公布,谷歌联合Linux基金会及其他合作伙伴共同成立了CNCF基金会( Cloud Native Computing Foundation),并将Kuberentes 作为首个编入CNCF管理体系的开源项目,助力容器技术生态的发展进步。
Kubernetes项目凝结了Google过去十年间在生产环境的经验和教训,从Borg的多任务Alloc资源块到Kubernetes的多副本Pod,从Borg的Cell集群管理,到Kubernetes设计理念中的联邦集群,在Docker等高级引擎带动容器技术兴起和大众化的同时,为容器集群管理提供独了到见解和新思路。
Docker
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
几个概念:
- 镜像(Image):可以看做是应用的模板,包含了应用依赖的环境和配置
- 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和对象一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
- 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
docker有兴趣的可以详看我的这篇博客:
Kubernetes的特点和特性
谷歌开发的容器集群管理系统。它是基于Docker的容器化技术的,它在Docker技术的基础上,为容器化的应用提供部署运行、资源调度、服务发现和动态伸缩等一些列完整功能,提高了大规模容器集群管理的便捷性。
下面开始进入正题:
1.Kubernetes的架构
1.1 Kubernetes节点
Master Node
集群的网关和中枢枢纽,主要作用:暴露API接口,跟踪其他服务器的健康状态、以最优方式调度负载,以及编排其他组件之间的通信。
Worker Node
Kubernetes的工作节点,负责接收来自Master的工作指令,并根据指令相应地创建和销毁Pod对象,以及调整网络规则进行合理路由和流量转发。生产环境中,Node节点可以有N个。
1.2 Kubernetes组件
1.3 Kubernetes资源
2.Kubernetes工作负载
2.1 Pod
Pod介绍
Kubernetes中最小的调度单位,代表着集群中运行的进程(应用实例)。
一个Pod可以包含多个容器,但通常情况下我们在每个pod中仅使用一个容器。
Pod中可以共享两种资源:网络和存储。
Pod和Controller
Controller 可以创建和管理多个 Pod,提供副本管理、滚动升级
和集群级别的自愈能力。
两者通过label-selector进行关联。
Pod生命周期
重试策略(restartPolicy):Always、OnFailure、Never
Controller
3.Kubernetes网络
3.1 IP和Port
3.2 内部访问
SVC
通过Label关联Pod
服务发现方式:
- 环境变量
export mysql_SERVICE_HOST='xx.xxx.x.xxx'
export MYSQL_SERVICE_PORT='3306'
export MYSQL_SERVICE_PORT_MYSQL='3306'
export MYSQL_USER=''
export MYSQL_VERSION='5.7.14-1debian8'
- DNS
组件:CoreDNS
同namespace访问:svc_name
跨namespace访问:svc_name.namespace_name.svc
[root@test-209 log]# netstat -anp | grep kube-proxy
tcp6 0 0 :::30010 :::* LISTEN 10165/kube-proxy
unix 2 [ ] DGRAM 36395 10165/kube-proxy
[root@test-209 log]# iptables -S -t nat | grep mysql
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/wordpress-mysql:" -m tcp --dport 30010 -j KUBE-MARK-MASQ
-A KUBE-NODEPORTS -p tcp -m comment --comment "default/wordpress-mysql:" -m tcp --dport **30010** -j KUBE-SVC-GJ6HULPZPPQIKMS7
-A KUBE-SEP-7KXQQUXVSZ2LFV44 -s 10.0.45.6/32 -m comment --comment "default/wordpress-mysql:" -j KUBE-MARK-MASQ
-A KUBE-SEP-7KXQQUXVSZ2LFV44 -p tcp -m comment --comment "default/wordpress-mysql:" -m tcp -j DNAT --to-destination 10.0.45.6:3306
-A KUBE-SEP-J7SZJXRP24HRFT23 -s 10.0.3.2/32 -m comment --comment "default/wordpress-mysql:" -j KUBE-MARK-MASQ
-A KUBE-SEP-J7SZJXRP24HRFT23 -p tcp -m comment --comment "default/wordpress-mysql:" -m tcp -j DNAT --to-destination 10.0.3.2:3306
-A KUBE-SERVICES -d **10.254.67.85**/32 -p tcp -m comment --comment "default/wordpress-mysql: **cluster IP**" -m tcp --dport 3306 -j KUBE-SVC-GJ6HULPZPPQIKMS7
-A KUBE-SVC-GJ6HULPZPPQIKMS7 -m comment --comment "default/wordpress-mysql:" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-J7SZJXRP24HRFT23
-A KUBE-SVC-GJ6HULPZPPQIKMS7 -m comment --comment "default/wordpress-mysql:" -j KUBE-SEP-7KXQQUXVSZ2LFV44
3.3 Flannel
Flannel原理:
数据从源容器中发出后,经由所在主机的docker0虚拟网卡转发到flannel0虚拟网卡,这是个P2P的虚拟网卡,flanneld服务监听在网卡的另外一端(Flannel通过Etcd服务维护了一张节点间的路由表);
源主机的flanneld服务将原本的数据内容UDP封装后根据自己的路由表投递给目的节点的flanneld服务,数据到达以后被解包,然后直接进入目的节点的flannel0虚拟网卡,然后被转发到目的主机的docker0虚拟网卡;
最后就像本机容器通信一下的有docker0路由到达目标容器,这样整个数据包的传递就完成了。
3.3 外部访问
NodePort
- nodeIP+nodeport
lngress
-
Ingress Controller和Ingress服务组成
-
Ingress Controller会动态感知集群中的Ingress的规则变化,然后读取,动态生成nginx的配置文件,最后注入到运行nginx的pod的中,然后会自动reload,配置生效。
LoadBalancer
- LoadBalancer在nodeport基础上,k8s可以请求底层云平台创建一个负载均衡器,将每个node作为后端,进行服务分发,该模式需要底层云平台(例如GCE)支持
4.Kubernetes存储
4.1 存储卷
Kubernetes对存储抽象了两种存储卷:Volume,Persistent Volume
Volume: 与Pod之间静态绑定
与Docker的存储卷类似,使用的是Pod所在Kubernetes节点的本地目录,分为三种:
-
1.emptyDir:一个匿名的空目录,在创建Pod时创建,删除Pod时删除。
-
2.hostPath:在Pod之外独立存在,由用户指定宿主机上的文件或目录。
-
3.跨节点卷: 独立于Kubernetes节点存在,可在多个节点上访问使用。
4.2 Kubernetes存储定义
Kubernetes对存储提供了三个定义:Volume,Persistent Volume 和动态存储供应(dynamic provisioning)。
Persistent Volume(PV):与Pod之间动态绑定
- PV是kubernetes的资源对象,可以单独创建PV,借助Persistent Volume Claim(PVC)与Pod实现动态绑定,PV先创建分类,PVC请求已创建的某个类(StorageClass)的资源。
Access Modes(访问模式)
-
ReadWriteOnce:该卷能够以读写模式被加载到一个节点上。
-
ReadOnlyMany:该卷能够以只读模式加载到多个节点上。
-
ReadWriteMany:该卷能够以读写模式被多个节点同时加载。
Dynamic provisioning:动态存储供应
- 动态卷供给是一个 Kubernetes 独有的功能,这一功能允许按需创建存储卷。动态方式是通过StorageClass来完成的。
PV 和 PVC 的生命周期:
5.Kubernetes运维
5.1 Kubernetes监控
监控维度
-
集群本身的监控,主要是Kubernetes的各个组件
-
集群中Pod的监控,Pod的CPU、内存、网络、磁盘等
-
集群内部应用的监控,针对应用本身的监控
监控方案
Prometheus
Prometheus 是一套开源的系统监控报警框架,可以用来监控像物理机cpu、内存、数据库服务等性能参数,并把参数传到可视化页面(例如Grafana),这个有时间再开一篇详细讲解
整体架构方案:
Granfana:
5.2 Kubernetes日志收集
可以采用ELK的方式来做,详见博主ELK系列博客:
【ELK】logstash安装、使用其收集日志并展示
【ELK】filebeat安装和使用其收集日志
【ELK】elasticsearch分词器介绍和使用
【ELK】elasticsearch集群分片管理
【ELK】elasticsearch安装和配置
【ELK】elasticsearch采集的数据借助kibana进行报表分析
【ELK】elasticsearch集群部署
【ELK】elasticsearch简单使用
【ELK】elasticsearch集群健康管理
【ELK】elasticsearch的snapshot快照备份
6.DevOps
服务编排
Kubernetes虽然提供了多种容器编排对象,但是一个应用往往有多个服务,有的可能还要依赖持久化存储,当这些服务之间直接互相依赖,需要有一定的组合的情况下,使用YAML文件的方式配置应用往往十分繁琐还容易出错,这时候就需要服务编排工具。
服务编排管理工具构建在Kubernetes的基础Object之上,统筹各个服务之间的关系和依赖。
目前常用到的工具是 Helm。
Helm是一个Kubernetes应用的包管理工具,用来管理chart预先配置好的安装包资源)
有兴趣的读者可以去了解一下这个工具。
最后用一张云原生的全栈架构图作为本文的结束:
以上是关于k8sKubernetes全栈技术体系介绍的主要内容,如果未能解决你的问题,请参考以下文章