k8s微服务

news2024/11/25 22:55:28

一 、什么是微服务

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

  • 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.coloradmin.cn/o/2202146.html

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

相关文章

全网首创Windows Powershell 批量创建、重命名和拷贝文件夹和文件到指定目录

哈喽大家好&#xff0c;欢迎来到虚拟化时代君&#xff08;XNHCYL&#xff09;。 “ 大家好&#xff0c;我是虚拟化时代君&#xff0c;一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…&#xff08;每天更新不间断&#xff0c;福利…

Redis 完整指南:命令与原理详解

目录 1. Redis 概述什么是 RedisRedis 应用场景 2. 安装与启动Redis 安装步骤源代码安装使用包管理器安装&#xff08;以 Ubuntu 为例&#xff09; 编译与启动命令编客户端连接 3. Redis 存储结构KV 存储结构数据结构类型String&#xff08;字符串&#xff09;List&#xff08;…

selenium有多个frame页时的操作方法(5)

之前文章我们提到&#xff0c;在webdriver.WebDriver类有一个switch_to方法&#xff0c;通过switch_to.frame()可以切换到不同的frame页然后才再定位某个元素做一些输入/点击等操作。 比如下面这个测试网站有2个frame页&#xff1a;http://www.sahitest.com/demo/framesTest.h…

支付宝开放平台-开发者社区——AI 日报「10 月 10 日」

1 AI逆向绘画火了&#xff01;一键重绘梵高《星空》&#xff0c;来自华盛顿大学 量子位&#xff5c;阅读原文 这项魔法来自华盛顿大学&#xff0c;项目名为Inverse Painting&#xff0c;相关论文已入选SIGGRAPH Asia 2024&#xff0c;其中两位作者还是东北大学&#xff08;Bo…

车载SerDes历史和发展概述

1. 场景起源 1.1 原始时代&#xff1a; 在古老的很久很久以前&#xff0c;摄像头和显示屏等接口是多种多样的&#xff0c;丰富多彩的。大家各凭本事&#xff0c;各显神通&#xff0c;在各种地盘上成立各种帮派。比如CVBS、DVP、AHD、USB。 CVBS&#xff0c;包括后面的AHD&a…

【puppeteer】wvp-puppeteer制作 过程

、 制作 docker build -t dxw-pupet4 -f .\dockerfile2 . docker run -itd --name dxw4 -p 35105:35105 dxw-pupet4 推送到私库 docker tag dxw-pupet4:latest dualvenregistry:5000/wvp-puppeteer:v1.0 docker push dualvenregistry:5000/wvp-puppeteer:v1.0 重启桌面上…

2024.10.9 QT事件

1.思维导图 2.一个圆形根据wsad上下左右移动&#xff0c;超出界限则不移动。鼠标点击和双击事件测试。 1.main.cpp #include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);MainWindow w;w.show();re…

JAVA《接口》

文章目录 一、接口是什么&#xff1f;1.1 接口的概念1.2 接口与类的相似点和区别1.3 接口的特性 二、接口的使用2.1 接口的实现2.2 实现多个接口2.3 接口之间的扩展(继承) 三、接口的使用实例3.1 Comparable接口3.2 Comparator接口3.3 Clonable接口3.3.1 使用Clonable接口3.3.2…

Linux——cp-mv-rm命令

cp命令 复制文件 cp test01.txt test02.txt 复制文件夹 cp -r hsy01 hsy02 mv命令 移动文件/文件夹 rm命令 删除文件 rm test.txt 删除文件夹&#xff08;目录 rm -r hsy01 通配符 * 匹配任意内容 注意* 位置 强制删除-f root超级管理员

数字化转型的深度解析:塑造未来企业的关键策略

在当今技术飞速发展的背景下&#xff0c;数字化转型&#xff08;_Digital Transformation_&#xff09;已成为企业保持竞争力的必要手段。随着云计算、物联网&#xff08;IoT&#xff09;、大数据和人工智能等技术的不断成熟&#xff0c;企业通过数字化手段优化业务流程、提升客…

ESXI 的下载 2024 版

