Kubernetes
链接:原理及架构流程图 介绍安装使用(其他1) 操作命令汇总 K8S基础概念(其他1) etcd概念介绍与用法 k8ss上webUI 获取k8s镜像 kubernetes nodes notready 解决思路 k8s学习博客 etcd的 解释 , 功能 ,参数配置 k8s创建pod时没有安全账户的报错问题 docker+k8s基础篇二(精炼)
架构:
知识点总结:
0)k8s中的难点:
- Service的概念
- Fluentd(网络组建,主要用于连接分配pod网络端口),etcd (主要负责资源调度,比如Fluentd连接到etcd上便于集权对nodes中各pods的网络IP分配资源调度存储等)
K8S各组件解释:
etcd: 高可用存储共享配置和服务发现,作为与minion机器上的flannel配套使用,作用是使每台 minion上运行的docker拥有不同的ip段,最终目的是使不同minion上正在运行的docker containner都有一个与别的任意一个containner(别的minion上运行的docker containner)不一样的IP地址。 flannel: 网络结构支持 kube-apiserver: 不论通过kubectl还是使用remote api 直接控制,都要经过apiserver kube-controller-manager: 对replication controller, endpoints controller, namespace controller, and serviceaccounts controller的循环控制,与kube-apiserver交互,保证这些controller工作 kube-scheduler: Kubernetes scheduler的作用就是根据特定的调度算法将pod调度到指定的工作节点(minion)上,这一过程也叫绑定(bind) kubelet: Kubelet运行在Kubernetes Minion Node上. 它是container agent的逻辑继任者 kube-proxy: kube-proxy是kubernetes 里运行在minion节点上的一个组件, 它起的作用是一个服务代理的角色
1) k8s的好处在哪里(相比较只使用docker) k8s和Docker关系简单说明
1、故障迁移:当某一个node节点关机或挂掉后,node节点上的服务会自动转移到另一个node节点上,这个过程所有服务不中断。这是docker或普通云主机是不能做到的; 2、资源调度:当node节点上的cpu、内存不够用的时候,可以扩充node节点,新建的pod就会被kube-schedule调度到新扩充的node节点上; 3、资源隔离:创建开发、运维、测试三个命名空间,切换上下文后,开发人员就只能看到开发命名空间的所有pod,看不到运维命名空间的pod,这样就不会造成影响,互不干扰。传统的主机或只有docker环境中,登录进去就会看到所有的服务或者容器; 4、因为采用docker容器,进程之间互不影响; 5、安全:不同角色有不同的权限,查看pod、删除pod等操作;RBAC认证增加了k8s的安全
2) 如果需要外部可以访问,先curl http://localhost:8080 再curl http://【IP】:8080 再关闭防火墙,还需要修改,如果可以访问则
3) kubernetes其实是一个高度自动化的资源控制系统,通过跟踪对比etcd库里保存的“资源期望状态”与当前环境中的“实际资源状态”的差异来实现自动控制和自动纠错的高级功能。
4)容器可以为应用提供隔离的环境,在这个环境里应用就能运行起来。但是这些相互隔离的容器需要管理,也需要跟外面的世界沟通。共享的文件系统、网络、调度、负载均衡和资源分配等都是挑战。Kubernetes就可以管理这些容器。
5) docker通过进程隔离,k8s通过namespace隔离。
6) node上必须启动flanneld才能载入集群中!!
7) k8s上的pod是运行在容器上的,删除k8s并不能删除pod上的内容,这也是为什么运行pod必须要容器的理由。
8) k8s相关配置文件运用与解释:
/etc/kubernetes/config: (master、node必须) /etc/etcd/etcd.conf:(master必须) /etc/kubernetes/apiserver : (master必须) /etc/kubernetes/controller-manager: (master必须) /etc/kubernetes/scheduler : (master必须) /etc/kubernetes/kubelet、(node必须) /etc/sysconfig/flanneld (node必须) /etc/kubernetes/proxy (node必须) master生效的修改方式: ---使master能被其他机器发现需要如下配置(在/etc/kubernetes/apiserver中): echo 'KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"' >> /etc/kubernetes/apiserver; systemctl 且 stop firewalld; node生效的修改方式: 1)/etc/kubernetes/config 中 KUBE_MASTER="--master=http://master的IP:8080" 为指定master所在的地址 2)vim /etc/kubernetes/kubelet 中KUBELET_HOSTNAME="--hostname-override=node的名字" 和KUBELET_API_SERVER="--api-servers=http://master的IP:8080" 修改完成后,重启node(proxy和kubelet)可在master中看到能生效的node。 3) 修改/etc/sysconfig/flanneld 中FLANNEL_ETCD_ENDPOINTS="http://ETCD的IP:2379"
9)针对自写脚本完成k8s上mater和node的安装复制粘贴(假定所有脚本已经在当前目录下):
Master 重建: renew_k8s_master.sh (重建需要修改的配置文件: echo 'KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"' >> /etc/kubernetes/apiserver;)
Node 重建:需要修改的配置文件:
./remove_k8s_all.sh ; ./install_k8s_node.sh ;
sed -i s/127.0.0.1:8080/{MasterIP}:8080/g /etc/kubernetes/config ;
sed -i s/hostname-override=127.0.0.1/hostname-override={NodeName}/g /etc/kubernetes/kubelet ;
sed -i s/127.0.0.1:8080/{MasterIP}:8080/g /etc/kubernetes/kubelet ;
sed -i s/127.0.0.1:8080/{MasterIP}:8080/g /etc/sysconfig/flanneld ;
历史错误总结:
- 如果出现:kubectl error: The connection to the server localhost:8080 was refused 可能是/etc/kubernetes/apiserver 中 KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" 没有设置正确。 表示任何地址可访问。
- 停滞在k8s的node状态NotReady,且无法查看master状态是,是由于:node上代理没有启动:systemctl start kubelet kube-proxy
- Mater必须有以下组建:apiserver,scheduler,controller-manager,etcd,flannel; 在Node必须有:flannel, docker, kubelet, kube-proxy ,要想将其他机器的nodes加入mater需要在/etc/kubernetes目录下配置kubelet,proxy和config文件,以连接master。
-
疑问:不删除node,用kubectl显示note中的notReady哪来的? (原因:只要master曾经载入过这个node,即使这个node关机不存在,中通过kubetctl get nodes任然能显示这个node为notReady状态,通过kubectl describe nodes可以看到详细的信息)