容器编排的发展历程

 

1.什么是Kubernetes

Kubernetes简称K8S,其底层基于容器进行编排,早期支持docker作为底层的容器运行时,从K8S 1.24+版本之后,默认采用看containerd作为容器运行时。

官方文档:

https://kubernetes.io/zh-cn/

https://kubernetes.io/zh-cn/releases/download/

 

2.为什么要使用K8S

1.它将组成应用程序的容器组合成逻辑单元,以便于管理和服务发现。

Kubernetes 源自Google 15 年生产环境的运维经验,同时凝聚了社区的最佳创意和实践。

2.Google 每周运行数十亿个容器,Kubernetes 基于与之相同的原则来设计,能够在不扩张运维团队的情况下进行规模扩展。

3.无论是本地测试,还是跨国公司,Kubernetes 的灵活性都能让你在应对复杂系统时得心应手。

4.Kubernetes是开源系统,可以自由地部署在企业内部,私有云、混合云或公有云,让您轻松地做出合适的选择。

3.Kubernetes(K8S)的重要程度

简而言之,必精通技能。

4.Kubernetes和docker的简史

简史·精简版
  • 2013年docker开源,IT界的福音,备受关注
  • 2014.06 Google有15年的容器编排Borg(博格,商业产品)使用经验,并将K8S(基于borg系统使用go语言研发)底层基于docker作为容器运行时开源
  • 2014.12 docker inc公司推出了K8S竞品,docker swarm
  • Google kubernets vs docker inc swarm 【3年对抗赛】 2017年年底结束,k8s完胜。(k8s 72% vs swarm %13)
    • 2014 coreOS 公司推出了rkt容器管理工具并站队K8S
    • 2015 Google公司将K8S开源并贡献给了CNCF组织,成为该组织的第一个毕业项目。
    • 2015 docker inc公司推出了OCI提议,主要针对容器运行时和镜像规范,并开源了runc。
    • 2016 Google推出了CRI规范,目前市面上没有任何产品可以满足,于是就开源了docker-shim组件(会调用docker接口并满足cri规范)支持CRI接口;
    • 2016,RedHat公司基于cri-o(既符合CRI也符合OCI规范)开发框架让rkt容器管理工具支持CRI接口;
    • 2017,docker inc公司将containerd从docker engine剥离,并将containerd开源给了CNCF组织,
      • containerd底层调用runc,因此该产品是支持OCI提议的;
      • containerd组件本身不支持CRI,因此社区大佬们(包含国内外)集体开发cri-containerd组件,最后合并到containerd项目
  • 2018 年国内开始流行K8S,各大云厂商已经开始大规模使用K8S集群,
    • 阿里云的ACK的SAAS产品
    • 腾讯云的TKE的SAAS产品
    • 华为云的CCE的SAAS产品
    • ucloud的UK8S的SAAS产品
    • 亚马逊的Amazon EKS的SAAS产品
    • 京东云,百度云等
  • 2018年,coreOS公司被Redhat以2.5亿美元收购。
  • 2018年10月29日,IBM宣布以340亿美元的价格收购Red Hat。
    • 曾经一度,Docker方面的炒作非常猛。
    • Docker从Greylock Partners、Insight Partners和红杉资本等大牌投资者处筹资超过2.7亿美元,
    • 2018年估值达到最高峰:13.2亿美元。
  • 2019年2月,Docker一分为二,将企业业务出售给了云咨询公司Mirantis(对于OpenStack代码贡献量非常大,能排到前3)。
  • 2020年,Google宣布K8S将在1.22+版本后弃用docker容器运行时,当时年底发布的最新版是1.20.X;
  • 2020年3月11日公布的,当时Docker宣布被云计算软件巨头微软(Microsoft)以 6.7亿美元收购。
  • 2021年底 K8S 1.23的RC版本发布;
  • 2022年初,K8S 1.24横空出世,直接将docker-shim组件移除,而是使用containerd作为容器运行时;
  • 2023年初,K8S 1.27.X发布;
  • 2023年3月,K8S 1.23.17 发布了最后一个支持docker-shim的版本。
    • docker和Mirantis公司作为合作伙伴,将维护该项目,运维小伙伴如果需要在K8S 1.24及以后的版本使用docker的话,需要单独cri-docker组件。
  • 2024年初,K8S 1.30.x版本发布
  • 2024年12月,K8S 1.32.x版本发布
  • 2025年年初,K8S 1.33.X版本发布
  • 2013年docker开源,IT界的福音,备受关注
  • 2014.06 Google有15年的容器编排Borg(博格,商业产品)使用经验,并将K8S(基于borg系统使用go语言研发)底层基于docker作为容器运行时开源
  • 2014.12 docker inc公司推出了K8S竞品,docker swarm
  • Google kubernets vs docker inc swarm 【3年对抗赛】 2017年年底结束,k8s完胜。(k8s 72% vs swarm %13)
    • 2014 coreOS 公司推出了rkt容器管理工具并站队K8S
    • 2015 Google公司将K8S开源并贡献给了CNCF组织,成为该组织的第一个毕业项目。
    • 2015 docker inc公司推出了OCI提议,主要针对容器运行时和镜像规范,并开源了runc。
    • 2016 Google推出了CRI规范,目前市面上没有任何产品可以满足,于是就开源了docker-shim组件(会调用docker接口并满足cri规范)支持CRI接口;
    • 2016,RedHat公司基于cri-o(既符合CRI也符合OCI规范)开发框架让rkt容器管理工具支持CRI接口;
    • 2017,docker inc公司将containerd从docker engine剥离,并将containerd开源给了CNCF组织,
      • containerd底层调用runc,因此该产品是支持OCI提议的;
      • containerd组件本身不支持CRI,因此社区大佬们(包含国内外)集体开发cri-containerd组件,最后合并到containerd项目
  • 2018 年国内开始流行K8S,各大云厂商已经开始大规模使用K8S集群,
    • 阿里云的ACK的SAAS产品
    • 腾讯云的TKE的SAAS产品
    • 华为云的CCE的SAAS产品
    • ucloud的UK8S的SAAS产品
    • 亚马逊的Amazon EKS的SAAS产品
    • 京东云,百度云等
  • 2018年,coreOS公司被Redhat以2.5亿美元收购。
  • 2018年10月29日,IBM宣布以340亿美元的价格收购Red Hat。
    • 曾经一度,Docker方面的炒作非常猛。
    • Docker从Greylock Partners、Insight Partners和红杉资本等大牌投资者处筹资超过2.7亿美元,
    • 2018年估值达到最高峰:13.2亿美元。
  • 2019年2月,Docker一分为二,将企业业务出售给了云咨询公司Mirantis(对于OpenStack代码贡献量非常大,能排到前3)。
  • 2020年,Google宣布K8S将在1.22+版本后弃用docker容器运行时,当时年底发布的最新版是1.20.X;
  • 2020年3月11日公布的,当时Docker宣布被云计算软件巨头微软(Microsoft)以 6.7亿美元收购。
  • 2021年底 K8S 1.23的RC版本发布;
  • 2022年初,K8S 1.24横空出世,直接将docker-shim组件移除,而是使用containerd作为容器运行时;
  • 2023年初,K8S 1.27.X发布;
  • 2023年3月,K8S 1.23.17 发布了最后一个支持docker-shim的版本。
    • docker和Mirantis公司作为合作伙伴,将维护该项目,运维小伙伴如果需要在K8S 1.24及以后的版本使用docker的话,需要单独cri-docker组件。
  • 2024年初,K8S 1.30.x版本发布
  • 2024年12月,K8S 1.32.x版本发布
  • 2025年年初,K8S 1.33.X版本发布