ESXI 的下载 前言 最近收到了部分小伙伴的反馈&#xff0c;VMware 的下载官网上 ESXI 自动跳转进入了 BroadCom 的支持页面&#xff0c;难以找到 ESXI 的官方资源&#xff0c;这里我将为大家做出下载的相关指引。 ESXI 下载指引 跳转进入 BroadCom 的支持页面 &#x1f449; …

Python | Leetcode Python题解之第467题环绕字符串中唯一的子字符串

题目&#xff1a; 题解&#xff1a; class Solution:def findSubstringInWraproundString(self, p: str) -> int:dp defaultdict(int)k 0for i, ch in enumerate(p):if i > 0 and (ord(ch) - ord(p[i - 1])) % 26 1: # 字符之差为 1 或 -25k 1else:k 1dp[ch] max…

Web Service Sender ParseError Invalid byte 1 of 1-byte UTF-8 sequence

说明 发送webservice报错 Invalid UTF-8 start byte 0xfc when using Web Service Sender Web Service Sender error ERROR MESSAGE: Error creating web service dispatch com.sun.xml.ws.streaming.XMLStreamReaderException: XML reader error: javax.xml.stream.XMLStream…

k8s之ingress-nginx-controller安装

作者&#xff1a;程序那点事儿 日期&#xff1a;2024/01/30 01:25 要在master节点上安装 helm repo add ingress-nginx Welcome - Ingress-Nginx Controller helm search repo ingress-nginx helm pull ingress-nginx/ingress-nginx --version 4.4.2 mv ingress-nginx-4.4.…

为Floorp浏览器添加搜索引擎及搜索栏相关设置. 2024-10-08

Floorp浏览器开源项目地址: https://github.com/floorp-Projects/floorp/ 以下内容同样适用于firefox和大部分基于firefox的桌面版浏览器 1.第一步 为Floorp浏览器添加搜索栏 (1.工具栏空白处 次键选择 定制工具栏 (2. 把 搜索框 拖动至工具栏 2.添加搜索引擎 以添加 搜狗搜索…

Ubuntu 18.04安装storcli查看阵列信息

rootCeph03:/opt/MegaRAID/storcli# cat /etc/issue Ubuntu 18.04.5 LTS \n \l 准备好storcli的安装包 解压 解压之后可以看到 根据系统版本选择 把storcli_1.18.11_all.deb包传到服务器 使用命令dpkg -I storcli_1.18.11_all.deb ./storcli64 show ./storcli64 /c1 show …

Acwing 贪心算法遗留

1.Huffman树 Acwing 148.合并果子 实现思路&#xff1a;构建一颗哈夫曼树&#xff0c;求最短带权路径长度&#xff08;树中所有的叶结点的权值乘上其到根结点的路径长度&#xff09; 每次选择重量最小的两堆进行合并使用小根堆存储每一堆果子&#xff0c;每次两次弹出堆顶元…

ML 系列:机器学习和深度学习的深层次总结( 15) — KNN — 第 1 部分

一、说明 K-最近邻 (KNN) 算法是一种流行的监督机器学习算法&#xff0c;用于分类和回归任务。它是非参数惰性学习算法的一个典型例子。KNN 被认为是一种惰性学习算法&#xff0c;因为它在训练阶段不对底层数据分布做出任何假设&#xff0c;也不从训练数据中学习特定模型。相反…

uniapp开发 使用vscode代替hbuilderx开发工具

前言&#xff1a;最近接手了一个uniapp项目&#xff0c;很久没有使用hbuilderx了&#xff0c;用着实在难受&#xff0c;并且还总报奇奇怪怪的错误&#xff0c;首次运行要下载很多插件&#xff0c;搜索文件也用不习惯&#xff0c;加上很多鼠标操作&#xff0c;实在是太影响开发效…

【MATLAB源码-第241期】基于simulink的异步buck降压电路仿真,输出UL IL UR以及PWM波形。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Buck变换器是一种直流降压转换器&#xff0c;旨在将较高的输入电压转换为较低的输出电压&#xff0c;并广泛应用于各种电源管理系统中。图中的Buck变换器模型通过一系列的电力电子元件和控制信号实现降压功能。 首先&#xf…