2分钟

课程背景

实验预计耗时:120分钟

1. 课程背景

1.1 课程目的

作为一个典型的分布式项目,Kubernetes的部署一直以来都是挡在初学者前面的一只“拦路虎”。尤其是在Kubernetes项目发布初期,它的部署完全要依靠一堆由社区维护的脚本。目前,各大云厂商最常用的部署的方法,是使用SaltStack、Ansible等运维工具自动化地执行这些步骤。但即使这样,这个部署过程依然非常繁琐。因为SaltStack这类专业运维工具本身的学习成本可能比Kubernetes项目还要高。而kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具。它提供了kubeadm init以及kubeadm join这两个命令来快速创建Kubernetes集群。本教程通过kubeadm工具对Kubernetes集群进行分布式搭建,内容包括分布式网络、Dashboard可视化及NodePort方式的远程访问。集群搭建完毕后,本教程会通过Kubernetes集群的提供的kubectl命令行工具部署我们的第一个应用程序,并讲解应用的展示、扩展以及更新。

1.2 课前知识准备

(1)相关技术及产品:

  • 腾讯云相关:
    • 云服务器CVM:腾讯云服务器 CVM(Cloud Virtual Machine)是腾讯云提供的可扩展的计算服务。使用 CVM 避免了使用传统服务器时需要预估资源用量及前期投入,帮助您在短时间内快速启动任意数量的云服务器并即时部署应用程序。腾讯云 CVM 支持用户自定义一切资源:CPU、内存、硬盘、网络、安全等等,并可以在需求发生变化时轻松地调整它们。
    • 腾讯云容器服务TKE:腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 Kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务。腾讯云容器服务完全兼容原生 Kubernetes API ,扩展了腾讯云的云硬盘、负载均衡等Kubernetes 插件,为容器化的应用提供高效部署、资源调度、服务发现和动态伸缩等一系列完整功能,解决用户开发、测试及运维过程的环境一致性问题,提高了大规模容器集群管理的便捷性,帮助用户降低成本,提高效率。容器服务免费使用,涉及的其他云产品另外单独计费。
  • Linux相关:
    • Linux:Linux是一套开源的类Unix操作系统,也是现在在服务端使用最为广泛的操作系统,它有多种发行版本。
    • CentOS:CentOS(Community Enterprise Operating System,中文意思是社区企业操作系统)是Linux发行版之一,它是来自于Red Hat Enterprise Linux依照开放源代码规定放出的源代码编译而成。由于出自同样的源代码,因此有些要求高度稳定性的服务器以CentOS替代商业版的Red Hat Enterprise Linux使用。两者的不同,在于CentOS完全开源。
  • 虚拟化相关:
    • 虚拟化:虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
    • 容器:容器是实现操作系统虚拟化的一种途径,可以让用户在资源受到隔离的进程中运行应用程序及其依赖关系。
    • Docker:Docker提供了在松散隔离的环境(称为容器)中打包和运行应用程序的功能。隔离和安全性使用户可以在给定主机上同时运行多个容器。容器是轻量级的,因为它们不需要管理程序的额外负担,而是直接在主机的内核中运行。这意味着与使用虚拟机相比,用户可以在给定的硬件组合上运行更多的容器。甚至可以在实际上是虚拟机的主机中运行Docker容器。
    • Kubernetes:Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。

(2)相关原理:

1.应用部署发展历程

应用部署发展历程

传统部署时代:早期,用户在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况,结果可能导致其他应用程序的性能下降。一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展,并且组织维护许多物理服务器的成本很高。

虚拟化部署时代:作为解决方案,引入了虚拟化功能,它允许您在单个物理服务器的CPU上运行多个虚拟机(VM)。虚拟化功能允许应用程序在VM之间隔离,并提供一定程度的安全性,因为一个应用程序的信息不能被另一应用程序自由地访问。

因为虚拟化可以轻松地添加或更新应用程序、降低硬件成本等等,所以虚拟化可以更好地利用物理服务器中的资源,并可以实现更好的可伸缩性。

每个VM是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

容器部署时代:容器类似于 VM,但是它们具有轻量级的隔离属性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。容器与VM类似,具有自己的文件系统、CPU、内存、进程空间等。由于它们与基础架构分离,因此可以跨云和OS分发进行移植。

2.Kubernetes架构

Kubernetes架构

Master组件:Master组件对集群进行全局决策(例如,调度),并检测和响应集群事件(例如,当不满足部署的replicas字段时,启动新的pod)。Master组件可以在集群中的任何节点上运行。然而,为了简单起见,安装脚本通常会启动同一个计算机(虚拟机、CVM)上所有Master组件,并且不会在计算机上运行用户容器。

Master节点:运行Master组件的主机(物理机、虚拟机、云服务器等)就是Master节点。

