【K8s学习笔记】K8s是如何部署应用的?
本文内容

本文致力于介绍K8s一些基础概念与串联部署应用的主体流程,使用Minikube实操
基础架构概念回顾
温故而知新,上一节【K8S学习笔记】初识K8S 及架构组件 我们学习了K8s的发展历史、基础架构概念及用途,本节讲的内容建立在其上,有必要把之前的架构小节提出来回顾下:
K8s架构分为控制平台(位于的Master节点)与执行节点Node
控制平台包含:
kube-apiserver(访问入口,接收命令)
etcd(KV数据库,保存集群状态与数据)
kube-scheduler(监控节点状态,调度容器部署)
kube-controller-manager(监控集群状态,控制节点、副本、端点、账户与令牌)
cloud-controller-manager(控制与云交互的节点、路由、服务、数据卷)
执行节点包含:
kubelet(监控与实际操作容器)
kube-proxy(每个节点上运行的网络代理,维护网络转发规则,实现了Service)
容器运行时环境CRI(支持多种实现K8s CRI的容器技术)
接下来需要引入 Pod 与 Service 的概念,这也是在上一篇文章中未给出的
Pod、Service与Label概念
Pod概念与结构
Pod 是 K8s最重要的基本概念,官网给出概念:Pod是Kubernates可调度的最小的、可部署的单元。怎么理解呢?最简单的理解是,Pod是一组容器。
再详细些,Pod是一组容器组成的概念,这些容器都有共同的特点:
- 都有一个特殊的被称为“根容器”的Pause容器。Pause容器镜像属于K8s平台的一部分
- 包含一个或多个紧密相关的用户业务容器。假设个场景:业务容器需要独立的redis提供服务,这里就可以将它们两个部署在同一Pod中。
下边是Pod的组成示意图:

为什么Kubernetes会设计出一个全新的概念与Pod会有这样特殊的结构呢?
- 原因之一:K8s需要将一组容器视为一个单元处理。当其中某些容器死亡了,此时无法判定这组容器的状态。而当成一个单元,只要其中有一个容器挂了,这个单元就判定挂了。
- 原因之二:通过Pause共享容器IP,共享Pause挂接的Volume,简化密切关联的业务容器之间的通信问题和文件共享问题
K8s为每个Pod都分配了唯一的IP地址,称为Pod IP,一个Pod里的多个容器共享Pod IP地址。需要牢记的一点是:在 kubernetes 里,一个 Pod 里的容器与另外主机上的 Pod 容器能够直接通信。
Pod的创建流程
当一个普通的Pod被创建,就会被放入etcd中存储,随后被 K8s Master节点调度到某个具体的Node上并进行绑定(Binding),随后该Pod被对应的Node上的kubelet进程实例化成一组相关的Docker容器并启动。
当Pod中有容器停止时,K8s 会自动检测到这个问题并重启这个 Pod(Pod里所有容器);如果Pod所在的Node宕机,就会将这个Node上的所有Pod重新调度到其他节点上。

细心的读者是否发现:
当Pod越来越多,Pod IP 也越来越多,那是如何从茫茫IP地址中找到需要的服务呢?换句话来说,是否有一种提供唯一入口的机制,来完成对Pod的访问,而无需关心访问到具体是哪个Pod(who care :happy:)?
Kubernetes 提供了这种机制,称之为 Service。
Service概念
Service服务是Kubernetes里的核心资源对象之一,从名称上来看,理解其为一个”服务“也不为过,Service的作用是为相同标识的一系列Pod提供唯一的访问地址。
Service使用的唯一地址称为ClusterIP,仅当在集群内的容器才能通过此IP访问到Service
它具体实现对一系列Pod绑定,需要再引入Label的概念,才能做出解答。
Label概念
Kubernetes 提供了Label(标签)来对Pod、Service、RC、Node等进行标记。相当于打标签,Label可以是一组KV键值对,也可以是一个set
一个资源对象可以定义任意数量的Label,同一个Label可以添加到任意数量的资源对象上。通常由定义资源对象时添加,创建后亦可动态添加或删除。


Service如何动态绑定Pods?
原来,在定义 Pod 时,设置一系列 Label 标签,Service 创建时定义了 Label Selector(Label Selector 可以类比为对 Label 进行 SQL 的 where 查询),kube-proxy 进程通过 Service的Label Selector 来选择对应的 Pod,自动建立每个 Service 到对应 Pod 的请求转发路由表,从而实现 Service 的智能负载均衡机制。

