k8s微服务

一 、什么是微服务

用控制器来完成集群的工作负载,那么应用如何暴漏出去?需要通过微服务暴漏出去后才能被访问

  • Service是一组提供相同服务的Pod对外开放的接口。

  • 借助Service,应用可以实现服务发现和负载均衡。

  • service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

二、微服务的类型

 示例:

#生成控制器文件并建立控制器
[root@k8s-master ~]# kubectl create deployment timinglee --image myapp:v1  --replicas 2 --dry-run=client -o yaml > timinglee.yaml

#生成微服务yaml追加到已有yaml中
[root@k8s-master ~]# kubectl expose deployment timinglee --port 80 --target-port 80 --dry-run=client -o yaml >> timinglee.yaml

[root@k8s-master ~]# vim timinglee.yaml

[root@k8s-master ~]# kubectl apply  -f timinglee.yaml
deployment.apps/timinglee created
service/timinglee created

[root@k8s-master ~]# kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   19h
timinglee    ClusterIP   10.99.127.134   <none>        80/TCP    16s
微服务默认使用iptables调度

[root@k8s-master ~]# kubectl get services  -o wide
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE    SELECTOR
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   19h    <none>
timinglee    ClusterIP   10.99.127.134   <none>        80/TCP    119s   app=timinglee            

#集群内部IP 134

#可以在火墙中查看到策略信息
[root@k8s-master ~]# iptables -t nat -nL
KUBE-SVC-I7WXYK76FWYNTTGM  6    --  0.0.0.0/0            10.99.127.134        /* default/timinglee cluster IP */ tcp dpt:80

三、ipvs模式

  • Service 是由 kube-proxy 组件,加上 iptables 来共同实现的

  • kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源

  • IPVS模式的service,可以使K8s集群支持更多量级的Pod

3.1 ipvs模式配置方式

1 在所有节点中安装ipvsadm

[root@k8s-所有节点 pod]yum install ipvsadm –y

[root@k8s-master ~]# dnf install ipvsadm -y
[root@k8s-node1 ~]# dnf install ipvsadm -y
[root@k8s-node2 ~]# dnf install ipvsadm -y

2 修改master节点的代理配置

[root@k8s-master ~]# kubectl -n kube-system edit cm kube-proxy
 

3 重启pod,在pod运行时配置文件中采用默认配置,当改变配置文件后已经运行的pod状态不会变化,所以要重启pod

[!NOTE]

切换ipvs模式后,kube-proxy会在宿主机上添加一个虚拟网卡:kube-ipvs0,并分配所有service IP

四、微服务类型详解

4.1 clusterip

特点:

clusterip模式只能在集群内访问,并对集群内的pod提供健康检测和自动发现功能

示例:

[root@k8s-master ~]# kubectl run testpod --image myapp:v1
pod/testpod created
[root@k8s-master ~]# kubectl get pods
NAME      READY   STATUS    RESTARTS   AGE
testpod   1/1     Running   0          3s
[root@k8s-master ~]# kubectl get pods -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE                      NOMINATED NODE   READINES                S GATES
testpod   1/1     Running   0          18s   10.244.1.27   k8s-node2.timinglee.org   <none>           <none>
[root@k8s-master ~]# kubectl get pods -o wide --show-labels
NAME      READY   STATUS    RESTARTS   AGE   IP            NODE                      NOMINATED NODE   READINES                S GATES   LABELS
testpod   1/1     Running   0          45s   10.244.1.27   k8s-node2.timinglee.org   <none>           <none>                            run=testpod
[root@k8s-master ~]# kubectl expose pod testpod --port 80 --target-port 80 --dry-run=client -o yaml > testpod-svc.yml
[root@k8s-master ~]# vim testpod-svc.yml

[root@k8s-master ~]# kubectl run busybox -it --image busyboxplus:latest
/ # curl testpod.default.svc.cluster.local.
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
/ # curl testpod.default.svc.cluster.local.
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>

/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local timinglee.org
options ndots:5