kube-apiserver:主节点上负责提供Kubernetes API服务的组件,它是Kubernetes控制面的前端。kube-apiserver在设计上考虑了水平扩缩的需要。换言之,通过部署多个实例可以实现扩缩。

etcd:etcd是兼具一致性和高可用性的键值数据库,可以作为保存Kubernetes所有集群数据的后台数据库。

kube-scheduler:主节点上的组件,该组件监视那些新创建的未指定运行节点的Pod,并选择节点让Pod在上面运行。调度决策考虑的因素包括单个Pod和Pod集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。

kube-controller-manager:在主节点上运行控制器的组件。每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。

这些控制器包括:

  • 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。
  • 副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的Pod。
  • 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)。
  • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌。

Node组件:节点组件在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。

Node节点:运行节点组件的主机(物理机、虚拟机、云服务器等)

kubelet:一个在集群中每个节点上运行的代理。它保证容器都运行在Pod中。kubelet接收一组通过各类机制提供给它的PodSpecs,确保这些PodSpecs中描述的容器处于运行状态且健康。kubelet不会管理不是由Kubernetes创建的容器。

kube-proxy:kube-proxy是集群中每个节点上运行的网络代理,也是实现Kubernetes Service概念的一部分。kube-proxy维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与Pod进行网络通信。

3.Pod结构

Pod结构

在Docker中最小的管理元素是一个个独立的容器,但在Kubernetes中是Pod。Pod是管理,创建,计划的最小单元,是Kubernetes最小的调度单位。

Pod包含一个Pause容器,除此之外,每个Pod还包含一个或多个紧密相关的用户业务容器。这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此它们之间的通信和数据交换更为高效。

(3)相关命令介绍:

  • Linux相关命令:
    • 安装软件: yum install <软件名> -y
    • 服务启动/关闭: systemctl start[stop] <服务名>
    • 设置开机启动/不启动: systemctl enable[disable] <服务名>
    • 禁用SELinux: setenforce 0
    • 下载文件: wget <下载地址>
    • 远程ssh连接: ssh <用户名>@<地址>
    • 解压ZIP文件: unzip <文件路径>
    • 访问链接: curl <链接地址>
  • Docker相关命令:
    • 拉取镜像: docker pull <镜像名>:<版本>
    • 标记本地镜像,将其归入某一仓库: docker tag <镜像名>:<版本> <仓库名>/<镜像名>:<版本>
    • 导出镜像: docker save <镜像名>:<版本> -o <输出文件>
    • 导入使用docker save命令输出的镜像文件: docker load -i <镜像打包文件>
  • Kubernetes相关命令:
    • 启动Master节点: kubeadm init --kubernetes-version=<版本>
    • Node节点加入集群: kubeadm join <masterIP>:<端口> --token <token值> --discovery-token-ca-cert-hash <ca证书hash值>
    • 查看节点状态: kubectl get nodes
    • 查看Pod状态: kubectl get pods [-n <命名空间>]
    • 查看所有Pod状态 kubectl get pods --all-namespaces
    • 通过配置文件名或stdin创建一个集群资源对象: kubectl create -f <文件名>
    • 通过配置文件名删除资源: kubectl delete -f <文件名>
    • 通过配置文件名对资源进行配置: kubectl apply -f <文件名>
    • 查看Pod状态: kubectl [-n <命名空间>] describe pod <pod名>
    • 查看secret: kubectl [-n <命名空间>] get secret
    • 查看secret详情: kubectl [-n <命名空间>] describe secret <secret名>
    • 执行容器命令: kubectl [-n <命名空间>] exec -it <pod名> <命令>
    • 创建Deployment: kubectl create deployment <名称> --image=<镜像仓库>/<镜像名>:<版本> [-n <命名空间>]
    • 创建服务(向集群外部暴露应用): kubectl expose <类型>/<名称> --type="<访问方式>" --port <内部端口>
    • 查看服务状态: kubectl get service [-n <命名空间>]
    • 删除服务: kubectl delete service <服务名> [-n <命名空间>]
    • 查看deployments: kubectl get deployments [-n <命名空间>]
    • 修改容器副本数: kubectl scale <类型>/<名称> --replicas=<副本数>
    • 查看Pod副本状态: kubectl get rs [-n <命名空间>]
    • 更新镜像: kubectl set image <类型>/<名称> <镜像名>=<镜像仓库>/<镜像名>:<版本>
    • 回滚更新: kubectl rollout undo <类型>/<名称>
  • vim相关命令:
    • 进入编辑模式,在当前字符前插入光标:i
    • 进入命令行模式:ESC
    • 搜索命令(命令行模式下)::/<搜索内容>
    • 保存并退出文件(命令行模式下)::wq


http://www.vxiaotou.com