5.Kubernetes集群架构图解

Kubernetes集群架构图解

Scheduler:

kube-scheduler根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。

 

Controller Manager:

Kube-controller-manager,处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。

 

Cloud Controller Manager:

用在云平台上的Kube-controller-manager组件。如果我们直接在物理机上部署的话,可以不使用该组件。

 

API Server:

kube-apiserver,集群的统一入口,各组件协调者,以RESTFUL API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后再提交给etcd存储。

 

Etcd:

分布式键值存储系统,用于保存集群状态元数据信息,比如Pod,Service等对象信息。这个数据库是可以单独拿出来部署,只需要API server可以连接到该分布式数据库集群即可。

 

 

kubelet:

可以理解为Master在工作节点上的Agent,管理本机运行容器的生命周期,比如创建容器,Pod挂载数据卷,下载secret,获取容器的节点状态等工作。kubelet将每一个Pod转换成一组容器。

 

kube-proxy:

在工作节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。换句话说,就是用于负责Pod网络路由,用于对外提供访问的实现。可以找到你关心的项目所在的pod节点。

 

POD:

用户划分容器的最小单位,一个POD可以存在多个容器。

 

docker/rocket(rkt,已停止支持):

容器引擎,用于运行容器。

 

CNI:

Pod跨节点进行网络通信的网络插件。

 

