前一篇啊,我们学完了基本的配置。这一篇,我们来看下服务部署的配置。我们先来看张图,理解下k8s的应用场景和调用流程:

  看上图,首先,master是控制节点,负责编排、管理、调度用户提交的作业。kube-apiserver负责api服务,它会处理集群的持久化数据并保存在etcd中、kube-scheduler负责调度、kube-controller-manager负责容器编排。

  node是计算节点,CRI(Container Runtime Interface)的远程调用接口,这个接口定义了容器运行时的各项核心操作。OCI(Open Container Initiative) 容器运行时通过OCI同底层的Linux操作系统进行交互。设备插件是用来管理宿主机物理设备的组件。gRPC是可以在任何环境中运行的现代开源高性能 RPC 框架。RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

  我们再来看张图,是我们开发时需要用到的架构图,很有用:

  Pod 是 K8S 中最小的可调度单元(可操作/可部署单元),它里面可以包含1个或者多个 Docker 容器,在 Pod 内的所有 Docker 容器,都会共享同一个网络、存储卷、端口映射规则,一个 Pod 拥有一个 IP,但这个 IP 会随着Pod的重启,创建,删除等跟着改变,所以不固定且不完全可靠,这也就是 Pod 的 IP 漂移问题。这个问题我们可以使用下面的 Service 去自动映射,Pod 是一个容器组,里面有很多容器,容器组内共享资源。

  希望批量启动和管理多个Pod实例,就可以使用deployment。有了Pod实例后就需要以固定的IP地址以负载均衡的方式访问多个Pod实例,就有了Service。

  下面我们就来看下如何部署:

  我们现需要编写一个配置文件:

mkdir deployment && cd deployment
vim deployment-user-v1.yaml

  文件的内容如下:

apiVersion: apps/v1  #API 配置版本
kind: Deployment #资源类型
metadata:
name: user-v1 #资源名称
spec:
selector:
matchLabels:
app: user-v1 #告诉deployment根据规则匹配相应的Pod进行控制和管理,matchLabels字段匹配Pod的label值
replicas: 3 #声明一个 Pod,副本的数量
template:
metadata:
labels:
app: user-v1 #Pod的名称
spec: #组内创建的 Pod 信息
containers:
- name: nginx #容器的名称
image: registry.cn-beijing.aliyuncs.com/zhangrenyang/nginx:user-v1 #使用哪个镜像
ports:
- containerPort: 80 #容器内映射的端口

  然后执行:

kubectl apply -f deployment-user-v1.yaml
deployment.apps/user-v1 created

  然后我们查看下状态:

kubectl get pod

  其中:

  • name 是 Pod的名称
  • READY 为容器状态,格式为可用容器/所有容器数量
  • STATUS 为 Pod 的运行状态
  • RESTARTS 为重启数量
  • AGE 为 Pod 运行时间

  Pod部署完了,下面我们需要部署下Services:

  deployment 是无状态的,deployment 并不会对 pod 进行网络通信和分发,Pod 的 IP 在运行时还会经常进行漂移且不固定,想访问服务需要使用 Service 组织统一的 Pod 访问入口,可以定义Service 来进行统一组织 Pod 服务访问,负责自动调度和组织deployment中 Pod 的服务访问,由于自动映射 Pod 的IP,同时也解决了 Pod 的IP漂移问题。

  我们同样创建一个user-service-v1.yaml并编辑内容:

apiVersion: v1
kind: Service
metadata:
name: service-user-v1
spec:
selector:
app: user-v1
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort

  启动它:

kubectl apply -f user-service-v1.yaml
service/service-user-v1 created

  查看状态:

kubectl get svc

  然后,我们可以在任何节点上访问:

curl http://172.31.178.169:30859
curl http://172.31.178.170:30859

  我们可能会根据请求路径前缀的匹配,权重,甚至根据 cookie/header 的值去访问不同的服务,为了达到这种负载均衡的效果,我们可以使用kubernetes的另一个组件ingress,ingress-nginx 是基于 nginx 的一个 ingress 实现。可以实现正则匹配路径,流量转发,基于 cookie header 切分流量(灰度发布)。

#wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.34.1/deploy/static/provider/baremetal/deploy.yaml
wget https://img.zhufengpeixun.com/deploy.yaml

  编辑vi deploy.yaml d$:

  namespace: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: http
+ nodePort: 31234
- name: https
port: 443
protocol: TCP
targetPort: https
+ nodePort: 31235 + image: registry.cn-hangzhou.aliyuncs.com/bin_x/nginx-ingress:v0.34.1@sha256:80359bdf124d49264fabf136d2aecadac729b54f16618162194356d3c78ce2fe

  拉取镜像并自动部署:

kubectl apply -f deploy.yaml

  查看pods部署状态:

kubectl -n ingress-nginx get svc

  下面我们编辑下vi ingress.yaml文件,ingress 服务的配置也是使用 yaml 文件进行管理。annotations 是 ingress 的主要配置项目,可以用来修改这些配置来修改 ingress 的行为。我们可以通过修改这些配置来实现灰度发布,跨域资源,甚至将 www.abc.com 重定向到 abc.com。rules 是 ingress 配置路径转发规则的地方,当我们去访问 /front 时, ingress 就会帮我们调度到 front-service-v1 这个 service 上面。path 可以是一个路径字符串,也可以是一个正则表达式。backend 则是 k8s 的 service 服务, serviceName 是服务名称, servicePort 是服务端口。backend 可以用来给 ingress 设置默认访问的 Service 服务。当请求不匹配 rules 中任何一条规则时,则会去走 backend 中的配置。

  

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
kubernetes.io/ingress.class: nginx
spec:
rules:
- http:
paths:
- path: /user
backend:
serviceName: user-service-v1
servicePort: 80
- path: /pay
backend:
serviceName: pay-service-v1
servicePort: 80
backend:
serviceName: user-service-v1
servicePort: 80

  启动:

kubectl apply -f ./ingress.yaml

  测试:

curl http://172.16.244.93:31234/user
curl http://172.16.244.94:31234/user
curl http://172.16.244.93:31234/pay
curl http://172.16.244.94:31234/pay

  查看:

kubectl  describe   ingress

  到此,我们的部署基本上就ok了。下面再继续学习后面的内容。

《前端运维》五、k8s--2pod、services与Ingress部署的更多相关文章

  1. 自动化运维工具Ansible之LNMP实践环境部署

    Ansible-实战指南-LNMP环境部署,并使用zabbix监控 主机规划 系统初始化:必要的系统初始化 基础组件包括:zabbix监控,mariadb(用于存放zabbix监控信息) 业务组件包括 ...

  2. 《前端运维》五、k8s--1安装与基本配置

    一.k8s基础概念与安装 k8s,即kubernetes是用于自动部署,扩展和管理容器化应用程序的开源系统.详细的描述就不多说了,官网有更详细的内容.简单来说,k8s,是一个可以操作多台机器调度部署镜 ...

  3. 《前端运维》五、k8s--3灰度发布、滚动更新与探针

    一.灰度发布 灰度发布是一种发布方式,也叫金丝雀发布,起源是矿工在下井之前会先放一只金丝雀到井里,如果金丝雀不叫了,就代表瓦斯浓度高.原因是金丝雀对瓦斯气体很敏感.灰度发布的做法是:会在现存旧应用的基 ...

  4. Linux运维五:定时任务crond服务

    一.crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动cro ...

  5. 《前端运维》三、Docker--2其他

    一.制作DockerFile docker的镜像类似于用一层一层的文件组成.inspect命令可以查看镜像或容器的的信息,其中Layers就是镜像的层文件,只读不能修改,基于镜像创建的容器会共享这些层 ...

  6. 高级运维(五):构建memcached服务、LNMP+memcached、使用Tomcat设置Session、Tomcat实现session共享

    一.构建memcached服务 目标: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 1> 安装memcached软件,并启动服务d ...

  7. Liunx运维(五)-信息显示与搜索文件命令

    文档目录: 一.uname:显示系统信息 二.hostname:显示或设置系统的主机名 三.dmesg:系统启动异常诊断 四.stat:显示文件或文件系统状态 五.du:统计磁盘空间使用情况 六.da ...

  8. 《前端运维》一、Linux基础--04Shell变量

    这一篇文章,我们就要开始学习正式的Shell语言部分的内容.那在开始之前,我们回忆一下,javascript语言,大体都包含了哪些内容?比如数据类型(对象.字符串.数值),数据结构(对象.数组).运算 ...

  9. 《前端运维》一、Linux基础--05Shell运算符

    今天我们来学习下Shell运算符,Shell跟其他的编程语言一样,也支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 那下面,我们就一一来学习一下这些运算符. ...

  10. 《前端运维》二、Nginx--1基本概念及安装

    一.Nginx基本概念 简单来说,Nginx就是一个代理服务器,什么是代理服务器呢?也就是当我们访问服务器的时候,请求不会直接请求到服务器,中间会有个代理,代理会预先于服务器处理这些请求,最后由代理决 ...

