快速了解和上手容器编排工具kubernetes

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
发布了582 篇原创文章 · 获赞 143 · 访问量 17万+

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/104359168
今日推荐