参考链接:

https://kubernetes.io/zh/docs/concepts/overview/components/

6.Kubernetes的三种网段说明

- K8S各组件通信的网络

使用时物理网卡,默认网段: 10.0.0.0/24。

- 跨节点容器实现通信的网段:

用户可以自定义,学习环境推荐: 10.100.0.0/16。

 

但是在自定义网段时,要考虑将来能够分片的IP地址数量,"10.100.0.0/16"最多有65536个IP地址。

 

如果将来容器运行的数量超过该规模时,应该考虑将网段地址调大,比如"10.0.0.0/8"。

 

 

- Service网段:

为容器提供负载均衡和服务发现功能。也是需要一个独立的网段,比如"10.200.0.0/16"最多有65536个IP地址。

 

同理,如果规模较大时,应该考虑网段分配的问题。

 

 

7.kubernetes的部署方式

K8S的部署方式
1.官方默认都有两种部署方式: (在生产环境中都可以使用,且都支持高可用环境。咱们学习过程中,建议选择kubeadm。)
- kubeadm部署K8S集群
    是官方提供的一种快速部署K8S各组件的部署方式,如果镜像准备就绪的情况下,基于容器的方式部署。
    
    需要提前安装kubelet,docker或者containerd,kubeadm组件。
    
    配置简单,适合新手。新手在镜像准备好的情况下,仅需要2分钟部署完毕。
    
    
    
第三方提供的部署方式:
国内公司:
    - 青云科技: kubesphere
        底层基于kubeadm快速部署K8S,提供了丰富的图形化管理界面。
    - kuboard
        底层基于kubeadm快速部署K8S,提供了丰富的图形化管理界面。
    - kubeasz
        底层基于二进制方式部署,结合ansible的playbook实现的快速部署管理K8S集群。
    
    
国外的产品:
    - rancher:
        和国内的kubesphere很相似,也是K8S发行商,提供了丰富的图形化管理界面。
        还基于K8S研发出来了K3S,号称轻量级的K8S。
        
云厂商:
    - 阿里云的ACK的SAAS产品
    - 腾讯云的TKE的SAAS产品
    - 华为云的CCE的SAAS产品
    - ucloud的UK8S的SAAS产品
    - 亚马逊的Amazon EKS的SAAS产品
    - 京东云,百度云的SAAS产品等。

其他部署方式:
    - minikube:
        适合在windows部署K8S,适合开发环境搭建的使用。不建议生产环境部署。
        
    - kind:
        可以部署多套K8S环境,轻量级的命令行管理工具。
         
    - yum:
        不推荐,版本支持较低,默认是1.5.2。

 

二进制部署和kubeadm部署的区别:
相同点:
        都可以部署K8S高可用集群。