随机推荐

  1. 搭建高效攻防靶场vulfocus与Docker仓库管理实战:从听说到入门系列

    搭建高效攻防靶场vulfocus与Docker仓库管理实战:从听说到入门系列 vulfocus 简介 vulfocus,作为一款前沿的漏洞集成平台,它巧妙地将多种最新的CVE漏洞环境封装于Docker ...

  2. Winrar 免广告、去评估版的解决办法 ( 实测有效 )

    事件起因: 在打开 Winrar 压缩软件的时候,总是会弹出广告弹窗,而且上面还是显示评估版本. 解决办法: 1. 正常安装 Winrar 软件 2. 安装破解软件--Restorator http: ...

  3. springboot多文件上传、删除、下载到项目本地

    package com.example.demo.document; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IoUti ...

  4. 【赵渝强老师】Docker Swarm集群的数据持久化

    如果Docker Swarm集群中运行了mysql.nginx等服务,这些服务的数据如果没有挂载到宿主机中,那么容器一旦停止运行,那就意味着数据丢失. 有什么方法可以解决swarm集群中运行的服务能够 ...

  5. opengl在编译的过程中,glad使用

    我在编译的过程中,遇到:无法找到 -lglad这个错误.最后才发现对于glad的使用不能用-lglad.因为我们通过glad的在线服务可以得到一些文件,其中glad.c文件我们是需要放在我们的项目下面 ...

  6. vue 的常用指令以及作用 ·

    1. v-model 多用于表单元素实现双向数据绑定(同 angular 中的 ng-model) 2. v-for 格式: v-for="字段名 in(of) 数组 json" ...

  7. .NET高级调试 - 3.12 sosex实用的几个命令介绍

    简介 sosex是sos的一个拓展,主要目的是将一些繁琐的排查过程脚本化,比如探测死锁,设置断点等.更加方便快捷协助我们排查问题. 比较可惜的是,在.net core中不可用,作者已经不更新了. 更多 ...

  8. Kubernetes 跨 StorageClass 迁移 Persistent Volumes 完全指南

    大家好,我是米开朗基杨. KubeSphere 3.3.0 (不出意外的话~)本周就要 GA 了,作为一名 KubeSphere 脑残粉,我迫不及待地先安装 RC 版尝尝鲜,一顿操作猛如虎开启所有组件 ...

  9. 自学PHP笔记(四) PHP变量和常量

    PHP中变量有普通变量.可变变量和预定义变量,而常量就是普通变量和预定义变量. 1. 变量 在PHP中变量是内存中得一个命名单元,在系统中为程序中每个变量都分配一个存储单元,在这些存储单元中可以存储任 ...

  10. 蓝屏攻击 MS12-020

    目录 1.蓝屏攻击 MS12-020 搜索对应活跃主机win7蓝屏漏洞端口 Nessus 执行漏洞扫描 Metasploit 漏洞利用 msfconsole Armitage 1.蓝屏攻击 MS12- ...