一、kubernets概述

1.1 k8s什么
- k8s 的全称为 kubernetes (k12345678s),ps:“嘛,写全称也太累了吧,不如整个缩写”。
作用:
- 用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。
可以理解成 k8s 是负责自动化运维管理多个容器化程序(比如 docker)的集群,是一个生态极其丰富的容器编排框架工具。
由来:
-
k8s由google的borg系统(博格系统,google内部使用的大规模容器编排工具)作为原型,后经go语言延用borg的思路重写并捐献给cncf基金会开源。
-
云原生基金会(cncf)于2015年12月成立,隶属于linux基金会。cncf孵化的第一个项目就是kubernetes,随着容器的广泛使用,kubernetes已经成为容器编排工具的事实标准。
含义:
词根源于希腊语的 舵手、飞行员
官网:
https://kubernetes.io
github:
https://github.com/kubernetes/kubernetes
1.2为什么要用k8s
kubernetes 主要功能如下:
二、kubernetes 集群架构与组件

2.1master组件
kube-apiserver
kube-controller-manager
这些控制器主要包括:
kube-scheduler
2.2 配置存储中心
etcd
2.3 node 组件

kubelet
kube-proxy
docker 或 rocket
三、 kubernetes 核心概念
3.1pod

3.2pod 控制器
k8s 内提供了众多的 pod 控制器,常用的有以下几种:

deployment:无状态应用部署。deployment 的作用是管理和控制 pod 和 replicaset,管控它们运行在用户期望的状态中。
replicaset:确保预期的 pod 副本数量。replicaset 的作用就是管理和控制 pod,管控他们好好干活。但是,replicaset 受控于 deployment。
replicaset:确保所有节点运行同一类 pod,保证每个节点上都有一个此类 pod 运行,通常用于实现系统级后台任务。
statefulset:有状态应用部署
job:一次性任务。根据用户的设置,job 管理的 pod 把任务成功完成就自动退出了。
cronjob:周期性计划性任务
3.3label
与 label 类似的,还有 annotation(注释)
3.4label 选择器(label selector)
3.5 service

-
在k8s的集群里,虽然每个pod会被分配一个单独的ip地址,但由于pod是有生命周期的(它们可以被创建,而且销毁之后不会再启动),随时可能会因为业务的变更,导致这个 ip 地址也会随着 pod 的销毁而消失。
-
service 就是用来解决这个问题的核心概念。
k8s 中的 service 并不是我们常说的“服务”的含义,而更像是网关层,可以看作一组提供相同服务的pod的对外访问接口、流量均衡器。
service 作用于哪些 pod 是通过标签选择器来定义的。 -
在 k8s 集群中,service 可以看作一组提供相同服务的 pod 的对外访问接口。客户端需要访问的服务就是 service 对象。每个 service 都有一个固定的虚拟 ip(这个 ip 也被称为 cluster ip),自动并且动态地绑定后端的 pod,所有的网络请求直接访问 service 的虚拟 ip,service 会自动向后端做转发。
-
service 除了提供稳定的对外访问方式之外,还能起到负载均衡(load balance)的功能,自动把请求流量分布到后端所有的服务上,service 可以做到对客户透明地进行水平扩展(scale)。
-
而实现 service 这一功能的关键,就是 kube-proxy。kube-proxy 运行在每个节点上,监听 api server 中服务对象的变化, 可通过以下三种流量调度模式: userspace(废弃)、iptables(濒临废弃)、ipvs(推荐,性能最好)来实现网络的转发。
- 优势非常明显:一方面外部用户不需要感知因为 pod 上服务的意外崩溃、k8s 重新拉起 pod 而造成的 ip 变更, 外部用户也不需要感知因升级、变更服务带来的 pod 替换而造成的 ip 变化。
3.6 ingress
- service 主要负责 k8s 集群内部的网络拓扑,那么集群外部怎么访问集群内部呢?这个时候就需要 ingress 了。ingress 是整个 k8s 集群的接入层,负责集群内外通讯。
- ingress 是 k8s 集群里工作在 osi 网络参考模型下,第7层的应用,对外暴露的接囗,典型的访问方式是 http/https。
- service 只能进行第四层的流量调度,表现形式是 ip+port。ingress 则可以调度不同业务域、不同url访问路径的业务流量。
比如:客户端请求 http://www.kgc.com:port —> ingress —> service —> pod
3.7name
- 由于 k8s 内部,使用 “资源” 来定义每一种逻辑概念(功能),所以每种 “资源”,都应该有自己的 “名称”。
- “资源” 有 api 版本(apiversion)、类别(kind)、元数据(metadata)、定义清单(spec)、状态(status)等配置信息。
- “名称” 通常定义在 “资源” 的 “元数据” 信息里。在同一个 namespace 空间中必须是唯一的。
3.8namespace
- 随着项目增多、人员增加、集群规模的扩大,需要一种能够逻辑上隔离 k8s 内各种 “资源” 的方法,这就是 namespace。
- namespace 是为了把一个 k8s 集群划分为若干个资源不可共享的虚拟集群组而诞生的。
- 不同 namespace 内的 “资源” 名称可以相同,相同 namespace 内的同种 “资源”,“名称” 不能相同。
- 合理的使用 k8s 的 namespace,可以使得集群管理员能够更好的对交付到 k8s 里的服务进行分类管理和浏览。
- k8s 里默认存在的 namespace 有:default、kube-system、kube-public 等。
- 查询 k8s 里特定 “资源” 要带上相应的 namespace。
四、常见的k8s安装部署方式
4.1minikube
- minikube是一个工具,可以在本地快速运行一个单节点微型k8s,仅用于学习、预览k8s的一些特性使用。
部署地址:https://kubernetes.io/docs/setup/minikube
4.2kubeadm
- kubeadm也是一个工具,提供kubeadm init和kubeadm join,用于快速部署k8s集群,相对简单。
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
4.3二进制安装部署
- 生产首选,从官方下载发行版的二进制包,手动部署每个组件和自签tls证书,组成k8s集群,新手推荐。
https://github.com/kubernetes/kubernetes/releases
- kubeadm降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署kubernetes集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
五、k8s部署 二进制与高可用的区别
5.1二进制部署
- 部署难,管理方便,集群伸展性能好
- 更稳定,集群规模到达一定的规模(几百个节点、上万个pod),二进制稳定性是要高于kubeadm部署
- 遇到故障,宿主机起来了,进程也会起来
5.2kubeadm部署
- 部署简单,管理难
- 是以一种容器管理容器的方式允许的组件及服务,故障恢复时间比二进制慢
- 遇到故障,启动宿主机,再启动进程,最后去启动容器,集群才能恢复,速度比二进制慢
发表评论