侧边栏壁纸
博主头像
再见理想博主等级

只争朝夕,不负韶华

  • 累计撰写 112 篇文章
  • 累计创建 64 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

阿里云容器服务ASK部署微服务实战

再见理想
2022-07-12 / 0 评论 / 0 点赞 / 873 阅读 / 1,613 字

一,前言

本文将介绍如何将 SpringCloud 微服务迁移到阿里云 ASK 容器服务上。微服务采用 Nacos 作为服务注册中心,网关 Gateway 作为流量的同一入口,转发到各个业务服务上,架构图可参考下图:

如何将微服务迁移到 K8S 上?

大概流程可以理解成为每个服务,包括 Nacos和网关 Gateway 创建一个Service 资源,然后使用 Ingress 作为流量的同一入口,由 Ingress 实现反向代理,将流量转发到网关 Gateway 中,再跟进 Gateway 的路由规则转发到具体的业务服务,去处理请求。

二,创建并连接上 ASK 集群

2.1,ASK 集群创建

根据 官方文档 步骤创建即可。


2.2,linux 安装 kubectl 操作 ASK 集群

安装步骤:

# 1,下载最新发行版:
$ curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

# 2,验证该可执行文件:
# 下载 kubectl 校验和文件:
$ curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"

# 基于校验和文件,验证 kubectl 的可执行文件:
# 验证通过时,输出为:kubectl: OK
$ echo "$(cat kubectl.sha256)  kubectl" | sha256sum --check

# 3,安装 kubectl  
$ sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

# 4,执行测试,以保障你安装的版本是最新的
$ kubectl version --client

连接阿里云 ASK 集群:

img

# 1,在服务器创建 ~/.kube/config 文件并写入阿里云 ACK 公网连接信息
# 可以阿里云控制台`集群详情-连接信息`找到连接信息
$ cd /root
$ mkdir .kube
$ cd .kube
$ vim config

# 2,测试是否连接成功
$ kubectl cluster-info
$ kubectl get ns

成功后,可以在 linux 操作 K8S 集群!

三,准备服务镜像

一般项目需要通过 Dockerfile 生成镜像,通过 Jenkins 将镜像上传到 DockerHub 或者 阿里云镜像中心,然后就能获取到可用的服务镜像。

可参考:Docker 构建镜像


配置Secret拉取阿里云私有镜像

可以直接使用 docker 的用户信息来生成 secret:

$ kubectl create secret docker-registry 密钥名称 --docker-server=仓库地址 --docker-username=仓库账号 --docker-password=仓库密码 --docker-email=邮箱  -n 命名空间

配置secret:

spec: 
  replicas: 1
  selector:
    matchLabels:
      app: saas-gateway
  template:
    metadata:
      labels:
        app: saas-gateway
    spec:
      imagePullSecrets:
      - name: 密钥名称
      containers:

四,Yaml 配置文件

4.1,Ingress yaml配置

Ingress 作为统一的流量入口,将流量转发到 网关 Gateway 中。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: saas-ingress
  namespace: saas
spec:
  rules:
  - host: tgateway.xxx.com
    http:
      paths:
      - path: /
        backend:
          service: 
            name: saas-gateway
            port:
              number: 6666
        pathType: ImplementationSpecific

4.2,Gateway yaml 配置

K8S yaml 文件:gateway.yaml

apiVersion: apps/v1
kind: Deployment      
metadata:
  name: saas-gateway
  namespace: saas
  labels: 
    app: saas-gateway
spec: 
  replicas: 1
  selector:
    matchLabels:
      app: saas-gateway
  template:
    metadata:
      labels:
        app: saas-gateway
    spec:
      imagePullSecrets:
      - name: 镜像拉取秘钥      
      containers:
      - name: saas-gateway
        image: 镜像
        imagePullPolicy: Always
        ports:
        - containerPort: 6666 #需要在服务中暴露该端口。
        resources:
          limits: #设置资源限制。
            cpu: '1'
            memory: 1Gi
          requests: #设置所需资源
            cpu: 500m
            memory: 512Mi
        
---

