一、虚拟机和Docker

虚拟机和Docker(容器技术)虽然都提供了隔离环境,但它们的使用场景和优势有所不同。以下是为什么在有了虚拟机的情况下,仍然需要Docker等容器技术的几个原因:

  1. 轻量级:与虚拟机相比,Docker容器更加轻量级。虚拟机需要运行一个完整的操作系统实例,这需要较多的资源(CPU、内存、存储)。而Docker容器共享主机操作系统的内核,只包含应用程序和其依赖的库,启动速度更快,资源占用更少。

  2. 启动速度:Docker容器的启动时间通常比虚拟机短得多。虚拟机可能需要几分钟才能启动,而Docker容器可以在几秒钟内启动。这对于需要快速部署和扩展的应用场景非常重要。

  3. 一致性和可移植性:Docker容器可以保证在开发、测试和生产环境中运行的一致性。开发人员可以在本地创建容器,然后将其无缝地部署到任何支持Docker的平台上,而不必担心环境差异引起的问题。

  4. 简化的依赖管理:Docker镜像包含了应用程序运行所需的所有依赖,可以避免在不同环境中安装和配置依赖的麻烦。这种方式确保了应用程序在任何地方运行时,都有相同的依赖环境。

  5. 高效的资源利用:Docker容器允许在同一操作系统内核上运行多个隔离的应用程序实例,从而提高资源利用率。相比之下,虚拟机因为每个实例都运行独立的操作系统,资源开销更大。

  6. 开发和运维(DevOps):Docker容器与CI/CD(持续集成/持续交付)管道集成良好,可以帮助实现更高效的开发和运维流程。使用容器技术,可以更容易地进行版本控制、自动化测试、自动化部署和回滚。

  7. 微服务架构:Docker非常适合构建和管理微服务架构。每个微服务可以打包成一个独立的容器,彼此之间独立运行,并可以轻松地进行扩展、更新和维护。

  8. 隔离和安全:虽然虚拟机提供了良好的隔离,但Docker容器也通过命名空间和控制组(cgroups)等技术实现了进程级的隔离,并且安全性也在不断改进。

  9. 生态系统:Docker拥有丰富的生态系统,包括Docker Hub、Kubernetes等。这些工具和平台可以帮助简化容器的管理、编排和部署。

二、Docker和Kubernetes

Docker和Kubernetes(K8s)是两种互补的技术,尽管Docker可以独立使用,但Kubernetes提供了更高级的功能和管理能力。以下是为什么在有了Docker的情况下,仍然需要Kubernetes的几个原因:

  1. 容器编排:Docker单独运行时适合管理少量的容器,但在大规模的生产环境中,需要对成百上千的容器进行管理和协调。Kubernetes提供了容器编排功能,可以自动管理容器的部署、扩展、负载均衡和故障恢复。

  2. 自动化部署和扩展:Kubernetes可以根据需求自动扩展或缩减容器实例的数量。它可以根据资源使用情况动态调整容器的数量,确保应用在负载高峰期可以处理更多的请求,而在低负载时节省资源。

  3. 服务发现和负载均衡:Kubernetes提供了内置的服务发现和负载均衡机制。当一个容器启动或停止时,Kubernetes会自动更新服务注册表,并将流量分配到健康的容器实例。

  4. 自愈能力:Kubernetes具备自愈能力,可以监控容器的状态,并在容器故障或崩溃时自动重新启动或替换容器,确保应用持续运行。

  5. 滚动更新和回滚:Kubernetes支持滚动更新,允许在不中断服务的情况下逐步更新应用程序。当发生问题时,Kubernetes可以轻松回滚到之前的版本,减少服务中断时间。

  6. 配置管理和密钥管理:Kubernetes提供了ConfigMap和Secret来管理应用配置和敏感信息。这些功能使得管理和更新应用配置变得更加方便和安全。

  7. 持久化存储:Kubernetes支持多种持久化存储方案,可以将数据持久化到不同的存储系统,如本地存储、网络存储、云存储等。它可以自动挂载存储卷到容器,确保数据的持久性和可用性。

  8. 多集群管理:Kubernetes可以跨多个集群进行管理,支持在不同数据中心或云环境中运行应用。这对于需要高可用性和灾备能力的企业来说非常重要。

  9. 监控和日志管理:Kubernetes集成了许多监控和日志管理工具,如Prometheus、Grafana、ELK Stack等,可以帮助运维人员监控应用性能、收集日志和进行故障排查。

  10. 社区和生态系统:Kubernetes拥有活跃的社区和丰富的生态系统。很多现代云原生工具和平台都与Kubernetes紧密集成,提供了广泛的插件和扩展,增强了其功能和可用性。

