k8s官方文档
作用:
kubernetes用于容器化应用程序的部署,扩展和管理。
目标:
是让部署容器化应用简单高效。
Kubernetes集群架构与组件
![](https://i-blog.csdnimg.cn/blog_migrate/00d25240a9a70857664653d0950a78b2.png)
Master组件
kube-apiserver
kubernetes API,集群的统一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIServer处理后在提交给Etcd存储。
kube-controller-manager
处理集群中常规后台任务,一个资源对应一个控制器,而ControllerManager就是负责管理这些控制器的。例如:Deployment、Service
kube-scheduler
根据调度算法为新创建的Pod选择一个Node节点,可以任意部署,可以部署在同一个节点上,也可以部署在不同的节点上。
etcd
分布式键值存储系统。用于保存集群状态数据,比如Pod、Service等对象信息。
Node组件
kubelet
kubelet是Master在node节点上的Agent,管理本机运行容器的生命周期,比如创建容器、Pod挂载数据卷、下载secret、获取容器和节点状态等工作。kubelet将每个Pod转换成一组容器。
kube-proxy
在Node节点上实现Pod网络代理,维护网络规则和四层负载均衡工作。
第三方容器引擎
容器引擎,运行容器,例如docker、containerd、podman
简要架构图
![](https://i-blog.csdnimg.cn/blog_migrate/cdc3aacfad2099bc74f93b2306a9e7cf.png)
kubeconfig配置文件
![](https://i-blog.csdnimg.cn/blog_migrate/a43597e97a45b15283bf4aefbd394346.png)
常用kubectl命令
![](https://i-blog.csdnimg.cn/blog_migrate/d4fcc894531790f177a680e09dcd0641.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3cd522285f0857366dfcece6aa376ca3.png)
kubectl案例:
#使用镜像控制器部署镜像
kubectl create deployment java-demo --image=gyq/java-demo
kubectl get deployment,pods
--image= 指定镜像地址,镜像来源有哪些?
1、docker hub公共镜像仓库,即镜像地址里不含IP或者域名的都是从这里下载的
2、私有镜像仓库、即镜像地址里包含ip或者域名
#使用Service将Pod暴露出去
kubectl expose deployment java-demo --port=80 --target-port=8080 --type=NodePort
kubectl get service
访问应用
http://NodeIP:Port #端口随机生成,通过kubectl get service获取
--port=80 #service的端口,暂时还不用
--target-port=8080 #目标端口,即镜像中服务的端口 , 例如nginx 80、mysql 3306
--type=NodePort #service类型,用于将容器暴露集群之外访问
kubectl get endpoints #查看service关联的pod
kubectl get pods --show-labels #查看pod标签
kubectl get pods -l app=java-demo #根据标签筛选
命名空间=工作区
应用场景:
资源分类管理,可根据不同团队、项目划分命名空间
基于命名空间权限授权
#创建命名空间
kubectl create namespace 命名空间名
#获取命名空间
default get namespace
·default:默认命名空间
·kube-system:k8s系统方面的命名空间
·kub-public:公开的命名空间,谁都可以访问
·kube-node-lease:k8s内部命名空间
获取所有命名空间
![](https://i-blog.csdnimg.cn/blog_migrate/0d40c275e93b2c014e52c31b02bb8d56.png)
指定命名空间 -n
![](https://i-blog.csdnimg.cn/blog_migrate/08ecc5a2e753f8160943012c8929066b.png)
删除某个deployment
kubectl delete deployment/deployment_name -n namespace
deployment_name为具体的deployment名称
namespace为具体的命名空间 #如果不指定命名空间,则在默认的命名空间中查找目标
案例:删除这三个deployment
![](https://i-blog.csdnimg.cn/blog_migrate/05a99b76795db6b7858b5433324836d5.png)
删除第一个
![](https://i-blog.csdnimg.cn/blog_migrate/f9f6e33f050597ef5bbed78258ab6fcf.png)
全部删除了
![](https://i-blog.csdnimg.cn/blog_migrate/e0f959cec779d645edb09b52a3446ddf.png)
从master节点中移除node节点
在节点上的pod都被区逐后直接执行
第一步:kubectl delete node 节点名
第二步:
在被删除的node节点中清空集群数据信息
![](https://i-blog.csdnimg.cn/blog_migrate/6480af228825c90fdfd6013140c99d28.png)
直接删除kubelet.conf和pki目录下的ca.crt
![](https://i-blog.csdnimg.cn/blog_migrate/dbe5fa36c33c859035cc8d86276905d5.png)
清空后
![](https://i-blog.csdnimg.cn/blog_migrate/15c2b2c05b5c2bec1e524a49ecdf3862.png)
然后重启k8s和docker
systemctl restart kubelet
systemctl restart docker
部署的网络组建起什么作用?
部署网络组件的目的是打通Pod到Pod之间网络、Node与Pod之间网络,从而集群中数据包可以任意传输,形成了一个扁平化网络。
主流网络组件有:Flannel、Calico等
而所谓的CNI(容器网络接口)就是k8s对接这些第三方网络组件的接口。
CNI 容器网络接口
CRI 容器运行时接口
结论:解决容器跨主机通信问题
为什么Kubernetes移除默认docker
k8s核心代码优化
docker内部调用链比较复杂,多层封装和调用(某些功能用不上了),导致性能降低、提升了故障率、不易排查
docker还会在宿主机创建规则、存储卷,也带来了安全隐患
如何应对?
可通过cri-docker继续使用Docker,并了解其他主流容器运行时。
除了docker之外,CRI还支持很多容器运行时,例如:
containerd: containerd与Docke相兼容,相比docker轻量很多,目前较为成熟
cri-o,podman:都是红帽(RedHat)项目,目前红帽主推podman
node : kube-proxy kubelet (systemd维护)