小结:Pod是K8s最小的执行单元,包含一个Pause容器与多个业务容器,每个Pod中容器共享Pod IP,容器之间可直接作用Pod IP通信;Label是一种标签,它将标签打在Pod上时,Service可以通过定义Label Selector(Label查询规则)来选择Pod,具体实现路由表建立的是kube-proxy
部署应用实践(Minikube)
安装kubectl需要安装成本地服务,这里是debian10,更多参考https://developer.aliyun.com/mirror/kubernetes
sudo su -
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubectl
exit
下载安装Minikube(阿里云修改版):
curl -Lo minikube-linux-amd64-1.11.0-aliyuncs http://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/releases/v1.11.0/minikube-linux-amd64
sudo install minikube-linux-amd64-1.11.0-aliyuncs /usr/local/bin/minikube
使用魔改版是因为官方代码里有些地方写死了地址,而国内无法访问
部署k8s集群:
minikube start --driver docker --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers --kubernetes-version v1.18.3

本地有docker时使用此driver,其他可选的虚拟化技术参考https://minikube.sigs.k8s.io/docs/drivers/ 选择
#部署一个Pod,Pod的deployment是一种默认的无状态多备份的部署类型
kubectl create deployment hello-minikube --image=registry.cn-hangzhou.aliyuncs.com/google_containers/echoserver:1.4
#查看集群中当前的Pod列表
kubectl get pods
#创建的NodePort类型Service,将所有Node开放一个端口号,通过这个端口将流量转发到Service以及下游Pods
kubectl expose deployment hello-minikube --type=NodePort --port=8080
#minikube提供的特色功能,直接通过浏览器打开刚才创建的Service
minikube service hello-minikube

自动打开浏览器访问服务(Minikube特色功能)

查看Pod的描述信息
kubectl describe pod hello-minikube

最下方可以清楚得看到K8s集群default-scheduler成功指派我们要求的Pod在节点minikube上创建,kubelet收到信息后,拉取镜像并启动了容器
部署流程原理简述
kubectl发送创建 deployment 类型、名为hello-minikube的Pod 请求到 `kube-apiserver``- ``kube-apiserver` 将这条描述信息存到 etcd
kube-scheduler监控 etcd 得到描述信息,监测Node负载情况,创建Pod部署描述信息到etcd- 待部署Node的
kubelet监听到 etcd 中有自己的部署Pod信息,取出信息并按图拉取业务镜像,创建pause容器与业务容器(此时集群外部无法访问) kubectl执行expose命令,同时将创建Service与NodePort信息存到etcd中- 各节点
kube-proxy监听到etcd变化,创建逻辑上的Service与路由信息,开辟NodePort, - 当请求到达NodePort,自动转发到指定的Service上,负载均衡到Pod,提供服务

