《前端运维》五、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就是一个代理服务器,什么是代理服务器呢?也就是当我们访问服务器的时候,请求不会直接请求到服务器,中间会有个代理,代理会预先于服务器处理这些请求,最后由代理决 ...
随机推荐
- POJ-2229 Sumsets(基础dp)
Farmer John commanded his cows to search for different sets of numbers that sum to a given number. T ...
- 一文搞定WeakHashMap
写在前面 在缓存场景下,由于内存是有限的,不能缓存所有对象,因此就需要一定的删除机制,淘汰掉一些对象.这个时候可能很快就想到了各种Cache数据过期策略,目前也有一些优秀的包提供了功能丰富的Cache ...
- shell脚本参数读取列表文件,循环执行时,要注意这个列表文件转换成 unix 格式
当报一些很奇怪的错,比如报错多了一个空格,但 vim 看打开没有,比如: 或者肉眼看上去路径正常,但却报路径不存在: 这种时候要使用 dos2unix 工具,把这个列表文件转换一下:
- HDK Include Header File (1.7)
Download 1.7 | 1.7.1 | 1.7.2 1.7.1 使用方法:编译选项->目录->C++包含文件->添加 [解压目录]\include 1.7.2 使用方法:编译选 ...
- Windows系统无法打开‘’网络发现‘’功能
Windows10无法开启网络发现 解决办法: 1. services.msc 2. 开启 SSDP Discovery ,设置 启动类型为 自动 ,服务状态为 启动 Windows7 无法开启网络发 ...
- “全栈合一 智慧运维”智和网管平台SugarNMS V9版本发布
以"管控万物 无所不能 无处不"在为产品创新理念,智和信通打造"全栈式"网络安全运维平台-智和网管平台SugarNMS.立足数字化.智能化.可视化.自动化,整合 ...
- 在 Node.js 中使用 ES6 模块 import 和 export
1.Node版本 >= 13 2.使用 ES6 模块 a.js export const A = 'A'; index.js import { A } from './a.js'; consol ...
- android启动时间测试
需要对比基线测试的情况: Kernel log: adb shell dmesg Event log: adb shell logcat –b events Logcat log: adb shell ...
- 一文详述:AI 网关与 API 网关到底有什么区别?
近年来AI 发展火热,大模型已经成为推动各行各业业务创新和增长的关键力量.随之而来问题是"企业该如何安全管理和部署AI应用的挑战?"AI基础架构的设计不仅要支持现有的业务需求,还要 ...
- npm install报错 SyntaxError: Unexpected end of JSON input while parsing near '...=GmVg\r\n-----END PGP'
解决方法: npm cache clean --force 然后重新执行:npm install即可