ACK集群应用部署进阶

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
.cn 域名,1个 12个月
简介: 通过 Ingress 服务来暴露 pod,让应用可以通过统一的入口访问;通过 pod 亲和性调度, 让 web 的 pod 和 redis 的 pod 尽量调度到一个节点上,提高 web 和 redis 之间的网络质量。 同时将应用的标准输出日志采集到日志服务,监控日志中的特殊字段内容,如果出现对 应字段的日志,通过日志服务进行告警,通知到邮件。 另外通过创建 hpa 来保证业务高峰期能够自动调整 pod 副本数,来增加架构弹性。

实验地址为:https://developer.aliyun.com/adc/scenario/47fd1ae45fa347d893834b9a9274de2c?spm=a2c6h.13858375.devcloud-scene-list.38.3130409016M0H4

整体实验架构如下

image.png

客户端通过 ingress 的入口 slb 访问,slb 将请求转发到 nginx-ingress-controller,然后 nginx-ingress-controller 将代理请求发到后端 pod;同时,hpa 来控制台 pod 数量的变化。

1.环境准备

证书下载地址 :> http://xiniao-ceshi.oss-cn-beijing.aliyuncs.com/4211665_xiniao.aliyuntest.xyz_nginx.zip

image.png

image.png

image.png

ping百度,测试是否连通。

image.png

2.创建 deploy 文件

touch myweb.yaml

image.png

编辑内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
  template:
    metadata:
      labels:
        app: httpbin
    spec:
      containers:
      - image: 'docker.io/kennethreitz/httpbin:latest'
        imagePullPolicy: IfNotPresent
        env:
        # 该env 会指定 采集该Pod 标准输出和标准出错的内容
        # 到名为 log-stdout 的 logstore 中,配置参考
        - name: aliyun_logs_log-stdout
          value: stdout
        name: httpbin
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          limits:
            cpu: 500m
            memory: 100Mi
          requests:
            cpu: 250m
            memory: 32Mi

使用命令创建 deploy

image.png

3.创建 service 暴露服务

touch myservice.yaml

编辑内容如下:

apiVersion: v1
kind: Service
metadata:
  name: myweb
  namespace: default
spec:
  ports:
    - name: http80
      port: 80
      protocol: TCP
      targetPort: 80
  selector:
    app: httpbin
  type: ClusterIP

image.png

4.创建 secret 文件

在CloudShell上下载证书,并将证书文件解压

wget http://xiniao-ceshi.oss-cn-beijing.aliyuncs.com/4211665_xiniao.aliyuntest.xyz_nginx.zip

image.png

unzip 4211665_xiniao.aliyuntest.xyz_nginx.zip

image.png

执行如下命令:(此处为一行,是生成秘钥的固定语法,?为脱敏信息,按照自己的文件名称填写即可)

kubectl create secret tls mysecret --key ???????_xiniao.aliyuntest.xyz.key --cert ???????_xiniao.aliyuntest.xyz.pem

image.png

5.创建 Ingress 规则

touch Ingress.yaml

image.png

编辑内容如下:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: httpbin
  namespace: default
spec:
  ingressClassName: nginx
  rules:
  - host: xiniao.aliyuntest.xyz
    http:
      paths:
      - backend:
          serviceName: myweb
          servicePort: 80
        path: /
  tls:
  - hosts:
    - xiniao.aliyuntest.xyz
    secretName: mysecret

创建 Ingress:

kubectl create -f Ingress.yaml

image.png

6.在 hosts 里绑定域名和 IP

kubectl get ingress httpbin 得到 ingress 的域名和 ip(域名在“HOSTS”字段下, ip 在 “ADDRESS”字段下)

image.png

编辑客户端(这里可以用个人的windows-pc)的C:\Windows\System32\drivers\etc\hosts 文件,添加一行:

47.114.175.34 xiniao.aliyuntest.xyz

7.亲和性调度

任务:将 httpbin 这个 deployment 尽可能调度到与 redis 的 pod 相同的节点。

创建 redis 的 deployment。

touch redis.yaml

文件内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: redis
  name: redis
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  template:
    metadata:
      labels:
        app: redis
    spec:
      containers:
      - image: 'redis:latest'
        imagePullPolicy: IfNotPresent
        name: redis
        resources:
          requests:
            cpu: 250m
            memory: 512Mi