总结来说,Docker用于创建和管理单个容器,而Kubernetes则用于在大规模生产环境中编排和管理这些容器。Kubernetes提供了自动化、可扩展、自愈和高可用性的功能,使得管理和运行容器化应用变得更加高效和可靠。在实际应用中,Docker和Kubernetes通常结合使用,以充分利用两者的优势。

三、k8s与OpenStack

观点3

OpenStack和介绍

OpenStack是一个用于构建和管理私有云和公有云基础设施的开源项目。它由一系列相互关联的组件组成,包括计算(Nova)、网络(Neutron)、存储(Cinder、Swift)和身份认证(Keystone)等。OpenStack提供了一个完整的基础设施即服务(Infrastructure as a Service,IaaS)解决方案,允许用户通过虚拟化技术来创建和管理虚拟机、网络和存储资源。

Kubernetes是一个用于自动化部署、扩展和管理容器化应用程序的开源平台。它采用了分布式架构,由主节点(Master)和工作节点(Worker)组成。Kubernetes的核心组件包括API服务器、调度器、控制器和容器运行时。Kubernetes通过容器编排来管理应用程序的生命周期,并提供自动扩展、负载均衡、故障恢复等功能。

OpenStack用途

OpenStack的主要用途是构建和管理云基础设施,它适用于构建私有云或公有云平台。OpenStack提供了弹性的计算、存储和网络资源,并具备灵活的管理和配置能力。它可以满足企业对于资源池化、自助服务和弹性扩展的需求,同时提供了强大的身份认证和权限管理功能。

Kubernetes则专注于容器化应用程序的管理。它提供了一个统一的平台来管理和编排容器,使得应用程序可以在分布式环境中弹性运行。Kubernetes具有自动扩展、自愈能力和故障恢复机制,可以根据应用程序的需求自动调度和管理容器。它适用于构建微服务架构、持续交付和可伸缩的应用程序。

技术特点

OpenStack在可扩展性和灵活性方面具有优势。它可以集成多种虚拟化技术(如KVM、VMware)和存储后端(如Ceph、NFS),同时支持多种网络模式(如VLAN、SDN)。OpenStack提供了丰富的API和插件机制,可以与其他系统进行集成和扩展。

Kubernetes则注重于容器编排和自动化管理。它提供了丰富的调度策略和服务发现机制,支持容器的自动伸缩和滚动升级。Kubernetes还具有故障检测和自动修复的功能,可以确保应用程序的高可用性和稳定性。此外,Kubernetes还提供了丰富的监控和日志功能,方便用户进行系统管理和故障排查。

OpenStack和Kubernetes是两个不同领域的开源项目,分别用于构建和管理云基础设施以及容器化应用程序。OpenStack适用于构建云平台,提供弹性的计算、存储和网络资源,具备灵活的管理和配置能力。而Kubernetes则专注于容器编排和自动化管理,使得应用程序可以在分布式环境中弹性运行,具备自动扩展和故障恢复的能力。选择使用哪个技术取决于用户的需求和场景,也可以将两者结合起来,构建强大而灵活的云计算解决方案。

来源:https://www.usa-idc.com/news/idc/2023071414.shtml

观点2

Kubernetes 和 OpenStack 有何区别?

KubernetesOpenStack 都是有助于对 IT 功能进行编排和自动化(而不用改变底层硬件)的开源工具。这两个平台都支持自动部署和维护应用,但实现方式不同。 OpenStack 是利用虚拟资源池构建和管理私有云和公共云的开源基础架构平台。Kubernetes(也称为 k8s 或“kube”)是比 OpenStack 更新的技术,主要用作容器编排平台来管理容器化应用。 这种方法与您的用例能否高度适配,取决于您的具体环境和您要达成的目标。此外,您也可能需要考虑同时运行这两种技术。

使用 OpenStack 进行虚拟化

虚拟化是云计算的基础,是高效使用物理计算机硬件的过程。在虚拟化环境中,诸如存储、CPU 和 RAM 等的资源都是从各种供应商特定的项目中提取出来,并由虚拟机监控程序进行拆分,然后再按需进行分配。

