第一章 k8s 介绍
应用部署方式的演变
传统部署: app 直接在操作系统之上进行部署。
虚拟化部署: 一台物理机上虚拟化多个虚拟机。 每个虚拟机都是独立的环境。
容器化部署: 与虚拟化相似,但共享了操作系统。
虚拟化部署,与容器化部署程序直接相互隔离,但是虚拟化每个隔离之间都需要操作系统,比较消耗系统的资源。
容器化部署可以跨云服务商,跨linux 操作系统进行发布。且每个容器拥有自己的文件系统,cpu,内存,进程空间。app 所需要的资源由容器来提供。
容器存在的问题:
1 一个容器故障宕机了,如何让另外一个容器去替补停机的容器。
2 当并发量增大的时候,如何去横向扩展容器的数量。
容器管理的问题可以统称为容器的编排问题 ,k8s: google开源的容器编排工具。
SWarm : docker 自己的编排工具。
K8s 简介
k8s 的本质是一组服务器集群,在集群的每一个节点上运行特定的程序。对节点中的容器进行管理。目的是实现资源管理的自动化。
k8s 组件
一个k8s 集群是由控制节点(master)和 工作节点(node ),每个节点上都会安装不同的组件。
举例说明,向ApiServer 发送请求,请求运行一个nginx,则通过Scheduler 进行计算,Controller-manager进行调度,假设nginx 服务运行在pod 节点上了。Etecd 记录nginx 服务相关元数据。
一旦k8s环境启动之后,master 和node 都会将自身的信息存储到etcd 数据库中
Node 节点正真干活的(工作负载节点,node 节点上的docker 负责容器的运行), kubelet 接受控制节点发送过来的信息,将信息发送给相应的docker,来执行各种操作。
kube-proxy 客户端访问接口。一个nginx 服务运行了,如果要访问nginx ,就需要kube-proxy 来对pod 产生访问的代理。
k8s 中的一些概念
pod 是k8s 中的最小控制单元, 容器必须跑到pod 中。pod 中至少要有一个容器 k8s 是通过控制pod,然后再去控制容器的。
Controller: k8s 中有各种类型的 Controller。
Label 标签: 用于对pod 进行分类,同一类pod 会拥有相同的标签。
Service: pod 对外服务的统一入口
NameSpace: 命名空间,用来隔离pod 的运行环境。Docker 也使用namspce 来隔离环境
k8s 安装
如果无法启动多个集群,建议使用官网的交互式环境。
k8s 集群介绍
k8s 集群一般分为两类,一主多从,和多主多从。
一主多从: 一个Master 节点,多个Node 节点,但存在单点故障等问题。常用于测试环境。
多主多从: 多个Mater节点,多个Node节点。搭建麻烦,但是安全性高,常用于生产环境。
k8s 安装方式
k8s 有多种部署方式,目前比较主流的方式有: kubeadm ,Minkube 二进制包
官网Minikube 部署方式
Minbikube: 用于快速搭建单节点的k8s 集群工具。
kubeadm: 一个用于快速搭建k8s集群工具。
二进制包: 从官网下载每个组件的二进制包,依次去安装,此方式对理解k8的组件更为有效。
Minikube 进行部署集群:
这里使用Minikube 进行部署集群。
下载minikube之后,输入下面命令。
1 minikube version
2 minikube start 启动k8s 集群
3 kubectl version
4 kubectl cluster-info
5 kubectl get nodes
kubeadm 安装 k8s 集群:
1 查看操作系统的版本,使用kubeadm 安装k8s集群,要求centos 的版本要在7.5 及以上。
? cat /etc/redhat-release
2 主机名解析
? 编辑三套服务器的 /etc/hosts 文件,添加服务器对应的ip地址和 主机名
? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2aFuXpwj-1636808215928)(D:\java workstation\笔记\浪潮\images\image-20211113194514224.png)]
3 时间同步
k8s 要求节点的时间要精确一致,这里使用chronyd 服务从网络中同步时间。
? 3.1 启动 chronyd 服务命令 : systemctl start chronyd
? 3.2 设置chronyd 服务开机自启动 : systemctl enable chronyd
4 禁用iptables 和firewalld 服务(生产环境才能做)(k8s 和docker 在运行中会产生大量iptables 规则,为了不跟系统的iptables 进行混淆,直接关闭系统的iptables)
? systemctl stop firewalld
? systemctl disable firewalld
? systemctl stop iptables
? systemctl disable iptables
?
k8s 部署应用
1 kubectl get nodes 获取节点信息(当前只有一个节点)
2 kubectl create deployment 命令部署k8s 应用
kubectl create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1
该命令部署的是 kubernetes-bootcamp应用。We need to provide the deployment name and app image location (include the full repository url for images hosted outside Docker hub).
3 kubectl get deployments 查看部署的应用
在单节点上的一个应用。
4 查看应用
Pods that are running inside Kubernetes are running on a private, isolated network.By default they are visible from other pods and services within the same kubernetes cluster, but not outside that network.
翻译: Kubernetes内部运行的pod运行在一个专用的隔离网络上。默认情况下,它们可以从同一Kubernetes集群内的其他pod和 service 中看到,但不能从该网络外部看到。
The kubectlcommand can create a proxy that will forward communications into the cluster-wide, private network. The proxy can be terminated by pressing control-C and won't show any output while its running.
4.1 `“kubectl”命令可以创建一个代理,将通信转发到集群范围的专用网络。可以通过按control-C终止代理,并且在代理运行时不会显示任何输出。下面命令来生成一个代理。
echo -e “\n\n\n\e[92mStarting Proxy. After starting it will not output a response. Please click the first Terminal Tab\n”; kubectl proxy
4.2 通过代理我们的主机与k8s 集群产生了联系。代理的节点提供了一些api 可以通过下面命令看到。
curl http://localhost:8001/version
- 3暴露接口
默认情况下,所有 Pod 只能在集群内部访问。因此要想在外部访问的话,需要做一个映射。
把容器的8080端口映射到节点的端口
kubectl expose deployment/kubernetes-bootcamp \
–type=“NodePort” \
–port 8080
NodePort 的意思是可以集群外部的网络进行访问。
4.4 查看服务的状态 命令 :kubectl get pods service
k8s 资源管理
资源管理介绍
在k8s 中,所有内容都抽象为资源,用户需要通过操作资源来管理k8s。
k8s本质就是一个集群系统,用户可以在集群中部署各种服务,所谓部署服务就是在k8s 集群中运行一个个容器,并将指定的程序跑到容器中。
k8s 中最小的管理单位是pod 而不是容器,所以只能将容器放到pod 中,但是k8s一般不直接管理pod,而是通过pod 管理器 (Controller) 来管理pod 的。
Pod 可以提供服务之后,就要考虑如何访问Pod 中的服务。K8s 提供了Service 资源实现了这个功能。
当然,pod中的程序的数据需要持久化,K8s 还提供了各种存储系统。
学习K8s的核心 就是学习如何对集群上的Pod,Pod控制器,Service,存储等各种资源进行操作。
资源管理方式
1 命令式对象管理: 直接使用命令去操作k8s 的各种资源
2 命令式对象配置:通过命令配置和配置文件去操作k8s 资源。
3 声明式对象配置: 通过apply 命令和配置文件去操作k8s 资源。 apply 命令有资源就更新,没有就创建。 比较:
命令式对象管理
kubectl 命令
? kubectl 命令是 k8s 集群的命令行工具,可以通过它对集群本身进行管理。并且能在集群上进行容器化应用的安装部署。kubectll 命令语法如下:
command 指对资源执行的操作 如 create get delet
type 指资源的类型,比如 deployment,pod,service
name 指资源的名称,注意名称大小写敏感。
flags 指定额外的可选参数。
常见命令
kubectl get pod # 查看所有的pod
kubectl get pod pod_name 查看某个pod
kubectl get pod pod_name -o yaml 查看某个pod,以yaml的格式进行展示
kubectl --help 查看kubectl 的所有命令
k8s 中的资源类型
k8s 中所有的内容都抽象为资源,可以通过下面命令查看k8s 中的各种资源类型。
kubetcl api-resources
常用的资源有一下内容:
kubetcl describe pods 命令运行结果
命令式对象配置
命令式对象配置就是使用命令配合配置文件一起来操作k8s 资源。
ymal 文件声明要操作资源的具体信息。 比如说创建pod 的时候,要声明创建pod 容器镜像版本,所要预留的一些端口。
1 创建一个nginxpod.xml ,内容如下:
解释: 上面的是namespace 声明,kind 对应资源类型。metadata 元数据,只给了name 为dev, 创建一个名为dev 的namespace。 下面Pod的创建使用了这个namespace。 spec 详情描述。 containers 对应相应的容器细节。name 为容器名设置的是nginx-container,image 为对应的镜像名使用的是nginx:1.17.1 版本。
2 执行create 命令 ,创建资源
kubetcl create -f nginxpod.xml
此时创建了两个资源,分别是namespace 和pod。 显示格式为 资源类型/资源名称
删除 kubetcl delete -f nginxpod.xml
声明式对象配置
声明式对象配置和命令式对象配置很类似,但是它只需要一个apply 命令。
k8s 实战入门
Namespace
Namespace 是k8s 中非常重要的一种资源,它的主要作用是用来实现多套环境的资源隔离或多租户的资源隔离。
默认情况下,K8s 集群中所有的pod 都可以互相访问,但是在实际中,可能不想让两个pod 之间相互访问,这个时候就需要将这两个pod 划分到不同的namespace 之下,K8s 通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的“组”。 以方便不同组的资源进行隔离使用和管理。
可以根据K8s 授权机制,将不同的namespace 交给不同的租户进行管理。这样就实现了多租户的资源隔离。此时还可以结合K8s 的资源配额机制,限定不同的租户能占用的资源,如cpu 使用量, 内存使用量等等。 来实现租户可用资源的管理。
K8s 集群启动之后,会默认创建几个namespace 。
使用命令式对象管理 查看:
kubectl get namespace
运行结果:
default 指的是未指定namespace 的对象都会被分配在default 命名空间
kube-node-lease 集群节点之间的心跳维护,v1.13 开始引入
kube-public 此命名空间下的资源可以被所有人访问(包括未认证用户)
kube-system 所有由k8s系统创建的资源都处于这个命名空间
获得指定名称空间下的所有pods
kubectl get pods -n kube-system
这些pods 都是集群组件。
**对Namespace资源的具体操作 **:
? 1 命令行操作
1.1 查询
kubectl get ns
注意 :ns(namespace 的简写)
STATUS 为状态, Active 表示为此名称空间正在使用。 AGE 表示该名称空间已经工作的时间。
1.2 查看具体名称空间的描述
kubectl describe ns default
Name : 名称空间的名字
Label 名称空间的标签,
Annotations 名称空间的注释
Status 名称空间的状态 Active 表示此名称空间正在使用, Terminating 表示正在删除名称空间 (删除名称空间的话,其下的pods 也会被删除,删除pods 需要时间。)
ResourceQuota 针对namespace 做的资源配额, No resource quota 没有限制
LimitRange 针对namespace 中的每个组件做的资源配额。 No LimitRange resource 表示没有限制。
1.3 名称空间的创建
kubectl create ns dev
1.4 名称空间的删除
删除dev 名称空间
kubectl delete ns dev
2 配置的形式创建与删除
准备一个ns-dev.yaml 文件
apiVersion 对应版本,Kind 对应要操作资源的类型 metadata 相关元数据
执行对应的创建与删除命令即可
创建 kubetcl create -f ns-dev.yaml
删除 kubectl delete -f ns-dev.yaml
Pod
Pod 是 Kubernetes 抽象出来的,表示一组一个或多个应用程序容器(如 Docker),以及这些容器的一些共享资源。这些资源包括:
- 共享存储,当作卷
- 网络,作为唯一的集群 IP 地址
- 有关每个容器如何运行的信息,例如容器映像版本或要使用的特定端口。
Pod 可以认为是容器的封装,一个Pod 可以存在一个或多个容器。
?
1 查看集群组件pod
K8s 集群启动之后,集群中各个组件都是以Pod 的形式运行。可以通过下面命令查看
kubectl get pods -n kube-system
kube-apiserver-minikube : ApiServer 组件
还有一些组件, ControllerManager 组件, Scheduler 组件,etcd 组件,proxy 组件 这些在第一章中的k8s 组件中进行了介绍。
coredns 是用来做DNS 的。
2 命令行操作
? 2.1 创建并运行Pod
? k8s并没有提供单独运行pod 的命令,都是通过Pod 控制器来实现的。
? 命令格式: kubectl run (pod 控制器名称) [参数]
> 参数介绍
>
> --image 指定pod 的镜像
>
> --port 指定端口
>
> --namespace 指定名称空间
kubectl run kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1 --port=80
2.2 查看pod 是否运行
kubectl get pod
NAME : pod 的名称
READY : 当前pod 有几个容器,容器里面有几个正在运行的。(计算不会将根容器计算在内)
RESTARTS: 重启次数, 在pod运行过程中如果出现问题会尝试重启。
查看更多详细信息可以加上 -o wide 参数
kubectl get pod -o wide
多出来的信息包括:
IP: 当前pod 的ip
Node: 当前pod 被调度到哪个结点上运行
查看描述信息
kubectl describe pod kubernetes-bootcamp
运行结果
还有很多详细信息,这里不进行显示。
kubectl describe 命令十分重要, 当pod 出现错误的时候,可以使用该命令查看错误的具体细节
2.3 删除pod
Pod 是由pod 控制器来进行创建的,控制器会监控Pod 的状态,一旦发现Pod 死亡,会立即重启。所以想要删除Pod,必须要删除Pod 控制器
查询当前命名空间(当前为default)的Pod 控制器
kubectl get deploy
删除此Pod 控制器
kubectl delete deploy kubernetes-bootcamp
只要删除Pod 控制器, 对应的Pod 也会被删除。
3 配置文件操作
注意使用命令行运行无法启动单独的Pod,但是使用 yaml 可以创建一个pod。 如下是使用yaml文件启动一个nginx pod
注意这里的name 名 为pod 对应的name ,不是pod 控制器。
K8s 官网交互环境应用指南
交互式环境网址: https://kubernetes.io/zh/docs/tutorials/kubernetes-basics/
K8 官网交互式应用可以学习到
- 在集群上部署容器化应用程序
- 弹性部署
- 使用新的软件版本,更新容器化应用程序
- 调试容器化应用程序
K8s 能做什么:
现代的Web 服务,用户希望应用程序能够 24/7 全天候使用,开发人员希望每天可以多次发布部署新版本的应用程序。 容器化可以帮助软件包达成这些目标,使应用程序能够以简单快速的方式发布和更新,而无需停机。Kubernetes 帮助您确保这些容器化的应用程序在您想要的时间和地点运行,并帮助应用程序找到它们需要的资源和工具。Kubernetes 是一个可用于生产的开源平台,根据 Google 容器集群方面积累的经验,以及来自社区的最佳实践而设计。
K8s 基础模块
处理生产级别流量的K8s 集群至少具备三个Node
|