apiVersion: v1
kind: Service
metadata:
  name: saas-gateway
  namespace: saas
spec:
  selector:
    app: saas-gateway
  type: ClusterIP
  ports:
  - port: 6666         # service端口
    protocol: TCP
    targetPort: 6666   # pod端口

gateway 服务配置文件:

spring:
  cloud:
    gateway:
      discovery:
        locator:
          # 启用服务发现
          enabled: true 
          lower-case-service-id: true
      routes:
        - id: saas-auth
          uri: lb://saas-auth
          predicates:
            - Path=/saas-auth/**
          filters:
            - SwaggerHeaderFilter
            - StripPrefix=1
        - id: saas-admin
          uri: lb://saas-admin
          predicates:
            - Path=/saas-admin/**
          filters:
            - SwaggerHeaderFilter
            - StripPrefix=1

4.3,业务服务 yaml 配置

业务服务都共用以下模板,修改名称、端口、镜像即可。

需要注意的是,Gateway 服务配置文件中路由根据服务名转发配置uri: lb://saas-auth最好和 K8S 对应业务的 Service 名称一致。

apiVersion: apps/v1
kind: Deployment      
metadata:
  name: saas-auth
  namespace: saas
  labels: 
    app: saas-auth
spec: 
  replicas: 1
  selector:
    matchLabels:
      app: saas-auth
  template:
    metadata:
      labels:
        app: saas-auth
    spec:
      imagePullSecrets:
      - name: 镜像拉取秘钥
      containers:
      - name: saas-auth
        image: 镜像
        imagePullPolicy: Always
        ports:
        - containerPort: 7777 #需要在服务中暴露该端口。
        resources:
          limits: #设置资源限制。
            cpu: '1'
            memory: 1Gi
          requests: #设置所需资源
            cpu: 500m
            memory: 512Mi
        
---

apiVersion: v1
kind: Service
metadata:
  name: saas-auth
  namespace: saas
spec:
  selector:
    app: saas-auth
  type: ClusterIP
  ports:
  - port: 7777         # service端口
    protocol: TCP
    targetPort: 7777   # pod端口

五,启动服务

将配置文件上传到服务器 /k8s/saas/ 文件夹中,用命令启动。

# 启动
$ cd /k8s/saas
$ kubectl apply -f ./

# 检查服务
$ kubectl get svc -n 命名空间
$ kubectl get pod -n 命名空间
$ kubectl get ing -n 命名空间

# 查看日志
$ kubectl logs -f --tail 150 pod名称 -n 命名空间

六,域名解析

首先,需要获取 Ingress 暴露的 ip,然后将域名解析到当前ip。

原有微服务迁移情景,可以将原域名解析到Ingress即可。

$ kubectl get ing -n saas


七,nginx 访问后台的反向代理配置

前台管理后台服务等有单独配置域名,当需要访问后台接口时,须转发到 Ingress 入口。

server {
	listen       80;
	listen       443 ssl;
	server_name  tsass.xxx.com;
	...
	
	# 前端访问后台的反向代理-转发到 Ingress 流量入口。
	# proxy_pass:访问URL不会重写。使用rewrite的话访问地址会被重写
	location ^~/prod-api/ {
		proxy_pass   http://tgateway.xxx.com/;
	}
} 

八,访问验证

登陆原有的管理后台或接口文档,校验各服务是否能正常访问。至此,微服务迁移 K8S 已完成。


小结

微服务迁移 K8S 的部署方案大落地实现了,但还有很多可以优化的地方,例如加上 SLB 做节点的负载均衡,或使用 K8S 提供的服务注册和配置管理 ConfigMap 替代 Nacos,更多的方案可以参考文章K8S 微服务部署方案

生产上很多细节都需要考虑到位,下图从多个维度展示了需要注意的地方:

从架构设计层面,我们关注的可用性,伸缩性都可以结合k8s得到很好的解决,如果你想使用微服务架构,搭配k8s,真的是完美,再从部署运维层面,服务部署,服务监控,应用扩容和故障处理,k8s都提供了很好的解决方案。

0

评论区