参考
- https://kubernetes.io/docs/concepts/workloads/pods/pod-overview/
- https://kubernetes.io/docs/concepts/services-networking/
- https://minikube.sigs.k8s.io/docs/start/
- https://minikube.sigs.k8s.io/docs/handbook/controls/
- 《Kubernetes权威指南》第 4 版
行文过程中难免出现错误,还请读者评论帮忙改正,大家共同进步,在此感谢
【K8s学习笔记】K8s是如何部署应用的?的更多相关文章
- 【k8s学习笔记】使用 kubeadm 部署 v1.18.5 版本 Kubernetes集群
说明 本文系搭建kubernetes v1.18.5 集群笔记,使用三台虚拟机作为 CentOS 测试机,安装kubeadm.kubelet.kubectl均使用yum安装,网络组件选用的是 flan ...
- k8s学习笔记一(搭建&部署helloworld应用)
kubernetes 目录 kubernetes 虚拟机创建三个节点 k8s install 部署hello world 应用 issue 汇总 node 一直处理NotReady状态 重启系统后虚拟 ...
- ASP.NET Core on K8S学习初探(3)部署API到K8S
在上一篇<基本概念快速一览>中,我们把基本的一些概念快速地简单地不求甚解地过了一下,本篇开始我们会将ASP.NET Core WebAPI部署到K8S,从而结束初探的旅程. Section ...
- golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web
golang学习笔记9 beego nginx 部署 nginx 反向代理 golang web Nginx 部署 - beego: 简约 & 强大并存的 Go 应用框架https://bee ...
- Quartz学习笔记:集群部署&高可用
Quartz学习笔记:集群部署&高可用 集群部署 一个Quartz集群中的每个节点是一个独立的Quartz应用,它又管理着其他的节点.这就意味着你必须对每个节点分别启动或停止.Quartz集群 ...
- k8s学习笔记(1)- 简单部署springboot应用
前言:k8s全称kubernetes,k8s是为容器服务而生的一个可移植容器的编排管理工具,越来越多的公司正在拥抱k8s,并且当前k8s已经主导了云业务流程,关于更多的k8s知识,可自行学习 1.k8 ...
- Docker学习笔记_04 Rancher的部署安装(编排选用K8S)
原文地址:http://dbase.cc/2018/01/12/docker/04_rancher的部署安装/ 为什么要使用Rancher Rancher是一个开源的企业级容器管理平台.通过Ranch ...
- Docker&K8S学习笔记(一)—— Docker安装
最近一年在工作上经常使用Docker与K8S,除了利用其打镜像,部署服务外,还基于Docker与K8S开发了一套CICD流水线平台,为了加深相关知识点的理解,所以从今天开始会定期更新学习笔记,本套学习 ...
- k8s学习笔记之二:使用kubeadm安装k8s集群
一.集群环境信息及安装前准备 部署前操作(集群内所有主机): .关闭防火墙,关闭selinux(生产环境按需关闭或打开) .同步服务器时间,选择公网ntpd服务器或者自建ntpd服务器 .关闭swap ...
随机推荐
- SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'xxx' already exists
字面意思 xxx表已存在. 在使用laravel 写同步结构的时候 最好习惯性写个if语句判定是否存在 // 判断数据表是否存在 Schema::hasTable('table'); // 判断数据 ...
- 【JavaScript数据结构系列】07-循环链表CircleLinkedList
[JavaScript数据结构系列]07-循环链表CircleLinkedList 码路工人 CoderMonkey 转载请注明作者与出处 1. 认识循环链表 首节点与尾节点相连的,就构成循环链表.其 ...
- Robot Framework(13)- RF 循环的详细使用
如果你还想从头学起Robot Framework,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1770899.html 前言 RF用 ...
- [书籍分享]0-008.商业模式新生代[Business Model Generation]
封面 内容简介 <商业模式新生代>内容简介:当你愉快的看完第一章:商业模式画布,赫然发现这些构成要素全都交织成一幅清晰的图像在脑海中呈现,它们如何互相影响.如何交互作用全都历历在目.利用商 ...
- 动态生成Person类的对象 代码参考
#include <iostream> #include <string> using namespace std; class Person { private: strin ...
- 泛微 e-cology远程代码执行漏洞
影响版本:泛微 e-cology<=9.0 漏洞分析: 问题出现在 resin 下 lib 中的 bsh.jar 文件里,问题类 bsh.servlet.BshServlet,可 doGet 方 ...
- Java实现 蓝桥杯 算法提高 天天向上(DP)
试题 算法提高 天天向上 问题描述 A同学的学习成绩十分不稳定,于是老师对他说:"只要你连续4天成绩有进步,那我就奖励给你一朵小红花."可是这对于A同学太困难了.于是,老师对他放宽 ...
- Java实现 蓝桥杯 算法提高 日期计算
算法提高 日期计算 时间限制:1.0s 内存限制:256.0MB 问题描述 已知2011年11月11日是星期五,问YYYY年MM月DD日是星期几?注意考虑闰年的情况.尤其是逢百年不闰,逢400年闰的情 ...
- Java实现 蓝桥杯VIP 算法训练 暗恋
算法训练 暗恋 时间限制:1.0s 内存限制:256.0MB 问题描述 同在一个高中,他却不敢去找她,虽然在别人看来,那是再简单不过的事.暗恋,是他唯一能做的事.他只能在每天课间操的时候,望望她的位置 ...
- Java实现 蓝桥杯VIP 算法提高 前10名
算法提高 前10名 时间限制:1.0s 内存限制:256.0MB 问题描述 数据很多,但我们经常只取前几名,比如奥运只取前3名.现在我们有n个数据,请按从大到小的顺序,输出前10个名数据. 输入格式 ...