【kubernetes入门】快速了解和上手容器编排工具k8s

Kubernetes :最重要的三个概念: pod, deployment, service,
(同时也是3款最基本的资源,其他高级资源kube还有很多,此处不介绍,只介绍这三个最基本的概念)

Deployment

  • 实现自动化运维,维持pod数量 10台机器down 掉2个,又会自动启动新的2个补充
  • kubectl run d1 --image httpd:alpine --port 80
  • d1 是deployment 名字,用httpd这个镜像(会起一个apache服务器),版本是alpine,端口号是80
  • kubectl get deployments.
    查看这个deployment资源 ,这里启动了一个,但启动在什么地方呢?它最终以docker的形式在一个node上启动的

    docker ps |grep httpd,在node上查看
    kubectl edit deployments d1 回车 编辑配置文件(yum文件)修改节点个数成2,:wq保存关闭,就会立即生效,不必重新编译

    查看就会看到变成了2个(2/2既是)

    可以到node节点上查看,看到httpd已经有两个了

    此时可以手动停掉一个: docker stop e32 回车,可以看到dep还是两个,

service:

  • 将多个pod抽象成一个服务,
  • 整个集群可以抽象出一个虚拟的大的交换机interchanger,他可以分配ip, 外界有了请求,交换机就会根据ip分发到这三个pod上(3个pod抽象成一个服务),他自己会有负载均衡的算法(一个ip分配到那个副本上,应该是均匀分发到3个服务实例上,也就是这3个pod ), deployment2 也是这样工作。这个虚拟交换机就是kube-proxy 所抽象出的网卡,将这几个容器(pod)抽象成一个服务,最终形成的东西我们称之为service,
  • kubectl expose deployment d1 --target-port 80 --type NodePort 回车

    指定端口是80,type是 nodeport

    kubectl get svc 回车查看

    下边是k8s的默认服务,上边的是创建好的
    curl 10.103.157.41 回车

    可以在master节点上直接访问10.103.157.41(node)的资源, it works 是httpd镜像提供的默认页面,curl相当于从外部向内部访问。通过这个ip就能均匀散发到pod中
  • service解决了几个pod之间做负载均衡+ 对外统一接口映射(统一IP)
  • 我们的service之间要如何通信呢?A: docker compose可以实现,在k8s不再以docker为调度单位了,而是变成了pod

内部dns服务:

  • 会将ip映射为api接口,以便内部service互相访问
    kubectl run d2 --image nginx:alpine --port 80
    kubectl expose deployment d2 --target-port=80 --type=NodePort

    kubectl get svc 回车查看服务:

    kubectl exec -it d2-58759f8c6-h7mfj sh 回车进入服务的命令行窗口(58759f8c6是docker的id),通过sh进入
    clear 回车 先clear掉

    apk add curl回车 安装curl工具

    在d2中直接查看d1: 这是因为我们已经将dns配好了,d1这个service 的名字已经映射到了ip

