K8S—基础构成、组件、pod、lable、namespace
pod:k8s集群中最小部署单元,由一个或多个容器组成,这些容器共享存储、网络等资源。特点:1个pod可以理解为1个应用实例(应用服务),提供服务pod中容器始终在1个node节点上;共享网络及存储;K8S直接管理pod,而不是直接管理容器注意:上传私有镜像前,必须先启动私有仓库镜像 一、编辑Pod的 yaml 文件二、生成 api 认证,修改 api 、controller-manager 配置
Linux部署模式演变
一、传统技术:买服务器—装系统—在服务器上部署应用(LNMP、mysql)部署慢、难于迁移、成本高、资源浪费
二、虚拟化技术:资源管理技术,将计算各种实体资源(CPU,内存,磁盘)抽象分割,组合成多个配置环境,虚拟宿主机的硬件配置,开启多个系统。一个物理机可以部署多个APP,每个APP单独运行在VMvare里面,每个虚拟机都是一个完整的系统,要分配宿主机资源,当多到一定程度时,物理机操作系统本身资源被耗尽。linux—KVM,windows—vmvare
三、容器技术:当不需要一个完整的系统,仅仅是想要多个程序,互相隔离独立。
Docker—轻量级的环境隔离,每一个进程相互独立 (Linux系统下的技术)
容器没有自己的内核,程序直接运行在宿主机上,能够最大限度使用宿主机的资源且互相隔离,性能更强,启动更快,配置更多,不需要虚拟化技术
四、K8S 管理编排技术—管理越来越多的容器,为了更好的管理docker,出现了编排管理 docker 的技术 K8S
K8S本质是一个管理平台,提供了很多的功能组件,目的是为了更好的管理容器
镜像:启动容器的核心,容器基于镜像启动,采用分层、cow技术,用户使用镜像启动容器时,会生成一个独立于镜像的容器层,并不会对镜像层产生任何影响;( docker 镜像的存放目录 /var/lib/docker )
镜像默认标签是latest,名称+标签=唯一,镜像id唯一 可以在官网下载,也可以自己制作
COW(copy-on-write):只有当需要修改时才复制一份数据,这种特性被叫做写时复制。容器层保存的是变化的部分,镜像层不会变动
镜像和容器最主要的区别:容器加上了顶层的读写层,所有修改都在此层内,不影响镜像;因为镜像可能正在被其他容器使用,容器被删除时,读写层也会被删除。
dockerfile:自动创建镜像的流程如下:
(1)手动制作 docker 镜像,记录历史命令
(2)根据历史命令编写dockerfile文件
(3)docker image build 生成镜像
(4)测试镜像功能
常用的dockerfile指令(都要大写)
from:指定自动化构建的基础镜像,该指令必须指定基于哪个镜像
run: 制作镜像中需要执行的命令
cmd:容器默认启动执行的命令,如果 run 里指定了执行命令,将覆盖 cmd 的命令
一个dockerfile至多只能有一个cmd,如果有多个,只有最后一个生效。
copy:拷贝dockerfile当前目录下的文件到容器指定目录,目录应该有 / ,否则Copy指令会理解为一个文件。不会解压 tar 包
add:拷贝dockerfile当前目录下的文件到容器指定目录,会自动解压 tar 包
workdir :指定工作目录
expose:指定镜像对外暴露的端口
volume:指定随机持久卷
env:设置环境变量
label:为镜像打标签
docker 镜像的优化思路
(1)利用缓存提高编译速度—利用缓存,将不经常变更的指令放在靠前的位置;合并多条命令减小镜像层数
(2)减小镜像体积—删除无用的缓存、使用较小的基础镜像
pod :k8s集群中最小部署单元,由一个或多个容器组成,这些容器共享存储、网络等资源。
特点:
1个pod可以理解为1个应用实例(应用服务),提供服务,1个pod可以管理多个容器,pod的ip是随机变化的,删除pod则IP变化
pod内都有一个根容器,一个pod内所有容器,共享跟容器的网络名称空间、文件系统、进程资源
pod内的容器网络地址,由跟容器提供。
pod中容器始终在1个node节点上;共享网络及存储;K8S直接管理pod,而不是直接管理容器
cat /etc/docker/daemon.json 查看私有仓库地址
docker image pull nginx:1.14 下载镜像
mkdir /oldboyedu/registry #创建目录
docker container run -d -p 5000:5000 --restart=always --name oldboyedu-image-registory -v /oldboyedu/registry:/var/lib/registry registry
#启动 registry 私有仓库镜像,默认情况下,仓库会被创建在容器的 /var/lib/registry 目录下。
#你可以通过 -v 参数来将镜像文件存放在本地的指定路径。
docker image tag nginx:1.14 192.168.4.7:5000/nginx:1.14 镜像打标签
docker image push 192.168.4.7:5000/nginx:1.14 推送到私有仓库
注意:上传私有镜像前,必须先启动私有仓库镜像
1.1、编辑 Pod 的资源文件
[root@k8s_master ~]# vim nginx-pod.yaml
apiVersion: apps/v1 ##API 版本号
kind: pod ##资源类型
metadata: ##元数据信息
name: nginx-pod ##资源名字,自定义,不能相同
namespace:ns #资源的名称空间,自定义
labels: ##子标签
app: nginx ##自定义标签
#pod的定义,主要描述pod运行什么服务
spec: ##对资源详细定义
restartPolicy:always ##指定重启策略
hostNetwork:true ##使用主机网络
Nodename:10.10.0.2 ##指定 pod 的调度器
containers: ##指定容器相关的配置
- name: nginx ##名字
image: 192.168.4.7:5000/nginx:1.14 ##私有仓库拉取镜像
ports:
- containerPort: 80 ##容器端口
hostPort: 8888 ##访问宿主机的8888端口就能访问容器的端口,被调度节点的监听
imagePullpolicy:Always ##镜像下载策略,有效值为always。无论本地是否有,都直接去拉
resources: ##资源限制
limit:
cpu: 100m
memery: 10m
requests: ##运行容器需要的资源,不符合的节点将不会被调度
cpu: 100m
memery: 10m
1.2 生成 api 认证,修改 api 、controller-manager 配置文件
[root@k8s_master ~]# openssl genrsa -out /etc/kubernetes/serviceaccount.key 2048 生成密钥
vim /etc/kubernetes/apiserver 修改api配置文件
最后一行添加 KUBE_API_ARGS="--service_account_key_file=/etc/kubernetes/serviceaccount.key"
vim /etc/kubernetes/controller-manager 修改 controller-manager 的配置文件
最后一行添加 KUBE_CONTROLLER_MANAGER_ARGS="--service_account_private_key_file=/etc/kubernetes/serviceaccount.key"
systemctl restart etcd kube-apiserver kube-controller-manager kube-scheduler 重启服务
1.3 修改各个节点的 kubectl 配置文件
vim /etc/kubeneters/kubelet 在所有的 node 节点修改
systemctl restart kubelet 重启 kubelet
1.4 创造 pod
kubectl apply -f nginx-pod.yaml 生成pod
kubectl get pods -o wide 查看运行的pod的详细信息
pod的增删改查
kubectl create -f nginx-pod.yaml 创建 pod,不支持重复执行
kubectl apply -f nginx-pod.yaml 创建 pod,支持重复执行,因此可以被用作更新资源
kubectl delete pod nginx-pod.yaml 基于命令行的方式删除 pod
kubectl delete -f nginx-pod.yaml 基于文件的方式删除 pod
kubectl delete -f . 删除当前目录下的 yaml 文件
kubectl get pods 查看 pod 的简短信息
kubectl get pod -o wide 查看 pod 的 ip 信息
kubectl get pod -o yaml 查看 yaml 的信息
kubectl get pod --show-labels 查看 pod 标签
kubectl get -f yaml 查看文件中定义的资源
pod创建过程
kubectl 向 api server 发起一个create pod 请求(即我们使用Kubectl敲一个create pod命令) 。
api server接收到pod创建请求后,不会去直接创建pod;而是生成一个包含创建信息的yaml,apiserver 将刚才的yaml信息写入etcd数据库。添加一条记录
scheduler 查看 api server,先进行调度计算,找到最“闲”的node,然后将信息在etcd数据库中更新分配结果:pod.spec.Node = nodeA (设置一个具体的节点)
kubelet 通过监测etcd数据库(即不停地看etcd中的记录),发现 api server 中有了个新的Node;如果这条记录中的Node与自己的编号相同(即这个Pod由scheduler分配给自己了);则调用node中的docker api,创建container。
pod的生命周期:
pending-悬决-1个或多个容器未被创建,也未运行
running-运行-绑定了节点,容器被创建,至少1个正在运行
success-成功-容器都已成功终止,不会被重启
failed-失败-容器都已终止,至少有一个因为失败而终止
影响pod调度策略:
(1)nodename:调度到指定pod,无视污点。
(2)nodeselector:调度到匹配标签的node节点,但会受到污点的影响。
(3)resources:资源限制
(4)污点(taints)容忍(tolerations)度
(5)污点策略(只对pod生效)—黑名单
NoSchedule——不调度——不吃鸡蛋,宁愿饿着
preferNoSchedule——尽量不调度——尽量不吃鸡蛋
Noexecute——驱逐——这鸡蛋不能吃,吃了就得死
设置策略的时候,必须是键值对+策略的形式
污点标签可以理解为黑名单(标签调度为白名单,注意黑白名单的相互影响),对已经做好在运行的容器不生效。
要使其生效,需要删除旧的容器重新运行,也就是部署前生效。(驱逐策略除外,任何时候有效)
外部网络访问pod资源
(1)hostNetwork:true 通过 Node 节点宿主机的网络对外提供服务
(2)hostPort 通过被调度的 Node 节点的端口
(3)svc
(4)ingress
(5)apiserver
单机网络通信类型:
host—使用宿主机网络,效率最高
container—使用已存在的容器,共享网络通信
bridge—默认类型,桥接到宿主机 docker0 的网络,类似于 vm 的 nat 模式
none—没有网络,不能上外网
create—自定义网络
pod 副本数量 ( RC 直接控制 pod )
第一种方式:在 RC 的资源文件里面添加修改 replicas
kubectl apply -f nginx.yaml 生成 pod
kubectl get rc 查看控制器下的副本数量
第二种方式:命令行方式在 yaml 文件改
kubectl edit -f nginx.yaml
找到 replicas 这一行,确定修改副本数量
作用:保留运行较早的,删除运行时间短的,干掉年轻的
kubectl get pods 查看所有的pod
kubectl delete rc pod名 删除 rc
pod 进入容器
kubectl run 资源名称 -it --image=私有仓库镜像名称:标签 #创建容器
kubectl get pods -o wide #查看详细信息
kubectl -exec -it 容器名 -- /bin/bash #进入容器,--代表选项终止符
一、namespacce 命令空间,主要起资源隔离的作用(理解为磁盘分区,存放不同的东西)
default 默认的名称空间
kube-system:系统服务对象所使用的名称空间
kube-public:公共数据
kube-node-lease:高可用提供心跳监视的空间
etcdctl ls /registry/namespace 查看命名空间的资源存储列表,资源存储到了 etc 里面
etcdctl get /registry/namespace/default 查看具体的节点的信息
kubectl describe ns 查看命名空间的描述信息(namespace 简写为 ns ,kubectl get --help 可以看到简称)
kubectl -n default get pods -o wide 查看命名空间中的资源对象详细信息
kuebctl get ns 查看名称空间
kubectl create ns oldboy 创造一个名称空间(资源节点),名叫oldboy
kubectl delete ns oldboy 删除指定名称空间
俄罗斯套娃
名称空间:可以理解为磁盘
pod:可以理解为磁盘上的文件夹
容器:可以理解为磁盘上的文件夹里面的文件
二、label 标签:键值对的形式,node打标签,用于部署pod
先给node打上标签,然后写 yaml 时,加入一个条件,描述时写上 nodeselector(节点选择器),去匹配符合的节点。
排错三兄弟
kubectl get pods -o wide
kubectl describe 资源类型 资源名称
kubectl logs 容器名称
kubectl : 控制K8S集群的命令行工具(tab键)
kubectl [command] [type] [name] [flags]
command: 子命令,如 get create delete describe
type:资源类型,可以为单数、复数、缩写
name:资源名称(省略则显示所有资源)
flags:指定可选标志,或其他参数
更多推荐
所有评论(0)