image.png

编辑 httpbin 这个 deployment:

kubectl edit deployment httpbin

添加如下字段:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
  template:
    metadata:
      labels:
        app: httpbin
    spec:
      # 添加亲和性配置
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - redis
            topologyKey: kubernetes.io/hostname
       # 结束添加
      containers:
      - image: 'docker.io/kennethreitz/httpbin:latest'
        imagePullPolicy: IfNotPresent
        env:
        - name: aliyun_logs_log-stdout
          value: stdout
        name: httpbin
        ports:
        - containerPort: 80
          protocol: TCP
        resources:
          limits:
            cpu: 500m
            memory: 100Mi
          requests:
            cpu: 250m
            memory: 32Mi

image.png

保存后,验证 redis 和 httpbin 的 pod 在同一个节点:

image.png

8.实现 httpbin 水平伸缩

创建 hpa:

touch httpbin-hpa.yaml

输入以下内容:

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: httpbin-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: httpbin
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      targetAverageUtilization: 80

执行

kubectl create -f httpbin-hpa.yaml

创建HPA, 然后使用

kubectl get hpa

image.png

查看 HPA:

image.png

使用jmeter进行压测(JMeter下载安装及入门教程https://blog.csdn.net/wust_lh/article/details/86095924?spm=a2c6h.13858378.0.0.8d751575cbYbFF,或者可选使用阿里云pts压测)

jmeter配置参考附件中的配置文件,xiniaotest.jmx

打开jmeter,导入xiniaotest.jmx配置

image.png

修改 http 请求,,输入要访问的域名和端口,参考:

image.png

点击“start”按钮运行 jmeter 压测:

image.png

再次查看 hpa:

image.png

可以看到,通过水平伸缩,副本数已经变成 5 了。但此时 targets 还很大,因为此时达到了 hpa 设定的最大副本数限制。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
2月前
|
存储 Kubernetes 持续交付
介绍一下Kubernetes的应用场景
【10月更文挑战第18天】介绍一下Kubernetes的应用场景。
148 3
|
2月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
127 60
|
2月前
|
Prometheus Kubernetes 监控
k8s部署针对外部服务器的prometheus服务
通过上述步骤,您不仅成功地在Kubernetes集群内部署了Prometheus,还实现了对集群外服务器的有效监控。理解并实施网络配置是关键,确保监控数据的准确无误传输。随着监控需求的增长,您还可以进一步探索Prometheus生态中的其他组件,如Alertmanager、Grafana等,以构建完整的监控与报警体系。
233 62
|
13天前
|
Kubernetes 监控 Cloud Native
Kubernetes集群的高可用性与伸缩性实践
Kubernetes集群的高可用性与伸缩性实践
46 1
|
17天前
|
监控 持续交付 Docker
Docker 容器化部署在微服务架构中的应用有哪些?
Docker 容器化部署在微服务架构中的应用有哪些?
|
17天前
|
监控 持续交付 Docker
Docker容器化部署在微服务架构中的应用
Docker容器化部署在微服务架构中的应用
|
25天前
|
JavaScript 持续交付 Docker
解锁新技能:Docker容器化部署在微服务架构中的应用
【10月更文挑战第29天】在数字化转型中,微服务架构因灵活性和可扩展性成为企业首选。Docker容器化技术为微服务的部署和管理带来革命性变化。本文探讨Docker在微服务架构中的应用,包括隔离性、可移植性、扩展性、版本控制等方面,并提供代码示例。
56 1
|
2月前
|
JSON Kubernetes 容灾
ACK One应用分发上线:高效管理多集群应用
ACK One应用分发上线,主要介绍了新能力的使用场景
|
12天前
|
存储 Kubernetes Devops
Kubernetes集群管理和服务部署实战
Kubernetes集群管理和服务部署实战
31 0
|
2月前
|
Kubernetes 持续交付 开发工具
ACK One GitOps:ApplicationSet UI简化多集群GitOps应用管理
ACK One GitOps新发布了多集群应用控制台,支持管理Argo CD ApplicationSet,提升大规模应用和集群的多集群GitOps应用分发管理体验。