ingress:

  • 让外部可以访问当内部的配置。例如 之前在master 节点中 curl + 虚拟IP(d1的)才能访问到d1(因为d1d2 在同一个网卡上,所以可以相互用内部dns访问),但是直接curl d1无效(因为外部机器配置的是它自己的dns,并没有配置内部的这个dns作为他的dns服务器,他的dns并没有配置d1能解析到哪个Ip), curl d1只能进入到d2中以该命令行的形式访问,现在我们就把curl d1配置为外部可以访问,就要配置ingress服务了.
  • 能让外部以虚拟IP的形式访问到 d1,d2 ,ingress是做http映射的,例如我们对外申请了一个域名,根据域名解析到某一个服务比如svc1,svc1又对应着它自己的虚拟的IP,该虚拟IP往下又集成了负载均衡,可以将请求均匀的打到各个机器上,ingress在这个时候起到了代理的作用,即域名 -> svc1
  • kubectl edit更新镜像 kubectl edit pod_IP

  • 因为我们默认的配置是没有ingress的,因此,在宿主机器上访问 curl d1会访问不到(刚是在d1这个服务里边curl d2是通的)用户在外不知道d1在集群内部的虚拟IP,只知道整个集群的公网IP
  • 此时我们新建ingress的配置文件,vim ing-dep.yml 回车,
  • kubectl edit更新镜像 kubectl edit pod_IP_02

  • 点击I 进入输入模式(拷贝https://github.com/sunwu51/notebook/blob/master/19.07/ingress-deployment.yml 这个脚本是创建很多资源用的yaml 文件,具体写法参考配置文件 .yml 写法小结, 什么是*.yml文件),右键粘贴,复制本机的ip(ifconfig查看本机ip配置,找到inet addr既是)到最后一行:wq保存退出
  • kubectl edit更新镜像 kubectl edit pod_持续集成_03

  • 此时我们kubectl apply -f ing-dep.yml 回车,可以看到创建了很多资源
  • kubectl edit更新镜像 kubectl edit pod_持续集成_04

  • 创建配置文件,vim ing-conf.yml,参考ingress-conf.yml, 修改servicename为d1 ,修改host随便起名a.b.c,
  • kubectl edit更新镜像 kubectl edit pod_kubectl edit更新镜像_05

  • 创建ingress, kubectl apply -f ing-conf.yml(为何资源类型是ingress? 见配置文件中kind节点是ingress,就指定了资源类型)
  • kubectl edit更新镜像 kubectl edit pod_IP_06

  • 此时我们就可以通过外网访问d1 了,curl -H“Host:a.b.c”172.17.0.41 ,以abc为host访问本机的IP ,配置不同的域名访问不同的svc(abc就是一个域名)
  • kubectl edit更新镜像 kubectl edit pod_持续集成_07

  • 也可以在加一条 abd为d2,保存
  • kubectl edit更新镜像 kubectl edit pod_docker_08

  • 说明: 一个ip可以配置很多个域名

还有一些关键点需要解释:

  1. 一个ip可以配置很多个域名
  2. pod是个逻辑概念,一个pod可以包含很多个容器,可以是docker,也可以是rocket, pod是kubernetes特有的概念。同一个pod中的容器共享同一个网路空间和存储空间(域名),可以分端口号 比如一个容器监听80,一个81, 一个82这这样,可以使用localhost 互相通信,
  3. replication controller就是用来管理pod的,可以把pod运行在不同的node上,此处和deployment一样?
  4. pod是短暂的,不是持续性的实体,重启时候IP会改变。所以有人修改过kube源码,让其重启IP不改变(愚蠢,真的有这样的团队,如果这样就不要用kube了,用method就挺好的,或者自研,因为IP改变是kube的核心理念)
  5. 怎样从前端指定正确的pod,这里可以使用service. kubernetes支持持久卷,可以持久化
  6. pod可以手动创建,也可以用Replication controller的模板创建出多个copy,
  7. kubectl edit更新镜像 kubectl edit pod_kubernetes_09

  8. 容器: 就是非常精简的虚拟机,例如一个完全的虚拟机上只跑一个qq,但还需要装一个完整的系统,此时就非常浪费资源了,能起2 3 十个docker是没问题的,但如果是起虚拟机的话,只能起5个
  9. redis是可以共享session数据的,以下是一体化的模型。因为承载不了这么多用户,所以搭建这么多tomcat,但要买很多机器,浪费硬件成本(一个服务器2-3万,好点的5万),如果一个机器只提供单一功能,例如用户下单/登录,声卡显卡驱动都不用但也装了(多余的应用程序,但只用到其中一个进程),就很浪费了

kubectl edit更新镜像 kubectl edit pod_kubectl edit更新镜像_10

  1. 一个docker只跑一个功能(只跑登录,或只下单,把一个功能跑到极致 )
    假设一台服务器能处理10w个并发(例如618期间10w个用户同时下单)
    如果只有两三个docker,人工维护就可以,但是很多docker就需要编排,
    以下是微型化的应用部署模型

kubectl edit更新镜像 kubectl edit pod_IP_11