/ # nslookup  testpod.default.svc.cluster.local.
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      testpod.default.svc.cluster.local.
Address 1: 10.106.59.102 testpod.default.svc.cluster.local
/ # nslookup  testpod
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      testpod
Address 1: 10.106.59.102 testpod.default.svc.cluster.local

[root@k8s-master ~]# kubectl delete -f testpod-svc.yml
service "testpod" deleted 

4.2 ClusterIP中的特殊模式headless

headless(无头服务)

对于无头 Services 并不会分配 Cluster IP,kube-proxy不会处理它们, 而且平台也不会为它们进行负载均衡和路由,集群访问通过dns解析直接指向到业务pod上的IP,所有的调度有dns单独完成

[root@k8s-master ~]# vim testpod-svc.yml 

 

/ # curl testpod
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
/ # curl testpod/hostname.html
testpod
/ # curl testpod/hostname.html
testpod

[root@k8s-master ~]# kubectl delete -f testpod-svc.yml
service "testpod" deleted

4.3 nodeport

通过ipvs暴漏端口从而使外部主机通过master节点的对外ip:<port>来访问pod业务

其访问过程为:

示例:

[root@k8s-master ~]# vim testpod-svc.yml

[root@k8s-master ~]# kubectl apply -f testpod-svc.yml
service/testpod created
[root@k8s-master ~]# kubectl get svc testpod
NAME      TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
testpod   NodePort   10.101.130.40   <none>        80:30774/TCP   26s

[!NOTE]

nodeport默认端口

nodeport默认端口是30000-32767,超出会报错

#####直接指定端口   若超过32767

[root@k8s-master ~]# vim testpod-svc.yml

如果需要使用这个范围以外的端口就需要特殊设定

