《前端运维》五、k8s--2pod、services与Ingress部署
前一篇啊,我们学完了基本的配置。这一篇,我们来看下服务部署的配置。我们先来看张图,理解下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部署的更多相关文章
- 自动化运维工具Ansible之LNMP实践环境部署
Ansible-实战指南-LNMP环境部署,并使用zabbix监控 主机规划 系统初始化:必要的系统初始化 基础组件包括:zabbix监控,mariadb(用于存放zabbix监控信息) 业务组件包括 ...
- 《前端运维》五、k8s--1安装与基本配置
一.k8s基础概念与安装 k8s,即kubernetes是用于自动部署,扩展和管理容器化应用程序的开源系统.详细的描述就不多说了,官网有更详细的内容.简单来说,k8s,是一个可以操作多台机器调度部署镜 ...
- 《前端运维》五、k8s--3灰度发布、滚动更新与探针
一.灰度发布 灰度发布是一种发布方式,也叫金丝雀发布,起源是矿工在下井之前会先放一只金丝雀到井里,如果金丝雀不叫了,就代表瓦斯浓度高.原因是金丝雀对瓦斯气体很敏感.灰度发布的做法是:会在现存旧应用的基 ...
- Linux运维五:定时任务crond服务
一.crond简介 crond是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动cro ...
- 《前端运维》三、Docker--2其他
一.制作DockerFile docker的镜像类似于用一层一层的文件组成.inspect命令可以查看镜像或容器的的信息,其中Layers就是镜像的层文件,只读不能修改,基于镜像创建的容器会共享这些层 ...
- 高级运维(五):构建memcached服务、LNMP+memcached、使用Tomcat设置Session、Tomcat实现session共享
一.构建memcached服务 目标: 本案例要求先快速搭建好一台memcached服务器,并对memcached进行简单的添.删.改.查操作: 1> 安装memcached软件,并启动服务d ...
- Liunx运维(五)-信息显示与搜索文件命令
文档目录: 一.uname:显示系统信息 二.hostname:显示或设置系统的主机名 三.dmesg:系统启动异常诊断 四.stat:显示文件或文件系统状态 五.du:统计磁盘空间使用情况 六.da ...
- 《前端运维》一、Linux基础--04Shell变量
这一篇文章,我们就要开始学习正式的Shell语言部分的内容.那在开始之前,我们回忆一下,javascript语言,大体都包含了哪些内容?比如数据类型(对象.字符串.数值),数据结构(对象.数组).运算 ...
- 《前端运维》一、Linux基础--05Shell运算符
今天我们来学习下Shell运算符,Shell跟其他的编程语言一样,也支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 那下面,我们就一一来学习一下这些运算符. ...
- 《前端运维》二、Nginx--1基本概念及安装
一.Nginx基本概念 简单来说,Nginx就是一个代理服务器,什么是代理服务器呢?也就是当我们访问服务器的时候,请求不会直接请求到服务器,中间会有个代理,代理会预先于服务器处理这些请求,最后由代理决 ...
随机推荐
- Fluent Builder 模式
前言 以前最讨厌设计复杂方法调用, 就是那种需要一堆有逻辑规则的 config 作为参数的方法. 这种 config 通常是一个大对象, 有许多 property, property 之间有存在一些逻 ...
- 三牧校队训练题目 Solution
前置知识: 搜索 队列 栈 递归 (提高难度)记忆化搜索 T1:P1226 [模板]快速幂 暴力想法:\(a\times a\) 进行 \(b\) 次,每次 \(a\times a\mod p\). ...
- 痞子衡嵌入式:MCUBootUtility v6.3发布,支持获取与解析启动日志
-- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v5.3.0)发布过去一年了,期间痞子衡也做过三个版本更新,但不足以单独介绍.这一次痞子衡为大家带来了全新重要版本v6. ...
- 解决 SHADERed无法打开,报错 缺失XINPUT1_4.DLL 文件的办法
起因: 在给某个不知名的同事安装软件时遇到的一个问题,安装完成后打开软件报错:SHADERed无法打开,报错 缺失XINPUT1_4.DLL ,C++依赖项均已打上,卸载C++插件后依然报错只能找缺失 ...
- 【赵渝强老师】在Hive中使用Load语句加载数据
一.Hive中load语句的语法说明 Hive Load语句不会在加载数据的时候做任何转换工作,而是纯粹的把数据文件复制/移动到Hive表对应的地址.语法格式如下: LOAD DATA [LOCAL] ...
- 2024-10-08:用go语言,给定一个字符串 word 和一个整数 k,判断是否可以通过删除最少数量的字符使得该字符串成为 k 特殊字符串。 其中,k 特殊字符串满足字符串中任意两个字符的出现频率
2024-10-08:用go语言,给定一个字符串 word 和一个整数 k,判断是否可以通过删除最少数量的字符使得该字符串成为 k 特殊字符串. 其中,k 特殊字符串满足字符串中任意两个字符的出现频率 ...
- icache的dcache区别
iCache是指指令缓存,DCache是指数据缓存.iCache是专门用于存储指令的高速缓存,DCache是用于存储数据的高速缓存.iCache用于存储指令,在CPU执行时将指令从iCache中读取, ...
- axios 常见状态码
'100': 'Continue', '101': 'SwitchingProtocols', '102': 'Processing', '103': 'EarlyHints', '200': 'Ok ...
- 内核级流量治理引擎Kmesh八大新特性解读
本文分享自华为云社区<内核级流量治理引擎 Kmesh v0.5 发布!进击的Sidecarless服务网格>,作者:云容器大未来. 我们非常高兴地宣布 Kmesh v0.5.0 的发布.首 ...
- 10款每个Web 开发人员都应该知道的JavaScript 插件
那些从事 Web 开发工作的人肯定会注意到 JavaScript 的多功能性.与 ASP 或 PHP 不同,这种客户端编程语言为开发人员提供了多种可应用于项目的功能. 如果我们正在处理数据并希望丰富网 ...