k8s笔记
一个k8s集群主要是由控制节点、工作节点构成,每个节点上都会安装不同的组件
master:集群的控制平面,负责集群的决策(管理)
ApiServer:资源操作的唯一入口,接受用户输入的命令,提供认证、授权、API注册和发现等机制 Scheduier:负责集群资源调度,按照预定的调度将Pod调度到相应的node节点上 ControllerManager:负责维护集群的状态,比如程序部署安排故障检测、自动扩展、滚动更新等 Etcd:负责储存集群中各种资源对象的信息
node:集群的数据平面,为容器提供运行环境
Kubelet:负责容器的生命周期,即通过docker,来创建、更新、摧毁容器 Kubeproxy:负责提供集群内部的服务发现即负载均衡 Docker:负责容器上的各种操作
k8s概念
Master:集群的控制器,每个集群至少有一个master节点负责管理集群的管理 Node:工作负载节点,由master分配容器到node工作节点上,然后master节点上的docker负责容器的运行 Pod:k8s的最小控制单元,容器都是在pod中的,一个pod可以有一个或多个容器 Controller:控制器,通过它来实现对pod的管理,比如启动、停止、伸缩pod的数量等 Service:pod对外的统一入口,可以维护同一类的多个pod Label:标签,对于pod进行分类,同一类pod会拥有相同的标签 NameSpace:命名空间,用来隔离pod的运行环境
资源管理介绍
在k8s中,所有的内容都会抽象为资源,用户需要通过操作资源来管理k8s
k8s本质上就是一个集群系统,用户可以在集群中部署各类服务,所谓部署服务,就是在k8s集群中运行一个个容器,并将指定的程序跑在容器中 因为k8s的最小单元是pod,所以只能将容器放在pod中,通过pod控制器来控制pod pod可以提供服务后,就要考虑如何访问pod,所以k8s提供了service资源来实现
yaml语句介绍
yaml语法
1.大小写敏感 例如:c1和C1是两个不同变量
2.使用缩进表示层级关系
有缩进代表是其子属性,无缩进代表是并列关系
3.缩进不允许tab,只允许空格
4.缩进的空格数不重要,只要相同层级的元素左对齐即可
5.#代表注释
资源管理方式
命令式对象管理:直接用命令去操作k8s资源
kubectl run nginx-pod --image=nginx:1.17.1 --port=80 kubectl是一个工具的调用,run运行一个pod,pod的名字为nginx-pod,--image=nginx:1.17.1告诉你运行的式nginx的pod,--port代表暴露的端口
命令式对象管理:通过命令配置及文件配置去操作k8s资源
kubectl create/patch -f nginx-pod.yaml 用于创建和更新资源,如果nginx-pod.yaml这个pod不存在,则创建这个pod,如果这个pod存在则更新这个pod,同时还有删除等命令
声明式对象配置:通过apply命令和配置文件去操作k8s资源
kubectl apply -f nginx-pod.yaml 用于创建和更新资源,如果nginx-pod.yaml这个pod不存在,则创建这个pod,如果这个pod存在则更新这个pod,比起上面有局限性
kubectl命令
kubectl是k8s集群的命令行工具,通过它能够对集群本身进行管理,并能够在集群上进行容器化安装部署,具体如下
kubectl [command] [type] [name] [flags]
command:指定对资源执行的操作,例如create、get、daletee
type:指定资源类型,例如daployment,pod,service
name:指定资源的名称,大小写敏感
flags:指定额外的可选参数
#查看所有pod kubectl get pod #查看某个pod kubectl get pod pod_name #查看某个pod,并以yaml格式展示 kubectl get pod pod——name -o yaml
推荐使用方式
#创建/更新资源 使用声明式对象配置 kubectl apply -f XXX.yml #删除资源 使用命令式对象配置 kubectl delete -f XXX.yml #查询资源 使用命令式对象管理jubectl get 资源名称
实战入门
1.Namespace
在k8s集群中所有的pod都是互访的,若不想要两个pod互访,就可以将两个pod划分到不同的namespace
kubectl get ns 查看所有的ns #ns即namespace缩写 kubectl get pod -n * #-n用于指定的ns,表示获取*ns下的所有pod -f 用于指定文件 kubectl apply ns dev #创建一个名称为dev的命名空间 创建一个Namespace命令如下 #配置方式 首先准备一个yaml文件:ns-dev.yaml apiVersion: v1 #指定API版本为v1 kind: Namespace #资源类型,此处定义资源类型为命名空间 metadata: name: dev #命名空间名称 随后创建yaml kubectl apply -f ns-dev.yaml
2.Pod
k8s没有提供单独运行pod的命令,都是通过pod控制器来实现的
# 命令格式: kubectl run (pod控制器名称) [参数] # image 指定pod镜像 # --port 指定端口 # --namespace 指定namespace 编写一个pod-nginx.yaml apiVersion: v1 kind: Pod metadata: name: ningx namespace: dev spec: #定义pod的具体规格 containers: #列出pod中的容器 - image: nginx: 1.17.1 imagePullPolicy: IfNotPresent #表示当本地没有镜像时就从镜像仓库拉取 name: pod #指定容器名称 ports: - name: nginx-port #指定端口名称为nginx-port containerPort: 80 #指定监听端口为80 protocol: TCP #指定使用TCP协议 创建: kubectl apply -f pod-nginx.yaml
3.LABEl
Label的作用是在资源上添加标识,对它们进行分区和选择
Label的特点:
一个Label会以key/value键值对的形式添加到各种对象上,如Node,Pod,Service等
一个资源对象可以定义任意数量的Label
标签定义完毕后,需要考虑标签的选择,此时就要用到Label Selector,即:
Label用于给某个资源对象定义标识
Label Selector用于查询和筛选拥有某些标签的资源对象
当前有两种Label Selector
#基于等式的Label Selector name = slave:选择所有包含Label中key=“name”且value=“slave”的对象 env != production:选择Label中所有包含key=“env”且value不等于“production”的对象 #基于集合的Label Selector name in(master,salave):选择Label中所有包含key=“name"且value=”master"或的value=“slave”对象 name not in(frontend):选择Label中所有包含key=“name”且value不等于frotend #标签可以同时使用多个,用逗号隔开即可,例如: name=slave,env!=production name not in(frontend),env!=produchtion