[root@k8s-master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml

 

[!NOTE]

添加“--service-node-port-range=“ 参数,端口范围可以自定义

修改后api-server会自动重启,等apiserver正常启动后才能操作集群

集群重启自动完成在修改完参数后全程不需要人为干预

[root@k8s-master ~]# kubectl delete -f testpod-svc.yml
service "testpod" deleted 

4.4 loadbalancer

云平台会为我们分配vip并实现访问,如果是裸金属主机那么需要metallb来实现ip的分配

 

示例:

[root@k8s-master ~]#  vim testpod-svc.yml
 

LoadBalancer模式适用云平台,裸金属环境需要安装metallb提供支持 

4.5 metalLB

官网:Installation :: MetalLB, bare metal load-balancer for Kubernetes

metalLB功能

为LoadBalancer分配vip

部署方式

修改文件中镜像地址,与harbor仓库路径保持一致

[root@k8s-master ~]# mkdir metalLB
[root@k8s-master ~]# cd metalLB/
[root@k8s-master metalLB]# ls
[root@k8s-master metalLB]# ls
metallb-native.yaml  metalLB.tag.gz
[root@k8s-master metalLB]# vim metallb-native.yaml

###部署服务 

#####配置分配地址段

 [root@k8s-master metalLB]#  vim configmap.yml

4.6 externalname

  • 开启services后,不会被分配IP,而是用dns解析CNAME固定域名来解决ip变化问题

  • 一般应用于外部业务和pod沟通或外部业务迁移到pod内时

  • 在应用向集群迁移过程中,externalname在过度阶段就可以起作用了。

  • 集群外的资源迁移到集群时,在迁移的过程中ip可能会变化,但是域名+dns解析能完美解决此问题

示例:

[root@k8s-master ~]# kubectl delete -f testpod-svc.yml
service "testpod" deleted
[root@k8s-master ~]# vim testpod-svc.yml

[root@k8s-master ~]# kubectl delete -f testpod-svc.yml
service "testpod" deleted

五、Ingress-nginx

官网:

Installation Guide - Ingress-Nginx Controller

5.1 ingress-nginx功能

 

  • 一种全局的、为了代理不同后端 Service 而设置的负载均衡服务,支持7层

  • Ingress由两部分组成:Ingress controller和Ingress服务

  • Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力。

  • 业界常用的各种反向代理项目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已经为Kubernetes 专门维护了对应的 Ingress Controller。

5.2 部署ingress

实验素材

[root@k8s-master ~]# mkdir ingress
[root@k8s-master ~]# cd ingress/
[root@k8s-master ingress]# ls
[root@k8s-master ingress]# mkdir app
[root@k8s-master ingress]# cd app/
[root@k8s-master app]# ls
[root@k8s-master app]# kubectl create deployment myappv1 --image myapp:v1 --dry-run=client -o yaml > myapp-v1.yml
[root@k8s-master app]# vim myapp-v1.yml

[root@k8s-master app]# cp myapp-v1.yml myapp-v2.yml
[root@k8s-master app]# vim myapp-v2.yml

[root@k8s-master app]# kubectl apply -f myapp-v1.yml
deployment.apps/myappv1 created
[root@k8s-master app]# kubectl apply -f myapp-v2.yml
deployment.apps/myappv2 created
[root@k8s-master app]# kubectl expose deployment myappv1 --port 80 --target-port 80 --dry-run=client -o yaml >> myapp-v1.yml
[root@k8s-master app]# kubectl expose deployment myappv2 --port 80 --target-port 80 --dry-run=client -o yaml >> myapp-v2.yml
[root@k8s-master app]# vim myapp-v1.yml

[root@k8s-master app]# vim myapp-v2.yml

5.2.1 下载部署文件

[root@k8s-master app]# cd ..
[root@k8s-master ingress]# ls
app  deploy.yaml
[root@k8s-master ingress]# vim deploy.yaml

5.2.2 安装ingress

[root@k8s-master ~]# vim deploy.yaml

 #修改微服务为loadbalancer

[root@k8s-master ingress]# kubectl -n ingress-nginx edit svc ingress-nginx-controller

[!NOTE]

在ingress-nginx-controller中看到的对外IP就是ingress最终对外开放的ip

5.2.3 测试ingress

[root@k8s-master ingress]# vim ingress1.yml

[!NOTE]

ingress必须和输出的service资源处于同一namespace

5.3 ingress 的高级用法

5.3.1 基于路径的访问

生成ingress

[root@k8s-master ingress]#  ls
app  deploy.yaml  ingress1.yml  ingress-nginx-1.11.2.tag.gz
[root@k8s-master ingress]# cp ingress1.yml ingress2.yml
[root@k8s-master ingress]# vim ingress2.yml

[root@k8s-master ingress]# vim /etc/hosts

 

[root@k8s-master ingress]# kubectl delete  -f ingress2.yml
ingress.networking.k8s.io "myapp" deleted

5.3.2 基于域名的访问

[root@k8s-master ingress]# cp ingress2.yml ingress3.yml
[root@k8s-master ingress]# vim ingress3.yml

[root@k8s-master ingress]# vim /etc/hosts

 

5.3.3 建立tls加密

#建立证书

[root@k8s-master ingress]# openssl req -newkey rsa:2048 -nodes -keyout tls.key -x509 -days 365 -subj "/CN=nginxsvc/O=nginxsvc" -out tls.crt

#建立加密资源类型secret

[root@k8s-master ingress]# kubectl create secret tls  web-tls-secret --key tls.key --cert tls.crt
secret/web-tls-secret created

[!NOTE]

secret通常在kubernetes中存放敏感数据,他并不是一种加密方式,在后面课程中会有专门讲解

[root@k8s-master ingress]# cp ingress3.yml  ingress4.yml
[root@k8s-master ingress]# vim ingress4.yml
 

[root@k8s-master ingress]# kubectl apply -f ingress4.yml
ingress.networking.k8s.io/myapp configured

[root@k8s-master ingress]# kubectl delete -f ingress4.yml
ingress.networking.k8s.io "myapp" deleted

5.3.4 建立auth认证

#建立认证文件

[root@k8s-master ingress]#  dnf install httpd-tools -y
[root@k8s-master ingress]# htpasswd -cm auth  lee
New password:
Re-type new password:
Adding password for user lee
[root@k8s-master ingress]# cat auth
lee:$apr1$0mCu4T3l$BFqJaLTzfAkjInTijB3Qe/

#建立认证类型资源

#建立ingress5基于用户认证的yaml文件

[root@k8s-master ingress]# cp ingress2.yml ingress5.yml
[root@k8s-master ingress]# vim ingress5.yml

[root@k8s-master ingress]# kubectl delete -f ingress5.yml
ingress.networking.k8s.io "myapp" deleted

5.3.5 rewrite重定向

[root@k8s-master ingress]# cp ingress5.yml ingress6.yml
[root@k8s-master ingress]# vim ingress6.yml

 

[root@k8s-master ingress]# kubectl delete -f ingress6.yml
ingress.networking.k8s.io "myapp" deleted
[root@k8s-master ingress]# vim ingress6.yml

[root@k8s-master ingress]# kubectl delete -f ingress6.yml
ingress.networking.k8s.io "myapp" deleted

六、Canary金丝雀发布

6.1 么是金丝雀发布

金丝雀发布(Canary Release)也称为灰度发布,是一种软件发布策略。

主要目的是在将新版本的软件全面推广到生产环境之前,先在一小部分用户或服务器上进行测试和验证,以降低因新版本引入重大问题而对整个系统造成的影响。

是一种Pod的发布方式。金丝雀发布采取先添加、再删除的方式,保证Pod的总量不低于期望值。并且在更新部分Pod后,暂停更新,当确认新Pod版本运行正常后再进行其他版本的Pod的更新。

6.2 Canary发布方式

 

其中header和weiht中的最多

6.2.1 基于header(http包头)灰度

  • 通过Annotaion扩展

  • 创建灰度ingress,配置灰度头部key以及value

  • 灰度流量验证完毕后,切换正式ingress到新版本

  • 之前我们在做升级时可以通过控制器做滚动更新,默认25%利用header可以使升级更为平滑,通过key 和vule 测试新的业务体系是否有问题。

示例:

 [root@k8s-master ingress]# vim ingress1.yml

[root@k8s-master ingress]# kubectl apply  -f ingress1.yml
ingress.networking.k8s.io/myappv1 created
[root@k8s-master ingress]# cp ingress2.yml ingress7.yml
[root@k8s-master ingress]# vim ingress7.yml

6.2.2 基于权重的灰度发布

  • 通过Annotaion拓展

  • 创建灰度ingress,配置灰度权重以及总权重

  • 灰度流量验证完毕后,切换正式ingress到新版本

示例:

[root@k8s-master ingress]# kubectl delete  -f ingress7.yml
ingress.networking.k8s.io "myapp" deleted
[root@k8s-master ingress]# vim ingress7.yml

[root@k8s-master ingress]# kubectl apply  -f ingress7.yml
ingress.networking.k8s.io/myappv2 created
[root@k8s-master ingress]# vim check_ingress.sh

[root@k8s-master ingress]# kubectl delete  -f ingress7.yml
ingress.networking.k8s.io "myappv2" deleted
[root@k8s-master ingress]# kubectl delete  -f ingress1.yml
ingress.networking.k8s.io "myappv1" deleted

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56422.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

斯坦福大学提出电影剧本可视化工具ScriptViz:能够根据剧本中的文本和对话自动检索相关的电影画面,帮助剧作家更好地构思和调整剧情

title:斯坦福大学提出电影剧本可视化工具ScriptViz&#xff1a;能够根据剧本中的文本和对话自动检索相关的电影画面&#xff0c;帮助剧作家更好地构思和调整剧情 斯坦福大学的研究者们开发了一个电影剧本可视化工具ScriptViz工具&#xff0c;ScriptViz的工作原理可以简单地理解…

基于java SpringBoot和Vue校园食堂网站管理系统设计

摘要 本文旨在探讨一种基于Java Spring Boot和Vue框架的校园食堂网站管理系统的设计。首先&#xff0c;介绍了系统开发的背景及意义&#xff0c;即为了提高校园食堂的管理效率和改善学生的就餐体验。接着&#xff0c;详细阐述了系统的技术选型&#xff0c;包括后端采用Spring …

vue+ElementUI—实现基础后台管理布局(sideBar+header+appMain)(附源码)

后台管理的模板很多&#xff0c;vue本身就提供了完整的vue-template-admin&#xff0c;vue-admin-beautiful等后台管理系统化框架&#xff0c;但是这些框架正是因为成体系而显得繁重。假如你想搭建一个静态的后台管理模板页面和几个单独的菜单页面&#xff0c;直接就上框架是否…

C#源码安装ZedGraph曲线显示组件

在软件开发里,数据的显示,已经是软件开发的大头。 如果让数据更加漂亮地、智能地显示,就是软件的核心价值了。 因为不管数据千万条,关键在于用户看到图。因为一个图表,就可以表示整个数据的趋势, 或者整个数据的走向,数据频度和密码。所以图表显示是软件的核心功能,比如…

【计网】从零开始理解UDP协议 --- 理解端口号和UDP结构

我依旧敢和生活顶撞&#xff0c; 敢在逆境里撒野&#xff0c; 直面生活的污水&#xff0c; 永远乐意为新一轮的月亮和日落欢呼。 --- 央视文案 --- 从零开始理解UDP协议 1 再谈端口号2 理解UDP 报头结构3 UDP 的特点4 UDP 的缓冲区5 UDP 使用注意事项 1 再谈端口号 之前我…

Ubuntu 24.04 在 BPI-F3 上通过 SD 卡安装并从 NVME 运行

github 代码&#xff1a; https://github.com/rcman/BPI-F3 Ubuntu 24.04 现在正在我的 BPI-F3 上运行。很快会为 YouTube 制作一个视频。 这应该适用于任何版本的 Linux&#xff0c;仅在 Ubuntu 24.04 上测试过 入门 下载 Bianbu映像并使用您最喜欢的工具将其映像到微型 SD 卡…

【win10】VMware Workstation 16安装win10专业版及安装VMware Tools操作说明

参考链接 VMware虚拟机安装win10系统教程&#xff08;巨细&#xff09;_vmware安装win10-CSDN博客https://blog.csdn.net/gdidea/article/details/129523700 win10专业版安装说明 下载win10安装包 百度网盘 链接: https://pan.baidu.com/s/1kf4ORdXYgcqwAz2j86LSZw?pwdk4…

MySQL-数据库的基础操作 o(´^`)o

文本目录&#xff1a; ❄️一、数据库操作&#xff1a; ☑ 1、查看所有的数据库&#xff1a; ☑ 2、创建数据库&#xff1a; ☑ 3、使用数据库&#xff1a; ☑ 4、删除数据库&#xff1a; ❄️二、常用的数据类型&#xff1a; ➷ 1、数值类型&#xff1a; ➷ 2、字符串类型&a…

【2D/3D-Lidar-SLAM】 Cartographer详细解读

【2D/3D-Lidar-SLAM】 Cartographer详细解读 1. 摘要2. Cartographer系统数据处理流程2.1. 数据获取&#xff08;Input Sensor Data&#xff09;2.2 姿态外推器&#xff08;PoseExtrapolator&#xff09;2.3 局部建图&#xff08;Local SLAM&#xff09; 3. 关键模块实现 3.1 局…

MyBatis XML映射文件

XML映射文件 XML映射文件的名称与Mapper接口名称一致&#xff0c;并且将XML映射文件和Mapper接口放置在相同包下&#xff08;同包同名&#xff09;XML映射文件的namespace属性为Mapper接口全限定名一致XML映射文件中SQL语句的id与Mapper接口中的方法名一致&#xff0c;并保持返…

某知名国企面试题

引言 金九银十&#xff0c;求职热潮再度来袭。最近&#xff0c;有位同学去一家知名国企应聘&#xff0c;回来后带回了一套面试题。这套面试题非常典型&#xff0c;其中包含了许多供应链金融方面的典型问题。这些问题很有分享的价值&#xff0c;大家也可以先自己独立思考一下&a…

Chromium cookies数据存储位置介绍c++

一、cookies数据库存储位置&#xff1a; C:\Users\Administrator\AppData\Local\Chromium\User Data\Default\Network\Cookies 二 、数据库操作类&#xff1a; net\extras\sqlite\sqlite_persistent_cookie_store.cc net\extras\sqlite\sqlite_persistent_cookie_store.h …

003 Springboot操作RabbitMQ

Springboot整合RabbitMQ 文章目录 Springboot整合RabbitMQ1.pom依赖2.yml配置3.配置队列、交换机方式一&#xff1a;直接通过配置类配置bean方式二&#xff1a;消息监听通过注解配置 4.编写消息监听发送测试5.其他类型交换机配置1.FanoutExchange2.TopicExchange3.HeadersExcha…

4D-fy: Text-to-4D Generation Using Hybrid Score Distillation Sampling技术路线

这篇文章分为四部分&#xff0c;首先从2021年的CLIP说起。 这篇论文的主要工作是提出了一种名为 CLIP&#xff08;Contrastive Language-Image Pre-training&#xff09; 的模型&#xff0c;它通过自然语言监督学习视觉模型&#xff0c;以实现视觉任务的零样本&#xff08;zer…

20 Shell Script输入与输出

标出输入、标准输出、错误输出 一、程序的基本三个IO流 一&#xff09;文件描述符 ​ 任何程序在Linux系统中都有3个基本的文件描述符 ​ 比如: ​ cd/proc/$$/fd ​ 进入当前shell程序对于内核在文件系统的映射目录中: [rootlocalhost ~]# cd /proc/$$/fd [rootlocalhos…

Web集群服务-代理和负载均衡

1. 概述 1. 用户----->代理--->Web节点,后面只有一个节点,一般使用的是nginx代理功能即可 2. 后面如果是集群需要使用nginx负载均衡功能 2. 代理分类 代理分类方向应用正向代理用户(服务器)-->代理--->外部(某网站)服务器通过代理实现共享上网/访问公网反向代理用…

Linux:进程控制(三)——进程程序替换

目录 一、概念 二、使用 1.单进程程序替换 2.多进程程序替换 3.exec接口 4.execle 一、概念 背景 当前进程在运行的时候&#xff0c;所执行的代码来自于自己的源文件。使用fork创建子进程后&#xff0c;子进程执行的程序中代码内容和父进程是相同的&#xff0c;如果子进…

Python基础语法条件

注释 注释的作用 通过用自己熟悉的语言&#xff0c;在程序中对某些代码进行标注说明&#xff0c;这就是注释的作用&#xff0c;能够大大增强程序的可读性。 注释的分类及语法 注释分为两类&#xff1a;单行注释 和 多行注释。 单行注释 只能注释一行内容&#xff0c;语法如下…

跟着小土堆学习pytorch(一)——Dataset

文章目录 一、前言二、dataset三、代码展示 一、前言 pytorch也是鸽了很久了&#xff0c;确定了下&#xff0c;还是用小土堆的教程。 kaggle获取数据集 二、dataset dateset&#xff1a;数据集——提供一种方式去获取数据及其标签 如何获取数据及其标签以及总共多少个数据…

PostgreSQL学习笔记六:模式SCHEMA

模式&#xff08;Schema&#xff09; PostgreSQL中的模式&#xff08;Schema&#xff09;是一个命名的数据库对象集合&#xff0c;包括表、视图、索引、数据类型、函数、存储过程和操作符等。模式的主要作用是组织和命名空间数据库对象&#xff0c;使得同一个数据库中可以包含…