企业级运维之云原生与Kubernetes实战课程
第二章第7讲 实验二:应用部署进阶
视频地址:https://developer.aliyun.com/learning/course/913/detail/14611
一、实验简介
该实验是“云原生与Kubernetes基础课程”的配套实验。 涉及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进行连接以配置管理集群;
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 在同一个节点:
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:
c. 使用jmeter进行压测(JMeter下载安装及入门教程,或者可选使用阿里云pts压测)。
jmeter配置参考附件中的配置文件,xiniaotest.jmx
打开jmeter,导入xiniaotest.jmx配置(配置下载地址):
修改 http 请求,,输入要访问的域名和端口,参考:
d. 点击“start”按钮运行jmeter 压测:
e. 再次查看 hpa:
可以看到,通过水平伸缩,副本数已经变成 5 了。但此时 targets 还很大,因为此时达到了 hpa 设定的最大副本数限制。