共计 5071 个字符,预计需要花费 13 分钟才能阅读完成。
服务网格简介
服务网格(Service Mesh)是为解决微服务的通信和治理而呈现的一种架构模式。
服务网格将服务间通信以及与此相关的管理控制性能从业务程序中下移到一个基础设施层,从而彻底隔离了业务逻辑和服务通信两个关注点。采纳服务网格后,利用开发者只须要关注并实现利用业务逻辑。服务之间的通信,包含服务发现,通信的可靠性,通信的安全性,服务路由等由服务网格层进行解决,并对应用程序通明。
让咱们来回顾一下微服务架构的倒退过程。在呈现服务网格之前,咱们在微服务应用程序过程内解决服务通信逻辑,包含服务发现,熔断,重试,超时等逻辑,如下图所示:
因为通信代理过程和利用过程一起部署,因而形象地把这种部署形式称为“sidecar”(三轮摩托的挎斗)。
利用间的所有流量都须要通过代理,因为代理以 sidecar 形式和利用部署在同一台主机上,利用和代理之间的通信被认为是牢靠的。而后由代理来负责找到目标服务并负责通信的可靠性和平安等问题。
当服务大量部署时,随着服务部署的 sidecar 代理之间的连贯造成了一个如下图所示的网格,被称之为 Service Mesh(服务网格),从而得出如下的服务网格定义。
服务网格是一个基础设施层,用于解决服务间通信。云原生利用有着简单的服务拓扑,服务网格保障申请能够在这些拓扑中牢靠地穿梭。在理论利用当中,服务网格通常是由一系列轻量级的网络代理组成的,它们与应用程序部署在一起,但应用程序不须要晓得它们的存在。
一、下载 Istio
[root@k8s-master ~]# curl -L https://istio.io/downloadIstio | sh -
wget https://github.com/istio/istio/releases/download/1.8.0/istio-1.8.0-linux-amd64.tar.gz[root@k8s-master ~]# tar -zxvf istio-1.8.0-linux-amd64.tar.gz -C /usr/local/[root@k8s-master ~]# vim /etc/profile 增加:export PATH=$PATH:/usr/local/istio-1.8.0/bin/ [root@k8s-master ~]# source /etc/profile
二. 装置 istio
[root@master49 templates]# kubectl get apiservices -n kube-system |grep metrics-server
v1beta1.metrics.k8s.io kube-system/metrics-server True 13m
[root@master49 templates]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
master49 366m 9% 1728Mi 14%
master50 376m 9% 2359Mi 19%
master56 344m 8% 2049Mi 17%
node52 2879m 11% 65938Mi 31%
node53 1226m 5% 31879Mi 15%
[root@master49 tmp]# kubectl create namespace istio-system
[root@master49 tmp]# istioctl x precheck
Istio already installed in namespace "istio-system". Skipping pre-check. Confirm with 'istioctl verify-install'.
Use 'istioctl upgrade' to upgrade or 'istioctl install --set revision=<revision>' to install another control plane.
[root@master49 tmp]# istioctl manifest generate --set profile=demo > /tmp/generated-manifest.yaml
[root@master49 tmp]# kubectl apply -y /tmp/generated-manifest.yaml
三、显示可用配置文件的列表
[root@master49 templates]# istioctl profile list
Istio configuration profiles:
empty
minimal
preview
remote
default
demo
- minimal:应用 Istio 的流量治理性能所需的起码组件集。
- remote:用于配置共享管制立体的多集群服务网格 multicluster mesh。
- sds:相似于默认配置文件,但也启用 Istio 的 SDS(机密发现服务)。此配置文件附带默认状况下启用的其余身份验证性能(严格双向 TLS)。
- demo:旨在展现 Istio 性能且资源需要适中的配置。适宜运行 Bookinfo 应用程序和相干工作。这是随疾速入门阐明一起装置的配置,然而, 如果您想摸索更高级的工作,则能够稍后自定义配置以启用其余性能。此配置文件可实现高级别的跟踪和拜访日志记录,因而不适宜进行性能测试。
- default:依据 IstioControlPlaneAPI 的默认设置启用组件(倡议用于生产部署)。
在零碎上装置 部署 istio
[root@master49 tmp]# istioctl install --set profile=demo -y
Detected that your cluster does not support third party JWT authentication. Falling back to less secure first party JWT. See https://istio.io/docs/ops/best-practices/security/#configure-third-party-service-account-tokens for details.
✔ Istio core installed
✔ Istiod installed
✔ Ingress gateways installed
✔ Egress gateways installed
✔ Installation complete
[root@master49 templates]# kubectl get pod -n istio-system -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
istio-egressgateway-5589c5994-6hv2d 1/1 Running 0 4h13m 10.17.38.252 node53 <none> <none>
istio-ingressgateway-5848876c99-6v649 1/1 Running 0 4h13m 10.17.38.204 node53 <none> <none>
istiod-7db8c5c846-f4sml 1/1 Running 0 4h13m 10.17.38.200 node53 <none> <none>
留神:批改 istio-ingressgateway 的服务裸露类型
[root@master49 tmp]# kubectl patch service istio-ingressgateway -n istio-system -p '{"spec":{"type":"NodePort"}}'
service/istio-ingressgateway patched
test
### 发版前
[root@master49 tmp]# kubectl get pod | grep saas
devpipeline-saas-back-profile-a-6cd5774767-jkzhz 1/1 Running 0 45m
logstash-saas-back-profile-a-d85c497bb-w7v7g 1/1 Running 0 18h
qasapipeline-saas-back-profile-a-6cd746c664-gz4xj 1/1 Running 0 19m
[root@master49 tmp]# cat lll.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: devpipeline-saas-back-profile-a
spec:
replicas: 1
minReadySeconds: 30 #滚动降级时 120s 后认为该 pod 就绪
strategy:
rollingUpdate: ## 因为 replicas 为 3, 则整个降级,pod 个数在 2 - 4 个之间
maxSurge: 1 #滚动降级时会先启动 1 个 pod
maxUnavailable: 0 #滚动降级时容许的最大 Unavailable 的 pod 个数
selector:
matchLabels:
app: devpipeline-saas-back
profile: profile-a
template:
metadata:
labels:
app: devpipeline-saas-back
profile: profile-a
spec:
terminationGracePeriodSeconds: 40 ##k8s 将会给利用发送 SIGTERM 信号,能够用来正确、优雅地敞开利用, 默认为 30 秒
volumes:
- name: "cephfs-fuse"
hostPath:
path: "/data/WEBLOG"
- name: "preproductnfs"
hostPath:
path: "/home/nfs"
containers:
- name: devpipeline-saas-back-profile-a
image: harbor.reg/test_jinfu/devpipeline-saas-back:949f788-10
imagePullPolicy: IfNotPresent
volumeMounts:
- name: cephfs-fuse
mountPath: /data/WEBLOG
- name: preproductnfs
mountPath: /home/nfs
resources:
limits:
memory: 2500Mi
requests:
memory: 2000Mi
ports:
- containerPort: 8080
env:
- name: app_name
value: devpipeline-saas-back-profile-a
- name: project_name
value: devpipeline-saas-back
lifecycle:
preStop:
exec:
command: ["/bin/sh","-c","/jar-stop.sh"]
readinessProbe:
httpGet:
path: /api/v1/Status/Version
port: 8080
initialDelaySeconds: 10 #用来示意初始化提早的工夫,也就是通知监测从多久之后开始运行,单位是秒
periodSeconds: 40 #没隔多久执行一次探测
successThreshold: 1 #失败后查看胜利的最小间断胜利次数
timeoutSeconds: 2 #用来示意监测的超时工夫,如果超过这个时长后,则认为监测失败
---
apiVersion: v1
kind: Service
metadata:
name: devpipeline-saas-back-profile-a
labels:
app: devpipeline-saas-back
profile: profile-a
spec:
selector:
app: devpipeline-saas-back
profile: profile-a
type: NodePort
ports:
- port: 8080
targetPort: 8080
nodePort: 32111
### 发版后
[root@master49 tmp]# kubectl get pod | grep saas
devpipeline-saas-back-profile-a-6cd5774767-jkzhz 2/2 Running 0 2m15s
logstash-saas-back-profile-a-d85c497bb-w7v7g 2/2 Running 0 18h
qasapipeline-saas-back-profile-a-6cd746c664-gz4xj 1/1 Running 0 19m