虚拟机(VM)则包含自己的 OS,从而能够一次执行多个资源密集型功能。由于虚拟机的可用资源大大增加,因此它们可以抽象、拆分、复制和模拟整个服务器、操作系统、台式机、数据库和网络。

OpenStack 是一个社区开源项目,也是红帽® OpenStack® 平台的构建基础。OpenStack 作为云操作系统,可将行业标准硬件的资源虚拟化,再将其整理到云中,然后用户即可通过仪表板来管理这些资源,同时保持可扩展性和安全性。

来源:https://www.redhat.com/zh/topics/openstack/kubernetes-vs-openstack

观点1

一句话,Kubernetes 面向应用层,变革的是业务架构,而 OpenStack 面向资源层,改变的是资源供给模式。使用容器且集群规模不大,直接用 Kubenetes 就可以;集群规模大,不管应用是否只是跑在容器中,都是 OpenStack + Kubernetes 更好。

OpenStack + Kubernetes 是各取所长,并不只是因为惯性,而是对于多租户需求来说,Container(容器)的隔离性还需要加强,需要加一层 VM(虚拟机) 来弥补,而 OpenStack 是很好的方案。不过,VM + Container 的模式,必然有性能的损耗,所以 OpenStack 基金会也推出一个项目叫 Kata Containers,希望减少虚拟化的开销,兼顾容器的性能和隔离性。

永恒的只有变化,未来的业务都会运行在云上,容器是走向 DevOps、Cloud Native(云原生)的标准工具,已经开始走向平凡,而 Kubernetes 的编排能力,让容器能够落地到业务应用中,所以我们看到 Docker、Mesos、OpenStack 以及很多公有云、私有云服务商,都在支持 Kubernetes,大家都加入了 CNCF(云原生计算基金会)。

作者:网易数帆链接:https://www.zhihu.com/question/26895729/answer/298988959

四、K8S搭建

版本选择

直接看:2023年Kubernetes版本的选用对比指南-CSDN博客

搭建过程

下述两个写的都很好

k8s搭建部署(超详细)_部署k8-CSDN博客

详解 K8S 高可用部署_sandbox_image-CSDN博客

注意事项

使用

  • 系统:ubuntu:22.04
  • k8s:kubernetes-version v1.28.2

搭建需要注意下面一些小问题

镜像拉取问题

所有节点修改为阿里源

#安装curl和https传输工具
sudo apt-get install -y apt-transport-https curl
#添加官方源
sudo vim /etc/apt/sources.list
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
#添加秘钥
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add 
sudo apt update
sudo apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated

# 设置为开机自启并现在立刻启动服务 --now:立刻启动服务
sudo systemctl enable --now kubelet
sudo systemctl status kubelet
sudo systemctl restart kubelet

 /var/lib/kubelet/config.yaml为kubectl的配置文件,确保其权限配置正确

sudo chown root:root /var/lib/kubelet/config.yaml 
sudo chmod 644 /var/lib/kubelet/config.yaml

sandbox_imagess问题

将 sandbox_image 镜像源设置为阿里云 google_containers 镜像源(所有节点)

#可选将containerd升级到最新 
sudo apt upgrade containerd 
# 生成 containerd 的默认配置文件 
sudo mkdir /etc/containerd 
sudo containerd config default | sudo tee /etc/containerd/config.toml > /dev/null 
#修改config.toml 中sandbox为3.9 
sudo vim /etc/containerd/config.toml 
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" 
#重启 
sudo systemctl restart containerd


配置containerd cgroup所有节点

sudo vim /etc/containerd/config.toml 
       [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
            BinaryName = ""
            CriuImagePath = ""
            CriuPath = ""
            CriuWorkPath = ""
            IoGid = 0
            IoUid = 0
            NoNewKeyring = false
            NoPivotRoot = false
            Root = ""
            ShimCgroup = ""
            SystemdCgroup = true
而不是将systemd_cgroup = fasle修改为systemd_cgroup = true
sudo systemctl restart containerd

重置k8s

最好执行两次,不然容易不成功。

#清理主节点
#init初始不成功,清理
sudo kubeadm reset && sudo rm -rf  ~/.kube/  /etc/kubernetes/*  /var/lib/etcd/* /etc/cni/net.d
#清理工作节点
sudo kubeadm reset && sudo rm -rf  ~/.kube/  /etc/kubernetes/* /var/lib/etcd/* /etc/cni/net.d /var/lib/rook 

Pods、Deployments和Stateful 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