管理k8s集群
kubectl
k8s中有两种用户
一种是登录的
一种是/sbin/nologin
linux可以用密码登录,也可以用证书登录
k8s只能用证书登录
谁拿到这个证书,谁就可以管理集群
在k8s中,所有节点都被网络组件calico设置了路由和通信
所以pod的ip是可以被主机访问到的
比如能ping 通
如果pod运行的是web服务
也可以直接curl pod_ip访问到web服务
k8s集群对容器的管理和使用方式:
pod在系统进程中,是一个多进程的聚合单位
一个容器,一个服务,就是一个进程
同一个pod共享网络和卷
pod的创建过程:
用户向apiserver发送指令,
apiserver会把指令的信息记录在数据库etcd中
pod的创建过程是一个异步创建,
scheduler通过watch机制,
发现集群中创建出来,但尚未被调度的pod
由scheduler决定这个pod运行在哪个节点上
scheduler作为集群中的调度器,会选择合适的节点
让这个pod进行运行
选择好节点之后
会把这个数据同步给apiserver
并且会记录在etcd数据库中
这个调度的过程叫做绑定。
第一个过程,是用户的指令过程
第二个过程,是pod的调度过程
这两个过程是分开执行的
这两个过程结束之后,pod还是没有被创建。
之前这两个过程都是在管理控制节点master上运行的
在master上执行完调度绑定之后,
就该到计算节点了。
被绑定的计算节点的kubelet通过watch机制,发现集群中
被绑定到这个节点上,但尚未被创建的pod
kubelet自己不会创建容器,
kubelet会去找runtime软件,比如containerd
runtime软件负责
按照kubelet的要求把pod创建出来
创建完之后
把结果反馈给kubelet
kubelet把结果反馈给apiserver
最终把结果写入到数据库中。
pod的创建,总共三个过程
第一个是与用户交互的过程
第二个是调度的过程
第三个是创建的过程
所以kubectl get 命令的查询
并不是去实际节点进行查询
而是查询etcd数据库中pod的状态。
至于pod的实际状态
是由kubelet更新进数据库的。
pod在创建过程中,会经历不同的状态
第一个是pending,是一个等待调度的过程
第二个是scheduler进行调度,调度之后,
pod会进入一个中间状态,叫createcontainer
第三个是runnning和failed其中的一种,就是创建失败还是成功了
如果未成功创建,pod隔一段时间还会重试,重新运行
尝试让pod成功运行
任务执行成功之后,会进入completed状态
这是pod的各种状态和相位。
failed是非0退出码
unknown 无法获取pod的状态,大多数是由于网络不通了或者被防火墙屏蔽了
了解这些,有助于pod的管理和排错。
-----------------------------------------------------------------------------------
namespace也是一种api资源
kube-system是系统名称空间
events是在describe里面,主要用途是排错
get看外观
describe看pod
logs看容器
排错三兄弟比装系统还重要
]# kubectl exec -it myweb -- ls
# 其中"--" 是选项终止符,这个不是k8s里面的东西,是shell的东西
]# ls --help | grep --time
# 这个里面"--time"没有被当成grep的参数,而被当成grep的选项了
]# ls --help | grep -- --time
# 加上选项终止符"--" , 就是告诉grep,后面的内容不是选项了,是参数
]# kubectl exec -it myweb -- ls
index.html info.php
]# kubectl exec -it myweb ls
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
index.html info.php
# k8s也告诉管理员了,pod后面要加命令,就用 -- [COMMAND]
“--”选项终止符的作用是,解决复杂命令之间选项和参数分割的问题。
pod会监控自己的容器
如果容器故障了,会自动restart容器
控制器可以跨节点搬运服务,如果有节点故障了
控制器自动把服务搬到其他节点上运行
exec主要用于在容器内运行命令
有时候通过看日志还搞不定了,就得进容器里面看
cp 把文件和目录拷贝进容器,也可以从容器中拷贝到宿主机
]# kubectl cp myweb:/var/www ./www
tar: Removing leading `/' from member names
docker的cp是本机复制
k8s的cp是跨主机复制
k8s是把要拷贝的数据先条带化打包,tar包是个条带化数据,按照条带化的方式
把数据发过来,发过来的东西就是个tar包,在本地做了一个解包的操作
所以k8s的cp是靠tar实现的
cp还有一个功能是重定向,
]# tar -cf - www
# 这里面的"-" 代表标准输入和标准输出
]# tar -cf - www |gzip >a.tar.gz
重定向可以实现跨主机重定向
可以在A机器重定向到B机器。