实验二:应用部署进阶 | 学习笔记

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
日志服务 SLS,月写入数据量 50GB 1个月
简介: 快速学习实验二:应用部署进阶

开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:实验二:应用部署进阶 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/913/detail/14611


实验二:应用部署进阶

一、实验简介

该实验是“云原生与 Kubernates 基础课程”的配套实验。 涉及 ACK 集群上 ingress、pod ,以及日志服务、hpa 的应用部署。 进行该实验的前提:需熟悉上述理论概念,建议完成配套理论课程学习。

 

二、实验内容

Ÿ 通过 Ingress 服务来暴露 pod,让应用可以通过统一的入口访问;

Ÿ 通过 pod 亲和性调度,让 web 的 pod 和 redis 的 pod 尽量调度到一个节点上,提高 web 和 redis 之间的网络质量;

Ÿ 将应用的标准输出日志采集到日志服务,监控日志中的特殊字段内容,如果出现对应字段的日志,通过日志服务进行告警,通知到邮件;

Ÿ 通过创建 hpa 来保证业务高峰期能够自动调整 pod 副本数,来增加架构弹性;

 

三、实验目标

Ÿ 通过 Ingress 暴露服务;

Ÿ 使用 pod 亲和性调度;

Ÿ 应用日志采集;

Ÿ 掌握应用日志分析和告警;

Ÿ 实现 pod 水平伸缩。

实验地址:https://developer.aliyun.com/adc/scenario/17ffed0540f340a2949f5d18d57d2bcd

 

四、实验步骤

1. 了解实验架构

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

2. 环境准备

注:后台已创建好了对应的云产品资源,这里仅核实环境和相关配置。

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

b. 使用 ack 里面的 Cloud Shell 进行连接以配置管理集群;

image.png

c. 确认集群具有公网能力,保证可以拉去实验镜像。

3. 创建 deploy 文件

a. touch myweb.yaml; 输入以下内容:

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

b. 使用命令创建 deploy: kubectl create -f myweb.yaml

4. 创建 service 暴露服务

a. 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

b. 执行:kubectl create -f myservice.yaml

5. 创建 secret 文件

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

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

unzip 4211665_xiniao.aliyuntest.xyz_nginx.zip

b. 执行命令:

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

4211665_xiniao.aliyuntest.xyz.pem

6. 创建 Ingress 规则

a. touch Ingress.yaml; 输入如下内容:

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

b. 创建 Ingress: kubectl create -f Ingress.yaml

7. 在 hosts 里绑定域名和 IP

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

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

121.196.13.XX xiniao.aliyuntest.xyz

8. 验证网站访问

浏览器访问测试: https://xiniao.aliyuntest.xyz/delay/1,能正常显示页面内容返回结果。

9. 亲和性调度

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

a. 创建 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

b. 执行 kubectl create -f redis.yaml 创建。

c. 编辑 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

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

image.png

10. 实现 httpbin 水平伸缩

a. 创建 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

b. 执行 kubectl create -f httbpin-hpa.yaml,创建 HPA, 然后使用,kubectl get hpa 查看 HPA:

image.png

c. 使用 jmeter 进行压测( JMeter 下载安装及入门教程,或者可选使用阿里云 pts压测)。

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

打开 jmeter,导入 xiniaotest.jmx 配置(配置下载地址):

image.png

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

image.png

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

image.png

e. 再次查看 hpa:

image.png

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

 

相关文章
|
7月前
|
SQL Java 开发工具
若依矿建部署教程
若依矿建部署教程
66 0
|
6月前
|
搜索推荐 物联网 数据库
技术笔记:X+(xPlus)部署指南
技术笔记:X+(xPlus)部署指南
38 1
|
Kubernetes 负载均衡 程序员
【k8s 系列】k8s 学习七,在 K8S 中部署一个应用 上
本身在 K8S 中部署一个应用是需要写 yaml 文件的,我们这次简单部署,通过拉取网络上的镜像来部署应用,会用图解的方式来分享一下,过程中都发生了什么
245 0
|
Kubernetes Docker Perl
【k8s 系列】k8s 学习八,在 K8S 中部署一个应用 下
接着上一篇继续部署应用到 K8S中 之前简单部署的简单集群,三个工作节点是运行在 docker 和 kubelet 的,还有一个是控制节点
121 0
|
机器学习/深度学习 人工智能 自然语言处理
Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)
Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)
Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)
|
Kubernetes 安全 Cloud Native
KCNA考试 第四章:学习kubernetes需要掌握的基础知识
KCNA考试 第四章:学习kubernetes需要掌握的基础知识
KCNA考试 第四章:学习kubernetes需要掌握的基础知识
|
Kubernetes 数据可视化 API
k8s学习二:学习基本概念和搭建dashboard
k8s学习二:学习基本概念和搭建dashboard
244 0
k8s学习二:学习基本概念和搭建dashboard
|
SQL 弹性计算 关系型数据库
|
存储 SQL 运维
|
IDE JavaScript 测试技术
开发部署|学习笔记
快速学习开发部署
开发部署|学习笔记