k8s 分成Master 负责整个k8s集群管理 node节点(工作)运行nginx
节点—服务器
kubernetes 组件
kubernetes集群主要由控制节点(Master)、工作节点(Node)组成
Master组件
集群的控制平面,集群的决策 负责管理k8s 集群管理
apiserver
Kubernetes API:集群统一入口,各个组件的协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给apiserver处理后再提交etcd存储
控制集群入口
scheduler
负责资源调度,按照预定的调度策略将Pod调度到相应Node上
例如 集群运行一个nginx容器,通过scheduler 根据调度策略计算 nginx 安装到那台对应的工作节点上(计算);
controller-manager
处理集群中常规的后台任务,一个资源对应一个控制器,而controller-manager就是负责管理这些控制器的
维护集群的状态。比如故障检测、自动扩展、滚动更新等
例如 集群运行一个nginx容器,通过scheduler 根据调度策略计算 nginx 安装到那台对应的工作节点上(计算),在 通过controller-manager 安排 将nginx安装到对应的工作节点上(安排)。
etcd
分布式键值存储系统。用于保存集群状态数据,比如Pod。Service等对象信息
我们可以将etcd 改成mysql。
node组件
集群的数据平面,负责为容器提供运行环境(工作节点)
kubelet
kubelet是Master在Node节点上的Agent,管理本机运行容器的生命周期。比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器
kubelet 发送命令给docker 来运行容器
kube-proxy
在Node节点或实现Pod网络代理,维护网络规则和四层负载均衡工作
访问程序的入口
docker
运行nginx 计算
访问nginx
容器引擎:运行容器
例如通过k8s运行一个nginx:
1.首先发送请求到Master节点(控制节点) ApiServer组件
2.ApiServer组件会根据scheduler组件计算出 nginx 应该安装到具体那台工作节点上
3.ApiServer组件在调用controller-manager组件,通知node节点安装该nginx服务
4.Node节点中的kubelet接受到控制节点的通知,使用docker运行一个nginx容器(nginx pod)
pod是k8s最小操作单元 一个pod可以运行多个容器
5.nginx运行成功之后,在通过kube-proxy 来对我们的pod进行访问。
kubectl create deployment nginx --image=nginx:1.14-alpine
常见名词
1.Master:集群控制节点,每个集群需要至少一个master节 点负责集群的管控
2.Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
3.Pod: kubernetes的最小控制单元,容器都是运行在pod中的,-个pod中可以有1个或者多个容器
4.Controller:控制器,通过它来实现对pod的管理,比如启动pod、 停止pod、伸缩pod的数量等等
5.Service: pod对外服务的统一入口,下面可以维护者同一类的多个pod
6.Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
7.NameSpace:命名空间,用来隔离pod的运行环境
kubernetes资源管理/清单配置基础
kubectl常用的命令
kubectl的命令可分为三类
1.陈述式命令(命令式对象管理) 类似于我们直接在docker 中 docker run 命令
2.陈述式对象配置(命令式对象配置) 类似于类似于 docker-compose.yml
3.声明式对象配置(声明式对象配置)
kubectl是k8s集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署,kubectl命令的语法如下:
kubectl [command] [type] [name] [flags]
comand:指定要对资源执行的操作,例如create、 get、delete
type:指定资源类型,比如deployment、pod、 service
name:指定资源的名称,名称大小写敏感
flags:指定额外的可选参数
kubectl get nodes 查询当节点
kubectl 常用命令
1.kubectl get nodes —查询k8s集群节点
2.kubectl get pod —查看所有的pod
3.kubectl describe pod nginx-6867cdf567-94kcb
查看pod详细内容
然后在我们的工作节点上执行 docker ps 查看该nginx 是否在运行
4.kubectl cluster-info —查看k8s 集群的信息
5.kubectl version 查看当前k8s 集群的版本
陈述式命令(命令式对象管理)
通过陈述式命令(命令式对象管理) 对namespace/pod操作
pod 是我们k8s 最小单元 容器运行在我们的pod里面,说到pod就是pod是放容器的
一个pod可以在里面运行n多个不同容器
1.命令形式创建一个namespace
kubectl create namespace mayikt-sit
2.查询所有的namespace
kubectl get ns
3.在mayikt-sit的namespace 下运行一个pod
kubectl run pod --image=nginx -n mayikt-sit
4.查看mayikt-sit下的pod
kubectl get pods -n mayikt-sit
注意事项 查询pod 需要指定具体命名空间
kubectl get pods -n
默认查询 default namespace
5.查看该pod的详细信息
kubectl describe pod pod-864f9875b9-h467q (错误方式)
需要指定该pod对应的namespace 如果没有指定则会报错
kubectl describe pod pod-864f9875b9-h467q -n mayikt-sit (正确方式)
6.删除该pod
不能只删pod,因为pod不存在了,会自动起一个pod
kubectl delete pods pod-864f9875b9-whqt6 -n mayikt-sit
但是删除该pod之后,有重新启动一个新的pod
kubectl get pods -n mayikt-sit
对比发现pod name 名称已经发生变化,让后查看该新的pod详细信息
kubectl describe pod pod-864f9875b9-jdp7k -n mayikt-sit
你会发现ip 也发生了变化。
我们应该通过删除命名空间,则自动会将这些pod删除
kubectl delete ns mayikt-sit
查看该命名空间下pod 已经没有该pod呢
方式2 命令式对象配置
命令式对象配置就是使用命令配合配置文件一起来操作k8s资源 类似于我们学习的
docker-compose 定义 yml 配置文件 需要对yaml 配置有一定了解。
kubectl create -f mayikt-pod1.yml 创建资源
kubectl delete -f mayikt-pod1.yml 删除资源
kubectl get-f mayikt-pod1.yml
1.创建 mayikt-pod1.yml
apiVersion: v1
kind: Namespace
metadata:
name: mayikt-sit #指定的Namespace空间名称
---
apiVersion: v1
kind: Pod
metadata:
name: mayikt-nginx-pod #指定pod的名称,同一个命名空间不能重复
namespace: mayikt-sit #指定该pod对应的Namespace
spec:
containers:
- name: mayikt-nginx-container #运行一个nginx容器
image: nginx:1.17.9 #指定镜像的名称
上面yml的效果
上传到服务器端
/usr/local 创建一个 mayikt 来演示我们的
mkdir mayikt
执行kubectl create -f mayikt-pod1.yml
创建成功 自动创建Namespace mayikt-sit 和 pod mayikt-nginx-pod
执行 kubectl get ns
执行 kubectl get pods -n mayikt-sit
查看该pod详细信息 kubectl describe pod mayikt-nginx-pod -n mayikt-sit
该容器运行在 164节点 执行curl 172.17.0.2 说明 pod中容器运行成功
执行get命令,查看资源 kubectl get -f mayikt-pod1.yml
删除delete 命令 kubectl delete -f mayikt-pod1.yml
namespace “mayikt-sit” deleted
pod “mayikt-nginx-pod” deleted
执行 kubectl get ns
在访问该nginx 已经访问不了
声明式对象配置
声明式对象配置跟命令式对象配置很类似,通过命令apply
kubectl apply -f mayikt-pod2.yml
在创建一个mayikt-pod2.yml
apiVersion: v1
kind: Namespace
metadata:
name: mayikt-sit #指定的Namespace空间名称
---
apiVersion: v1
kind: Pod
metadata:
name: mayikt-nginx-pod #指定pod的名称
namespace: mayikt-sit #指定该pod对应的Namespace
spec:
containers:
- name: mayikt-nginx-container #运行一个nginx容器
image: nginx:1.17.9 #指定镜像的名称
执行:kubectl apply -f mayikt-pod2.yml
查看 pod kubectl get pods -n mayikt-sit
查看pod 详细信息
kubectl describe pod mayikt-nginx-pod -n mayikt-sit
再次执行 kubectl apply -f mayikt-pod2.yml 资源没有发生任何变化
namespace/mayikt-sit unchanged
pod/mayikt-nginx-pod unchanged
未发生变化
修改nginx的版本1.17.8
再次执行:kubectl apply -f mayikt-pod2.yml
pod 是有发生变化的
查看pod 详细信息
kubectl describe pod mayikt-nginx-pod -n mayikt-sit
nginx:1.17.9 改成nginx:1.17.8
总结:
如果资源不存在就创建(create),相当于kubectl create
如果资源已存在,就更新(update),相当于kubectl patch
kubernetes常用组件
1.谈谈大家构建k8s集群环境过程常见问题
2.简单谈谈K8S集群架构设计原理
3.谈谈pod 、Namespace、Label、Deployment、Service之间关系
4.pod控制器原理、类型有哪些
5.pod的生命周期
6.实战K8S构建nginx集群环境 弹性扩容与缩容
20点25分准时开始
Namespace
不同命名空间是隔离的
1.Kubernetes 支持多个虚拟集群,它们底层依赖于同一个物理集群。 这些虚拟集群被称为命名空间。
可以实现多套环境的资源隔离或者多租户的资源隔离。
2.资源的名称需要在命名空间内是唯一的,但不能跨命名空间。命名空间不能相互嵌套,每个 Kubernetes 资源只能在一个命名空间中。命名空间是在多个用户之间划分集群资源的一种方法(通过资源配额)
3.k8s集群中的所有的Pod都是可以相互访问的,将两个Pod划分到不同的namespace下。kubernetes通过将集群内部的资源分配到不同的Namespace中,可以形成逻辑上的"组",以方便不同的组的资源进行隔离使用和管理,不同的Namespace下的pod 相互之间是访问不同的。
执行命令 kubectl get ns 查看所有的 Namespace
1.default 没有指明使用其它命名空间的对象所使用的默认命名空间
2.kube-system Kubernetes 系统创建对象所使用的命名空间
3.kube-public 这个命名空间是自动创建的,所有用户(包括未经过身份验证的用户)都可以读取它。这个命名空间主要用于集群使用,以防某些资源在整个集群中应该是可见和可读的。这个命名空间的公共方面只是一种约定,而不是要求。
创建Namespace
kubectl create ns mayikt-sit
删除Namespace
kubectl delete ns mayikt-sit
pod
Pod是在k8s集群进行管理的最小单元,程序要运行必须部署在容器(docker)中,而容器必须存在于Pod中。
Pod是对(docker)容器的封装,容器在pod里面,1个Pod中可以存在一个或者多个容器。
1.kubectl create ns mayikt-sit
创建pod,先创建命名空间,不然就在Default下
2.运行一个 nginx pod
kubectl run nginx --image=nginx:1.17.9 --port=80 --namespace=mayikt-sit
3.kubectl get pod -n mayikt-sit 查看命名空间mayikt-sit下的pod
4.查看pod的ip
kubectl get pod -n mayikt-sit -o wide
5.更多pod详细信息
kubectl describe pod nginx-64777cd554-z6hgr -n mayikt-sit
6.删除pod
直接删除pod是删除不成功的 ,pod控制器有会重新启动一个pod
kubectl get pods -n mayikt-sit
kubectl delete pod nginx-64777cd554-z6hgr -n mayikt-sit
继续执行 kubectl get pods -n mayikt-sit
我们将pod控制器删除 这样我们pod就可以删除啦
kubectl get deployment -n mayikt-sit 查询mayikt-sit下的控制器
删除pod控制器
kubectl delete deployment nginx -n mayikt-sit
kubectl get deployment -n mayikt-sit
kubectl get pods -n mayikt-sit
这样的我们的pod就被删除啦