文章目录
1.K8S如何管理
-
K8S并不针对于某种特定的容器,当前K8S作为docker容器的调度工具比较常用
-
K8S分为master端和worker端(node,客户端)
(1)master端用来管理和调度容器
(2)node端被master端用来进行管理
-
在master中有4重要部分,即4个进程
(1)apiserver进程:mater下发指令通过apiserver来管理node;
此外,用户通过apiserver输入一些指令来进行操作,指令分为3种形式:
kubectl:通过kubectl直接下发指令,
RestAPI:通过HTTP接口下发指令来调度容器节点node;
WebUI:在图形化的界面,通过填写一些配置和拖拽一些控件,就可以进行容器节点node的调度了;
(2)ETCD 进程:是个数据库,用来存储一些元数据信息,各个node的状态等
(3)controller-manager 进程:协调调度的,是资源调度的协调中心;
(4)scheduler 进程:调度apiserver接口的主要实施者; -
在node端(客户端),有3个重要的进程:
(1)kubelet进程:与apiserver直接进行通信,也可以直接调度容器
(2)kube-proxy进程:用来创建虚拟网卡;
(3)docker进程:容器进程 -
大概流程:用户通过kubectl,RestAPI,WebUI中的1种下发指令或配置文件,到apiserver,经过controller-manage和scheduler协调调度,其调度还需要ETCD元数据的支持,最终生成一个调度的指令给apiserver,apiserver最终将这些指令下发给node节点,对node进行容器的创建,销毁,扩张等,各个node的状态上报给apiserver,并将状态记录到ETCD中
2.K8S的基本概念
-
pod:调度的最小单位,由docker容器+pause容器组成(pod其实也可以是多个docker容器,但是大多数时候是一个应用容器+一个pause(也是docker docker容器,用来传递指令的)),
-
deploment:维持pod的数量,一个deploment可以创建多个pod
-
ymal文件:将kubectl run。。等指令通过配置文件来运行
-
service:如何对外暴露接口,做负载均衡的操作?将多个pod抽象为一个服务,作用:对内的多容器做负载均衡,对外做统一的接口映射
假设deploment1有3个pod,2个在node1节点上,1个在node2节点上;
deploment2有3个pod,1个在node1节点上,2个在node2节点上;
kube-proxy会在整个集群层面会抽象成一个大型交换机,给红色deploment的pod分配一个ip,外部的请求到了该ip和端口后,负载均衡的分发到不同的服务实例上;褐色的pod操作类似
-
service之间如何进行通信?即:上图中红色的service1和褐色的service2如何通信?
(1)因为在同一个虚拟交换机上,所以可以通过IP进行通信
(2)通过域名解析DNS:服务之间相互访问,只需要输入另一个服务的service名字即可,因为DNS可以解析service名字为IP -
ingress:因为用户只知道master的公网ip,虚拟ip是无法直接访问到的,如何将虚拟的ip映射到外部,让一个东西代理一下,最终可以访问到这个ip,这个东西就是ingress。ingress其实是做http端口的映射的,用户通过域名来访问服务svc1,svc1又对应着虚拟的ip,虚拟ip再往下又自动集成负载均衡,将请求均匀的打到各个机器上,此时的ingress起到代理的作用
外部只能通过ip去访问,因为外部的宿主机并没有配置的kube-proxy服务器作为其服务器,可能就是配置了114.114.114.114或者8.8.8.8
3.实操K8S
-
实操:kubernetes online网站
https://www.katacoda.com/courses/kubernetes/playground -
(1)查看集群信息:master $ kubectl cluster-info
-
查看pod:master $ kubectl get pod
-
指定一个httpd镜像,会起一个apache服务:master $ kubectl run d1 --image httpd:alpine --port 80
查看资源:master $ kubectl get deployments
最终是以docker的形式在node上启动的:在node上输入:node01 $ docker ps|grep httpd
-
修改副本replicas的数量,修改完会立即生效:master $ kubectl edit deployments d1
-
在node上输入:docker stop 45关闭一个容器,但是deploment会监听维持的pod的数量是2,实际运行的数量为1了,他就会立即启动一个pod
-
实操service相关操作:
master $ kubectl expose deployment d1 --target-port 80 --type NodePort
master $ kubectl get svc
master $ curl 10.99.177.83
-
service之间进行通信(DNS服务)的实操:
服务1:d1 httpd镜像
服务2:d2 nginx镜像
master $ kubectl run d2 --image nginx:alpine --port 80
master $ kubectl expose deployment d2 --target-port=80 --type NodePort
master $ kubectl get svc
master $ kubectl exec -it d2-58759f8c6-9nd4q sh ## 直接输入d2-,按下Tab会自动补充容器ID
在d2容器内部输入curl d1,可以直接访问其资源,curl d1等价于curl 服务d1的虚拟ip,其DNS服务是在虚拟交换机上
-
ingress实操:
(1)首先配置ingress:参考:https://github.com/sunwu51/notebook/blob/master/19.07/ingress-deployment.yml
(2)输入ifconfig,查看本机的ip
(3)复制ingress-deployment.yml中的内容,在最后一行,修改ip:
(4) master $ vim ing-dep.yml
将复制的内容复制进去
(5)master $ kubectl apply -f ing-dep.yml
-f表示指定文件,回车后会创建以下的几种资源
(6)创建一个配置文件:vim ing-conf.yml,将https://github.com/sunwu51/notebook/blob/master/19.07/ingress-conf.yml的内容复制进去,并修改host和serviceName
master $ kubectl apply -f ing-conf.yml
(7)master $ curl -H “Host:a.b.c” 172.17.0.41
以a.b.c为本机的ip就可以访问It works!
用户可以通过访问不同域名a.b.c就可以访问到不同的服务
(8)可以再加一条:a.b.d去映射d2这个service
master $ kubectl apply -f ing-conf.yml
master $ curl -H “Host:a.b.d” 172.17.0.41
通过a.b.d可以访问到Nginx的服务
参考:
https://www.bilibili.com/video/av61990770