Kubernetes介绍和架构
Kubernetes 建立在 Google 公司超过十余年的运维经验基础之上,Google 所有的应用都运行在容器上,
再与社区中最好的想法和实践相结合,Google 每周运行数十亿个容器,Kubernetes 基于与之相同的原
则来设计,能够在不扩张运维团队的情况下进行规模扩展,当前已成为最受欢迎和行业最主流的容器管
理平台。
Kubernetes 用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用
简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的强大和灵活的机制。
Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行
着,用户可以运行一个微型服务,让规划器来找到合适的位置节点,后续用户不需要关心怎么去做,
Kubernetes会自动去监控,然后去重启,新建等,总之让应用可以一直提供服务,同时,Kubernetes
系提供了人性化的相关工具,可以让用户能够方便的部署自己的应用
Kubernetes特性
自动化上线和回滚
Kubernetes 会分步骤地将针对应用或其配置的更改上线,同时监视应用程序运行状况以确保你不会同
时终止所有实例。如果出现问题,Kubernetes 会为你回滚所作更改。你应该充分利用不断成长的部署
方案生态系统。
服务发现与负载均衡
无需修改你的应用程序即可使用陌生的服务发现机制。Kubernetes 为容器提供了自己的 IP 地址和一个
DNS 名称,并且可以在它们之间实现负载均衡。
存储编排
自动挂载所选存储系统,包括本地存储、诸如 GCP 或 AWS 之类公有云提供商所提供的存储或者诸如
NFS、iSCSI、Gluster、Ceph、Cinder 或 Flocker 这类网络存储系统。
水平扩缩
使用一个简单的命令、一个 UI 或基于 CPU 使用情况自动对应用程序进行扩缩。
自我修复
重新启动失败的容器,在节点死亡时替换并重新调度容器,杀死不响应用户定义的健康检查的容器,并
且在它们准备好服务之前不会将它们公布给客户端。
为扩展性设计
无需更改上游源码即可扩展你的 Kubernetes 集群。
自动装箱
根据资源需求和其他约束自动放置容器,同时避免影响可用性。 将关键性的和尽力而为性质的工作负载
进行混合放置,以提高资源利用率并节省更多资源。
批量执行
除了服务之外,Kubernetes 还可以管理你的批处理和 CI 工作负载,在期望时替换掉失效的容器。
IPv4/IPv6 双协议栈
为 Pod 和 Service 分配 IPv4 和 IPv6 地址
Secret 和配置管理
部署和更新 Secret 和应用程序的配置而不必重新构建容器镜像, 且不必将软件堆栈配置中的秘密信息
暴露出来。
Kubernetes架构
Kubernetes 是一个分布式系统,是由很多主机节点组成,且各个节点的分工不同
Kubernetes 的主机节点主要有两种类型
Master节点:
管理(控制)节点,相当于公司的总部
Master 节点主要由 API Server 、Controller-Manager 和Scheduler 三个组件,以及一个用于存储集群状态的 Etcd存储服务组成
graph A(API Server入口) -->B(Scheduler调度) --> C(Controller控制器 容器扩缩容) --> D(ETCD 数据库 持久化)
Node节点:
也称为工作worker节点或者Minion节点,相当于公司的分部
Node节点则主要包含 Kubelet 、Kube Proxy 及容器运行时( 当前docker 仍是最为常用的实现)三个组件,它们承载运行各类应用容器
Kubernetes的节点运行逻辑
Kubernetes将所有worker工作节点的资源集结在一起形成一台逻辑的更加强大的“服务器”
计算和存储接口通过Master之上的API Server暴露客户端通过API提交应用程序的运行请求,而后由Master通过调度算法将其自动指派至某特定的工
作节点以Pod对象的形式运行Master会自动处理因工作节点的添加、故障或移除等变动对Pod的影响
Kubernetes组件分为三种
- Control Plane Components 控制平台组件
- Node Components 节点组件
- Addons 附件
附件
- 网络附件(必要) 容器网络 flanel,calico,cilium
- dashborad 图形管理工具,kubesphere
- Ingress 七层代理
- Metablab SVC
Kubernetes拓展接口
Kubernetes提供了三个特定功能的接口,kubernetes通过调用这几个接口,来完成相应的功能。
容器运行时接口CRI: Container Runtime Interface
CRI 首次发布于2016年12月的Kubernetes 1.5 版本。
在此版本之前,Kubernetes 直接与 Docker 通信,没有标准化的接口。
从 Kubernetes 1.5 开始,CRI 成为 Kubernetes 与容器运行时交互的标准接口,使得 Kubernetes
可以与各种容器运行时进行通信,从而增加了灵活性和可移植性。
kubernetes 对于容器的解决方案,只是预留了容器接口,只要符合CRI标准的解决方案都可以使用
容器网络接口CNI: Container Network Interface
kubernetes 对于网络的解决方案,只是预留了网络接口,只要符合CNI标准的解决方案都可以使用
容器存储接口CSI: Container Storage Interface
kubernetes 对于存储的解决方案,只是预留了存储接口,只要符合CSI标准的解决方案都可以使用
此接口非必须
容器运行时接口(CRI)
CRI是kubernetes定义的一组gRPC服务。Kubelet作为客户端,基于gRPC协议通过Socket和容器运行时
通信。
CRI 是一个插件接口,它使 kubelet 能够使用各种容器运行时,无需重新编译集群组件。
Kubernetes 集群中需要在每个节点上都有一个可以正常工作的容器运行时, 这样 kubelet 能启动 Pod
及其容器。
容器运行时接口(CRI)是 kubelet 和容器运行时之间通信的主要协议。
CRI 包括两类服务:
镜像服务(Image Service)
镜像服务提供下载、检查和删除镜像的远程程序调用。
运行时服务(Runtime Service)
运行时服务包含用于管理容器生命周期,以及与容器交互的调用的远程程序调用
kubernetes集群部署
基于Kubeadm 和 Docker 部署 kubernetes 高可用集群
kubeadm是Kubernetes社区提供的集群构建工具
负责执行构建一个最小化可用集群并将其启动等必要的基本步骤
Kubernetes集群全生命周期管理工具,可用于实现集群的部署、升级/降级及卸载等
kubeadm仅关心如何初始化并拉起一个集群,其职责仅限于下图中背景蓝色的部分
蓝色的部分以外的其它组件还需要自行部署
基于 kubeadm 和 Docker 实现Kubernetes集群流程说明
每个节点主机的初始环境准备
准备代理服务,以便访问k8s.gcr.io,或根据部署过程提示的方法获取相应的I国内镜像的image(可
选)Kubernetes集群API访问入口的高可用和harbor(可选)
在所有Master和Node节点都安装容器运行时 Docker
在所有节点安装和配置 cri-dockerd(kubernetes-v1.24版本以后需要)
[ERROR Mem]: the system RAM (952 MB) is less than the minimum 1700 MB
物理主机网络 10.0.0.0/24
集群pod网络 –pod-network-cidr=10.244.0.0/16
应用service网络 –service-cidr=10.96.0.0/12
在所有Master和Node节点都安装kubeadm 、kubelet、kubectl(集群管理工具,在node节点可
不安装)在第一个 master 节点运行 kubeadm init 初始化命令 ,并验证 master 节点状态
在第一个 master 节点安装配置CNI规范的网络插件flannel,calico等
在其它master节点运行kubeadm join 命令加入到控制平面集群中实现高可用(测试环境可选)
在所有 node 节点使用 kubeadm join 命令加入集群 , 并验证 node 节点状态
创建 pod 并启动容器测试访问 ,并测试网络通信
| IP | 主机名 | 角色 |
|---|---|---|
| 10.0.0.100 | kubeapi.wilh.net | VIP, 在ha1和ha2主机实现 |
| 10.0.0.101 | master1.wilh.net | k8s集群主节点1,Master和etcd |
| 10.0.0.102 | master2.wilh.net | k8s集群主节点2,Master和etcd |
| 10.0.0.103 | master3.wilh.net | k8s集群主节点3,Master和etcd |
| 10.0.0.104 | node1.wilh.net | k8s集群工作节点1 |
| 10.0.0.105 | node2.wilh.net | k8s集群工作节点2 |
| 10.0.0.106 | node3.wilh.net | k8s集群工作节点3 |
| 10.0.0.107 | ha1.wilh.net | k8s主节点访问入口1,提供高可用及负载均衡 |
| 10.0.0.108 | ha2.wilh.net | k8s主节点访问入口2,提供高可用及负载均衡 |
| 10.0.0.110 | harbor.wilh.net | 容器景象仓库(可选) |
物理主机网络 10.0.0.0/24
集群pod网络 –pod-network-cidr=10.244.0.0/16
应用service网络 –service-cidr=10.96.0.0/12
环境初始化
初始准备环境
- 每个主机至少2G以上内存,CPU2核以上
- 操作系统: 最小化安装支持Kubernetes的Linux系统
- 唯一的主机名,MAC地址以及product_uuid和主机名解析
- 保证各个节点网络配置正确,并且保证通信正常
- 禁用 swap
- 禁用 SELinux
- 放行Kubernetes使用到的相关端口或禁用firewalld/iptables
- 配置正确的时区和时间同步
- 内核参数优化
- 所有节点实现基于 ssh key 验证(可选)
1 | #按照规划配置唯一的主机名 |
禁用swap
1 | #方法1 |
内核优化
1 | #加载模块 |
安装habor
配置代理
- 部署harbor仓库和高可用反向代理
- 安装haproxy
- 所有电脑安装docker
1 | apt update %% apt -y install docker.io |
- 安装docker-cri
1 | wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.18/cri-dockerd-0.3.18.amd64.tgz |
- 安装kubeadm
1 | apt-get update && apt-get install -y apt-transport-https |
K8s三个网络
- 主机网络
- 容器网络
- SVC网络