K8s 之微服务的定义及详细资源调用案例

news2024/9/23 8:15:41

什么是微服务

用控制器来完成集群的工作负载,那么应用如何暴漏出去?

需要通过微服务暴漏出去后才能被访问

  • Service是一组提供相同服务的Pod对外开放的接口。
  • 借助Service,应用可以实现服务发现和负载均衡。
  • service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

在这里插入图片描述

微服务的类型

微服务类型作用描述
ClusterIP默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问
NodePort将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIP
LoadBalancer在NodePort的基础上,借助cloud provider创建一个外部的负载均衡器,并将请求转发到 NodeIP:NodePort,此模式只能在云服务器上使用
ExternalName将服务通过 DNS CNAME 记录方式转发到指定的域名(通过 spec.externlName 设定

创建一个微服务

1、生成控制器文件并建立控制器

[root@k8s-master ~]# kubectl create deployment test --image myapp:v1  --replicas 2 --dry-run=client -o yaml > test.yml

[root@k8s-master yaml]# kubectl apply -f test.yml

2、生成微服务yaml追加到已有yaml中(当控制器存在并运行时才可追加成功)

[root@k8s-master ~]# kubectl expose deployment test --port 80 --target-port 80 --dry-run=client -o yaml >> test.yml

3、编辑微服务的yml文件

[root@k8s-master ~]# vim test.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: test
  name: test
spec:
  replicas: 2
  selector:
    matchLabels:
      app: test
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: test
    spec:
      containers:
      - image: myapp:v1
        name: myapp
---		#不同资源间用---隔开

apiVersion: v1
kind: Service
metadata:
  labels:
    app: test
  name: test
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: test

4、重新加载和查看微服务的信息:

[root@k8s-master ~]# kubectl apply  -f test.yaml

[root@k8s-master ~]# kubectl get services

在这里插入图片描述

微服务默认使用iptables调度

[root@k8s-master ~]# kubectl get services  -o wide

#可以在火墙中查看到策略信息
[root@k8s-master ~]# iptables -t nat -nL

ipvs模式

  • Service 是由 kube-proxy 组件,加上 iptables 来共同实现的
  • kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的 iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源
  • IPVS模式的service,可以使K8s集群支持更多量级的Pod

ipvs模式配置方式

1、在所有节点中安装ipvsadm

[root@k8s-master ~]# yum install ipvsadm –y

2、修改master节点的代理配置

[root@k8s-master ~]# kubectl -n kube-system edit cm kube-proxy
......
    metricsBindAddress: ""
    mode: "ipvs"	#设置kube-proxy使用ipvs模式
    nftables:
......

在这里插入图片描述

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

[root@k8s-master ~]# kubectl -n kube-system get  pods   | awk '/kube-proxy/{system("kubectl -n kube-system delete pods "$1)}'

[root@k8s-master ~]# ipvsadm -Ln

在这里插入图片描述

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

[root@k8s-master ~]# ip a 

在这里插入图片描述

微服务类型详解

clusterip

特点

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

1、修改yml文件

[root@k8s-master yaml]# vim clusterip.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tym
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tym
  template:
    metadata:
      labels:
        app: tym
    spec:
      containers:
      - image: myapp:v1
        name: myapp

---
apiVersion: v1
kind: Service
metadata:
  name: tym
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: tym
  type: ClusterIP

[root@k8s-master yaml]# vim clusterip.yml

2、service创建后集群DNS提供解析

[root@k8s-master metallb]# kubectl -n kube-system get svc
#查看clusterip

[root@k8s-master ~]# dig tym.default.svc.cluster.local @10.96.0.10
#查看服务的集群解析详情

在这里插入图片描述
集群 DNS 自动解析:

在这里插入图片描述

clusterip 中的特殊模式 headless

headless(无头服务)

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

[root@k8s-master ~]# vim clusterip-head.yml.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tym
spec:
  replicas: 2
  selector:
    matchLabels:
      app: tym
  template:
    metadata:
      labels:
        app: tym
    spec:
      containers:
      - image: myapp:v1
        name: myapp

---
apiVersion: v1
kind: Service
metadata:
  name: tym
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: tym
  type: ClusterIP
  clusterIP: None	#无头模式


[root@k8s-master ~]# kubectl apply -f clusterip-head.yml.yaml

查看服务的集群解析:

[root@k8s-master yaml]# dig tym.default.svc.cluster.local @10.96.0.10

在这里插入图片描述

效果演示:

创建一个pod,在容器内直接访问微服务,查看解析之后返回的结果

[root@k8s-master ~]# kubectl run test --image busyboxplus -it
......
/ # curl tym

在这里插入图片描述

nodeport

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

在这里插入图片描述

nodeport 在集群节点上绑定端口,一个端口对应一个服务

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

如果需要配置默认范围外的端口号,需要修改k8s的配置文件

1、编辑k8s的配置文件

[root@k8s-master ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
......
- --service-node-port-range=30000-40000
......

在这里插入图片描述

2、编辑 nodeport 控制器的 yml 文件

[root@k8s-master yaml]# vim nodeport.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tym
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nodeport
  template:
    metadata:
      labels:
        app: nodeport
    spec:
      containers:
      - image: myapp:v1
        name: myapp

---
apiVersion: v1
kind: Service
metadata:
  name: nodeport
spec:
  ports:
  - port: 80
    protocol: TCP
    nodePort: 33333
  selector:
    app: nodeport
  type: NodePort

[root@k8s-master yaml]# kubectl apply -f nodeport.yml

效果演示:

[root@k8s-master yaml]# kubectl get services nodeport

在这里插入图片描述

loadbalancer

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

loadbalancer 微服务的访问过程:

在这里插入图片描述

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

[root@k8s-master ~]# vim timinglee.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: loadbalancer
spec:
  replicas: 2
  selector:
    matchLabels:
      app: loadbalancer
  template:
    metadata:
      labels:
        app: loadbalancer
    spec:
      containers:
      - image: myapp:v1
        name: myapp

---
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: loadbalancer
  type: LoadBalancer


[root@k8s-master yaml]# kubectl apply -f loadbalancer.yml

默认无法分配外部访问IP
[root@k8s2 service]# kubectl get svc
NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP        4d1h
myapp        LoadBalancer   10.107.23.134   <pending>     80:32537/TCP   4s

metalLB

官网:https://metallb.universe.tf/installation/

在这里插入图片描述

MetalLB是一个负载均衡器,专门解决裸金属Kubernetes集群中无法使用LoadBalancer类型服务的问题。

它有两个主要功能:地址分配,为LoadBalancer Service分配lP地
址;外部声明,让集群外的网络知道这个地址的存在;为LoadBalancer分配vip

部署方式

1、设置ipvs模式

[root@k8s-master ~]# kubectl edit cm -n kube-system kube-proxy
...
  strictARP: true
...
mode: "ipvs"
...

在这里插入图片描述

2、将修改的配置生效

[root@k8s-master ~]# kubectl -n kube-system get pods | awk '/kube-proxy/{system("kubectl -n kube-system delete pods "$1)}'

3、下载部署文件

[root@k8s2 metallb ~]# wget https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml

在这里插入图片描述

4、修改metallb部署文件内容

[root@k8s-master ~]# vim metallb-native.yaml
......
image: metallb/controller:v0.14.8
......
image: metallb/speaker:v0.14.8
......

在这里插入图片描述

在这里插入图片描述

5、上传镜像到harbor仓库

[root@k8s-master metallb]# docker tag quay.io/metallb/controller:v0.14.8 reg.tym.org/metallb/controller:v0.14.8
[root@k8s-master metallb]# docker tag quay.io/metallb/speaker:v0.14.8 reg.tym.org/metallb/speaker:v0.14.8

[root@k8s-master metallb]# docker push reg.tym.org/metallb/controller:v0.14.8
[root@k8s-master metallb]# docker push reg.tym.org/metallb/speaker:v0.14.8

6、部署服务

启用metallb服务:

[root@k8s-metallb ~]# kubectl apply -f metallb-native.yaml

[root@k8s-master ~]# kubectl -n metallb-system get pods

在这里插入图片描述

配置分配地址段:

[root@k8s-master ~]# vim configmap.yml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: first-pool				#地址池名称
  namespace: metallb-system
spec:
  addresses:
  - 172.25.254.50-172.25.254.99	#修改为自己本地地址段

---		#两个不同的kind中间必须加分割
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: example
  namespace: metallb-system
spec:
  ipAddressPools:
  - first-pool					#使用的地址池 

重新加载文件:

[root@k8s-master ~]# kubectl apply -f configmap.yml

查看服务信息:

[root@k8s-master ~]# kubectl get services

在这里插入图片描述

#通过分配地址从集群外访问服务

[root@reg ~]# curl  172.25.254.51

在这里插入图片描述

externalname

  • 开启services后,不会被分配IP,而是用dns解析CNAME固定域名来解决ip变化问题
  • 一般应用于外部业务和pod沟通或外部业务迁移到pod内时
  • 在应用向集群迁移过程中,externalname在过度阶段就可以起作用了
  • 集群外的资源迁移到集群时,在迁移的过程中ip可能会变化,但是域名+dns解析能完美解决此问题
[root@k8s-master ~]# vim externalname.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: externalname
spec:
  replicas: 2
  selector:
    matchLabels:
      app: externalname
  template:
    metadata:
      labels:
        app: externalname
    spec:
      containers:
      - image: myapp:v1
        name: myapp

---
apiVersion: v1
kind: Service
metadata:
  name: externalname
spec:
  selector:
    app: externalname
  type: ExternalName
  externalName: www.tym.org


[root@k8s-master yaml]# kubectl apply -f externalname.yml

[root@k8s-master ~]# kubectl get services

在这里插入图片描述

Ingress-nginx

官网:

https://kubernetes.github.io/ingress-nginx/deploy/#bare-metal-clusters

ingress-nginx 功能

在这里插入图片描述

  • 一种全局的、为了代理不同后端 Service 而设置的负载均衡服务,支持7层
  • Ingress由两部分组成:Ingress controller和Ingress服务
  • Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力
  • 业界常用的各种反向代理项目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已经为Kubernetes 专门维护了对应的 Ingress Controller

部署 ingress

下载部署文件

[root@k8s-master ~]# wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.2/deploy/static/provider/baremetal/deploy.yaml

在这里插入图片描述

在这里插入图片描述

上传ingress所需镜像到harbor

[root@k8s-master ~]# docker tag registry.k8s.io/ingress-nginx/controller:v1.11.2 reg.tym.org/ingress-nginx/controller:v1.11.2
[root@k8s-master ~]# docker tag registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3 reg.tym.org/ingress-nginx/kube-webhook-certgen:v1.4.3

[root@k8s-master ~]# docker push reg.tym.org/ingress-nginx/controller:v1.11.2
[root@k8s-master ~]# docker push reg.tym.org/ingress-nginx/kube-webhook-certgen:v1.4.3

安装ingress

1、修改配置文件

[root@k8s-master ~]# vim deploy.yaml
...
	image: ingress-nginx/controller:v1.11.2
...
	image: ingress-nginx/kube-webhook-certgen:v1.4.3
...
	image: ingress-nginx/kube-webhook-certgen:v1.4.3
...

在这里插入图片描述

2、安装ingress-nginx

[root@k8s-master ingress]# kubectl apply -f deploy.yaml

在这里插入图片描述

3、查看ingress-nginx状态

[root@k8s-master ~]# kubectl -n ingress-nginx get pods

[root@k8s-master ~]# kubectl -n ingress-nginx get svc

在这里插入图片描述

4、修改微服务为loadbalancer

[root@k8s-master ~]# kubectl -n ingress-nginx edit svc ingress-nginx-controller
...
   type: LoadBalancer
  ...

在这里插入图片描述

5、查看其服务状态

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

在这里插入图片描述

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

测试ingress

1、生成 yaml 文件

[root@k8s-master ~]# kubectl create ingress myappv1 --class nginx --rule='/=myappv1:80' --dry-run=client -o yaml > ingress1.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myappv1
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: myappv1	#该名称为已建立好的服务名称
            port:
              number: 80
        path: /
        pathType: Prefix
#Exact(精确匹配);ImplementationSpecific(特定实现);Prefix(前缀匹配);Regular expression(正则表达式匹配)

2、建立控制器

[root@k8s-master yaml]# kubectl apply -f ingress.yml

3、访问测试

[root@k8s-master yaml]# curl 172.25.254.50
#172.25.254.50为ingress对外IP地址

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

如果 ingress-nginx 的 yml 文件内的服务不存在,则会访问失败

在这里插入图片描述

ingress 的高级用法

基于路径的访问

1、建立用于测试的控制器myapp1,myappv2

生成 yml 文件:

[root@k8s-master yaml]# kubectl create deployment myappv1 --image myapp:v1 --dry-run=client -o yaml > myappv1.yaml

[root@k8s-master yaml]# kubectl expose deployment myappv1 --port 80 --target-port 80 --dry-run=client -o yaml >> myappv1.yaml

编辑 yml 文件:

[root@k8s-master yaml]# vim myappv1.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: myappv1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myappv1
  template:
    metadata:
      labels:
        app: myappv1
    spec:
      containers:
      - image: myapp:v1
        name: myappv1

---
apiVersion: v1
kind: Service
metadata:
  name: myappv1
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: myappv1

按照以上方法再次建立v2的版本

建立并运行两个微服务:

[root@k8s-master yaml]# kubectl apply -f myappv1.yml

[root@k8s-master yaml]# kubectl apply -f myappv2.yml

在这里插入图片描述

2、建立ingress的yaml 文件

[root@k8s-master yaml]# vim ingress1.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /	#访问路径后加任何内容都被定向到/
  name: ingress1
spec:
  ingressClassName: nginx
  rules:
  - host: www.tym.org
    http:
      paths:
      - backend:
          service:
            name: myapp-v1
            port:
              number: 80
        path: /v1
        pathType: Prefix

      - backend:
          service:
            name: myapp-v2
            port:
              number: 80
        path: /v2
        pathType: Prefix

3、运行ingress服务

[root@k8s-master yaml]# kubectl apply -f ingress1.yml

4、添加本地解析

[root@k8s-master yaml]# vim /etc/hosts
...
172.25.254.50 www.tym.org

5、查看服务的详细信息

[root@k8s-master yaml]# kubectl describe ingress ingress1

在这里插入图片描述

6、测试

[root@k8s-master yaml]# curl www.tym.org/v2

在这里插入图片描述

基于域名的访问

1、在测试主机中设定解析

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

在这里插入图片描述

2、建立基于域名的yaml文件

[root@k8s-master yaml]# vim ingress3.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: ingresss
spec:
  ingressClassName: nginx
  rules:
  - host: myappv1.tym.org
    http:
      paths:
      - backend:
          service:
            name: myappv1
            port:
              number: 80
        path: /
        pathType: Prefix
  - host: myappv2.tym.org
    http:
      paths:
      - backend:
          service:
            name: myappv2
            port:
              number: 80
        path: /
        pathType: Prefix

3、利用文件资源清单建立ingress

[root@k8s-master yaml]# kubectl apply -f ingress3.yml

在这里插入图片描述

4、查看其ingress的详细信息

[root@k8s-master yaml]# kubectl describe ingress

在这里插入图片描述

5、访问测试

[root@k8s-master yaml]# curl myappv1.tym.org

[root@k8s-master yaml]# curl myappv2.tym.org

在这里插入图片描述

建立tls加密

1、建立证书

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

在这里插入图片描述

2、建立加密资源类型secret

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

[root@k8s-master app]# kubectl get secrets

secret通常在kubernetes中存放敏感数据,他并不是一种加密方式

在这里插入图片描述

3、建立资源清单基于tls认证的yml文件

[root@k8s-master yaml]# vim ingress4.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: ingresss
spec:
  tls:
  - hosts:
    - myappv1-tls.tym.org
    - myappv2-tls.tym.org
    secretName: web-tls-secret	#当通过以上域名访问时,自动定位至加密资源secret
  ingressClassName: nginx
  rules:
  - host: myappv1-tls.tym.org
    http:
      paths:
      - backend:
          service:
            name: myappv1
            port:
              number: 80
        path: /
        pathType: Prefix
  - host: myappv2-tls.tym.org
    http:
      paths:
      - backend:
          service:
            name: myappv2
            port:
              number: 80
        path: /
        pathType: Prefix

[root@k8s-master yaml]# kubectl apply -f ingress4.yml

4、测试

在测试主机内添加域名解析;通过浏览器进行访问测试

在这里插入图片描述

建立auth认证

1、建立认证文件

[root@k8s-master yaml]# dnf install httpd-tools -y
#下载安装认证工具

[root@k8s-master yaml]# htpasswd -cm auth lee
#创建认证用户

[root@k8s-master app]# cat auth

在这里插入图片描述

2、建立认证类型资源secret

[root@k8s-master app]# kubectl create secret generic auth-web --from-file auth

root@k8s-master app]# kubectl describe secrets auth-web

在这里插入图片描述

3、建立资源清单基于用户认证的yaml文件

[root@k8s-master yaml]# vim ingress5.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic	#认证类型
    nginx.ingress.kubernetes.io/auth-secret: auth-web	#认证资源的名称
    nginx.ingress.kubernetes.io/auth-realme: "Please input username and passsword"
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: myappv1
            port:
              number: 80
        path: /
        pathType: Prefix
    host: www.tym.org

[root@k8s-master app]# kubectl apply -f ingress4.yml

在这里插入图片描述

4、测试

[root@k8s-master yaml]# curl -k https://www.tym.org

[root@reg ~]# curl -k https://www.tym.org -u tym:123

在这里插入图片描述

rewrite重定向

1、创建资源清单文件基于默认访问的文件到hostname.html上

[root@k8s-master yaml]# vim ingress6.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  annotations:
    nginx.ingress.kubernetes.io/app-port: /hostname.html	#默认访问至该文件
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: myappv1
            port:
              number: 80
        path: /
        pathType: Prefix
    host: www.tym.org

[root@k8s-master yaml]# kubectl apply -f ingress6.yml

在这里插入图片描述

2、测试

[root@k8s-master yaml]# curl www.tym.org

在这里插入图片描述

解决重定向路径问题

1、创建资源清单文件

[root@k8s-master yaml]# vim ingress6.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/use-regex: "true"	#开启正则表达式
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: myappv1
            port:
              number: 80
        path: /
        pathType: Prefix
      - backend:
          service:
            name: myappv1
            port:
              number: 80
        path: /tym(/|$)(.*)	#正则表达式匹配/tym/,/tym/a
        pathType: ImplementationSpecific	#匹配类型为正则表达式
    host: www.tym.org

[root@k8s-master yaml]# kubectl apply -f ingress6.yml

2、测试

[root@k8s-master yaml]# curl www.tym.org/aa

[root@k8s-master yaml]# curl www.tym.org/aa/aa

[root@k8s-master yaml]# curl www.tym.org/aa/aa/fdsfd

在这里插入图片描述

Canary 金丝雀发布

金丝雀发布简介

在这里插入图片描述

基于 Ingress-nginx 的一种发布方式

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

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

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

Canary 发布方式

在这里插入图片描述

其中header和weiht中的最多

基于header(http包头)灰度发布

在这里插入图片描述

  • 通过Annotaion扩展
  • 创建灰度ingress,配置灰度头部key以及value
  • 灰度流量验证完毕后,切换正式ingress到新版本
  • 在做升级时可以通过控制器做滚动更新,默认25%利用header可以使升级更为平滑,通过key 和vule 测试新的业务体系是否有问题。

示例

1、建立版本为1的ingress(旧版本)

[root@k8s-master yaml]# vim ingress7.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myappv1-canary
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: myappv1
            port:
              number: 80
        path: /
        pathType: Prefix

[root@k8s-master yaml]# kubectl apply -f ingress7.yml

2、建立版本为2的ingress(新版本)

[root@k8s-master yaml]# vim ingress8.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myappv2-canary
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-by-header: "version"	#设定其包头的键
    nginx.ingress.kubernetes.io/canary-by-header-value: "2"	#设定其包头的值
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: myappv2
            port:
              number: 80
        path: /
        pathType: Prefix

[root@k8s-master yaml]# kubectl apply -f ingress7.yml

在这里插入图片描述

3、测试

[root@k8s-master yaml]# curl 172.25.254.50

[root@k8s-master yaml]# curl -H "version:2" 172.25.254.50

在这里插入图片描述

基于权重的灰度发布

在这里插入图片描述

  • 通过Annotaion拓展
  • 创建灰度ingress,配置灰度权重以及总权重
  • 灰度流量验证完毕后,切换正式ingress到新版本

示例

1、创建基于权重的灰度发布

[root@k8s-master yml]# vim ingress8.yml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myappv2-canary
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"	#设定其发布新版的权重,如果总权重为100,则发布的新版占百分之十
    nginx.ingress.kubernetes.io/canary-by-weight-total: "100"	#设定其总权重
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - backend:
          service:
            name: myappv2
            port:
              number: 80
        path: /
        pathType: Prefix

[root@k8s-master yml]# kubectl apply -f ingress8.yml

在这里插入图片描述

2、编写一个脚本进行测试其灰度发布的情况

[root@reg ~]# vim check_ingress.sh
#!/bin/bash
v1=0
v2=0

for (( i=0; i<100; i++))
do
    response=`curl -s 172.25.254.50 |grep -c v1`

    v1=`expr $v1 + $response`
    v2=`expr $v2 + 1 - $response`

done
echo "v1:$v1, v2:$v2"

观察其发布的情况

当发布权重为10时:

在这里插入图片描述

当发布权重为40时:

在这里插入图片描述

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

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

相关文章

指针 (七)

一 . 回调函数 什么是回调函数呢&#xff1f;就是说我们将函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数时&#xff0c;这个被调用的函数就是回调函数。回调函数并不是由该函数的实现方直接调用&#xff0c…

MySQL函数介绍--日期与时间函数(二)

我相信大家在学习各种语言的时候或多或少听过我们函数或者方法这一类的名词&#xff0c;函数在计算机语言的使用中可以说是贯穿始终&#xff0c;那么大家有没有思考过到底函数是什么&#xff1f;函数的作用又是什么呢&#xff1f;我们为什么要使用函数&#xff1f;其实&#xf…

移动技术开发:RecyclerView瀑布流水果列表

1 实验名称 RecyclerView瀑布流水果列表 2 实验目的 掌握RecyclerView控件的实现方法和基本应用 3 实验源代码 布局文件代码&#xff1a; activity_main&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android&q…

【学习笔记】手写 Tomcat 五

目录 一、优化 Servlet 创建一个抽象类 继承抽象类 二、三层架构 业务逻辑层 数据访问层 1. 在 Dao 层操作数据库 2. 调用 Dao 层&#xff0c;实现业务逻辑功能 3. 调用 Service 层&#xff0c;响应数据 测试 三、数据库连接池 1. 手写数据库连接池 2. 创建数据库…

C语言题目之单身狗2

文章目录 一、题目二、思路三、代码实现 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、题目 二、思路 第一步 在c语言题目之打印单身狗我们已经讲解了在一组数据中出现一个单身狗的情况&#xff0c;而本道题是出现两个单身狗的情况。根据一个数…

当Navicat报错 Can not connect to MySQL server的解决方法!

今天运行数据库时突然弹出一个error&#xff1a; 原因&#xff1a;MySQL的服务没有打开&#xff0c;需要检查MySQL的开启状态即可。 具体做法&#xff1a; 1.右键“开始”&#xff0c;点击“计算机管理” 2. 选择“服务和应用程序”&#xff0c;并点击“服务” 3.在服务中找…

ESP32-WROOM-32 [创建AP站点-TCP服务端-数据收发]

简介 ESP32 创建TCP Server AP站点&#xff0c; PC作为客户端连接站点并收发数据 指令介绍 注意,下面指令需要在最后加上CRLF, 也就是\r\n(回车换行) ATRESTORE // 恢复出厂设置 ATCWMODE2 // 设置 Wi-Fi 模式为 softAP ATCIPMODE0 // 需要数据传输模式改为0&#xff0c; 普通…

Cesium 绘制可编辑点

Cesium Point点 实现可编辑的pointEntity 实体 文章目录 Cesium Point点前言一、使用步骤二、使用方法二、具体实现1. 开始绘制2.绘制事件监听 三、 完整代码 前言 支持 鼠标按下 拖动修改点&#xff0c;释放修改完成。 一、使用步骤 1、点击 按钮 开始 绘制&#xff0c;单…

河钢数字PMO牛红卫受邀为第四届中国项目经理大会演讲嘉宾

全国项目经理专业人士年度盛会 河钢数字技术股份有限公司项目管理部PMO牛红卫受邀为PMO评论主办的全国项目经理专业人士年度盛会——2024第四届中国项目经理大会演讲嘉宾&#xff0c;演讲议题为“从技术到领导力——项目经理成长进阶之道”。大会将于10月26-27日在北京举办&…

知情人称,丹尼尔克雷格在卸任“007”以后他和蕾切尔薇兹的婚姻“产生了奇效”

丹尼尔克雷格、蕾切尔薇兹 虽然丹尼尔克雷格 (Daniel Craig) 因出演詹姆斯邦德 (James Bond) 而成为全球最耀眼的明星之一&#xff0c;实现了自己以及很多人的梦想&#xff0c;但知情人称他与蕾切尔薇兹 (Rachel Weisz) 的婚姻实际上正因此而陷入困境&#xff1b;但现在&#…

C# winforms DataGridView设置数据源自动显示表格

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

高效打造知识图谱,使用LlamaIndex Relik实现实体关联和关系抽取

大家好&#xff0c;文本信息转化为知识图谱的技术&#xff0c;自问世以来一直是研究界的宠儿。大型语言模型&#xff08;LLMs&#xff09;的兴起让这个领域受到更多关注&#xff0c;但LLMs的成本之高令人却步。然而通过对小型模型微调优化&#xff0c;可以找到一种更经济高效的…

没有 Microsoft Wi-Fi Direct Virtual Adapter #2 导致无法打开热点

我的环境 电脑打不开热点 系统 win11 64位 品牌 hp 笔记本电脑 解决方法&#xff1a; https://answers.microsoft.com/zh-hans/windows/forum/all/%E7%A7%BB%E5%8A%A8%E7%83%AD%E7%82%B9%E6%97%A0/9285620a-71d9-4671-b125-4cd607b6371a 解决 &#x1f613; 扫描一下设…

读构建可扩展分布式系统:方法与实践12分布式数据库案例

1. Redis 1.1. 2009年首次发布 1.1.1. 更注重原始性能和简单性&#xff0c;而不是数据安全性和一致性 1.2. 主要吸引力在于它能够同时充当分布式缓存和数据存储 1.3. 维护一个内存中的数据存储&#xff0c;也称为数据结构存储(data structure store) 1.4. 配置Redis将每个…

每日学习一个数据结构-Trie树(字典树)

文章目录 定义节点结构根节点插入操作查找操作删除操作特点应用示例 “Trie”树&#xff0c;又称为前缀树或字典树&#xff0c;是一种专门用于存储字符串的数据结构。它在许多应用程序中都非常有用&#xff0c;特别是在那些需要高效查找、插入和删除字符串的应用场景中。下面是…

2024年华为杯数学建模E题-高速公路应急车道启用建模-基于YOLO8的数据处理代码参考(无偿分享)

利用YOLO模型进行高速公路交通流量分析 识别效果&#xff1a; 免责声明 本文所提供的信息和内容仅供参考。尽管我尽力确保所提供信息的准确性和可靠性&#xff0c;但我们不对其完整性、准确性或及时性作出任何保证。使用本文信息所造成的任何直接或间接损失&#xff0c;本人…

记一次Meilisearch轻量级搜索引擎使用

以前使用的是mysql的全文索引、最开始还行。后续觉得就不好用了&#xff0c;但是服务器资源有限&#xff0c;没法上ES&#xff0c;只好找一个轻量级的搜索引擎、找了半天&#xff0c;决定使用这一个&#xff0c;目前效果还不错的。 参考网址 官网&#xff1a;https://www.meil…

java反射基础知识

1.java的反射机制 Java 反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射…

【C语言零基础入门篇 - 16】:栈和队列

文章目录 栈和队列栈栈功能的实现源代码 队列队列功能的实现源代码 栈和队列 栈 什么是栈&#xff1a;功能受限的线性数据结构 栈的特点&#xff1a;先进后出 。例如&#xff1a;仓库进货、出货。 栈只有一个开口&#xff0c;先进去的数据在栈底&#xff08;bottom&#xf…

高版本idea开启热部署找不到compiler.automake.allow.when.app.running

高版本idea开启热部署找不到compiler.automake.allow.when.app.running 1.解决方案 设置----》高级设置 搜索 allow 勾选完成就能使用了