不同点:
    - 1.部署难度: kubeadm简单.
    - 2.部署时间: kubeadm短时间。
    - 3.证书管理: 二进制需要手动生成,而kubeadm自建一个10年的CA证书,各组件证书有效期为1年。
    - 4.软件安装: kubeadm需要单独安装kubeadm,kubectl和kubelet组件,由kubelet组件启动K8S其他相关Pod,而二进制需要安装除了kubeadm的其他K8S组件。

 

8.Kubernetes的版本选择

首先,是K8S 1.23.17版本,该版本的第一个rc版本是2021年初,最后一个版本是23年年初结束。

其次,部署K8S 1.24,时间允许的话,我们会基于kubekey的方式部署K8S 1.28版本,而后部署kubesphere来管理多套K8S集群。

9.k8s常用命令

k8s常用命令

查看资源

  • kubectl get
    • 基本语法kubectl get [资源类型] [选项]
    • 示例
      • kubectl get pods:列出当前命名空间中的所有 Pod。
      • kubectl get pods -o wide:显示 Pod 的详细信息,包括节点等。
      • kubectl get pods -n <namespace> -o wide:查看指定命名空间中的 Pod。
      • kubectl get services:查看服务。
      • kubectl get deployments:查看部署。
  • kubectl describe
    • 基本语法kubectl describe [资源类型] [资源名称]
    • 示例
      • kubectl describe pod <pod-name>:查看指定 Pod 的详细信息,包括事件、状态等。
      • kubectl describe deployment <deployment-name>:查看部署的详细信息。
  • kubectl logs
    • 基本语法kubectl logs [Pod 名称] [选项]
    • 示例
      • kubectl logs <pod-name>:查看 Pod 的日志。
      • kubectl logs <pod-name> -c <container-name>:查看指定容器的日志(如果 Pod 有多个容器)。
      • kubectl logs <pod-name> --previous:查看之前容器的旧日志。

创建与部署资源

  • kubectl create
    • 基本语法kubectl create -f [配置文件路径]
    • 示例
      • kubectl create -f deployment.yaml:根据 deployment.yaml 配置文件创建资源。
  • kubectl apply
    • 基本语法kubectl apply -f [配置文件路径]
    • 示例
      • kubectl apply -f deployment.yaml:应用配置文件更新或创建资源。

更新与修改资源

  • kubectl edit
    • 基本语法kubectl edit [资源类型] [资源名称]
    • 示例
      • kubectl edit deployment <deployment-name>:在编辑器中修改部署的配置。
  • kubectl set
    • 基本语法kubectl set [属性] [资源类型]/[资源名称] [参数]
    • 示例
      • kubectl set image deployment/<deployment-name> <container-name>=<image:tag>:更新部署中容器的镜像。

删除资源

  • kubectl delete
    • 基本语法kubectl delete [资源类型] [资源名称]kubectl delete -f [配置文件路径]
    • 示例
      • kubectl delete pod <pod-name>:删除指定 Pod。
      • kubectl delete -f deployment.yaml:根据配置文件删除资源。
      • kubectl delete namespace <namespace-name>:删除命名空间。

其他实用命令

  • kubectl exec
    • 基本语法kubectl exec -it [Pod 名称] -- [命令]
    • 示例
      • kubectl exec -it <pod-name> -- /bin/bash:进入 Pod 中的容器执行命令。
  • kubectl port-forward
    • 基本语法kubectl port-forward [资源类型]/[资源名称] [本地端口]:[目标端口]
    • 示例
      • kubectl port-forward service/<service-name> 8080:80:将本地的 8080 端口转发到服务的 80 端口。
  • kubectl rollout
    • 基本语法kubectl rollout [操作] [资源类型]/[资源名称]
    • 示例
      • kubectl rollout status deployment/<deployment-name>:查看部署的更新状态。
      • kubectl rollout undo deployment/<deployment-name>:回滚部署到上一个版本。
posted on 2025-06-13 23:54  关彦臣  阅读(11)  评论(0)    收藏  举报