准备工作
安装 kubectl
Linux 安装 kubectl
curl -LO https://kstarter-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/kubectl/kubectl/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl --help
MacOS 安装 kubectl
curl -LO https://kstarter-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/kubectl/kubectl/darwin/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
kubectl --help
Windows 安装 kubectl
把 https://kstarter-cn-hangzhou.oss-cn-hangzhou.aliyuncs.com/kubectl/kubectl/windows/amd64/kubectl.exe 放到系统 PATH 路径下
kubectl --help
配置 kubeconfig
配置 kubectl 连接 Kubernetes 集群的配置,可参考文档 通过kubectl连接Kubernetes集群
创建 Kubernetes 集群
如果还未创建 Kubernetes 集群,可以到这里 创建一个 Kubernetes 集群
部署 Istio
在容器服务集群管理页面
可以直接在目标集群上部署 Istio
选择启用链路追踪,点击【立即开通】 跳转到调用链页面获取接入点链接
到链路追踪页面开启日志服务授权
如下所示的状态标明已经开通成功
选择对应 region 的 ZipKin 内网 v1 的接入点
回到 Istio 页面粘贴接入点,继续安装。
部署 Knative
到容器服务的控制台上面选择好目标集群使用一键部署功能直接部署 Knative 安装文档
开始部署 Knative, 等十几秒钟即可完成部署。
部署 WordPress
开启 Istio Sidecar 注入
kubectl label namespace default istio-injection=enabled --overwrite
添加 egress
执行下面命令添加 egress 配置,使得 Pod 内部可以访问数据库服务:
kubectl apply -f https://knative-sample.oss-cn-shanghai.aliyuncs.com/kubecon-2019-sh/egress.yaml
修改默认域名
默认 Istio Gateway 绑定的域名是 example.com,防止 example.com 未备案导致不能访问我们把域名改成 kubedemo.com
kubectl apply -f https://knative-sample.oss-cn-shanghai.aliyuncs.com/kubecon-2019-sh/custom-domain.yaml
创建 Knative Service
点击链接下载 wp-service.yaml ,把文件中的 __DB_NAME__
替换成你自己的数据库名称.
执行 kubectl apply -f wp-service.yaml
安装WordPress
- 获取 istio Gateway IP
└─# kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"
47.95.139.84
- 获取 WordPress 访问地址
└─# kubectl get ksvc wordpress --output=custom-columns=NAME:.metadata.name,DOMAIN:.status.domain
NAME DOMAIN
wordpress wordpress.default.kubedemo.com
- 添加 host 绑定
Linux 和 Mac 编辑 /etc/hosts
文件,在最后添加一行
sudo vim /etc/hosts
47.95.139.xx wordpress.default.kubedemo.com
Windows
直接在 C:\WINDOWS\system32\drivers\etc
目录的 HOSTS 文件最后添加一行 47.95.139.xx wordpress.default.kubedemo.com
即可。具体操作方法参见:https://yq.aliyun.com/articles/706009
- 通过浏览器访问 WordPress
点击链接:http://wordpress.default.kubedemo.com/ 应该就能访问到部署的 WordPress 了
CICD 自动化
例子: https://github.com/knative-sample/wordpress
- CICD 原理介绍
开源工具
- deployer https://github.com/knative-sample/deployer
- github-trigger-tmpl https://github.com/knative-sample/github-trigger-tmpl
运维操作
Tracing
到 https://tracing-analysis.console.aliyun.com/ 查看 tracing 信息
选择相应的 Region,点击应用列表查看应用列表
调用链查询页面
日志管理
- 日志服务控制台: https://sls.console.aliyun.com
- 本示例以容器标准输出采集为例进行展示,详细设置步骤可以参考日志服务文档
- 根据 Kubernetes 集群 ID 找到对应的日志服务 Project
- 创建一个新的 Logstore
设置数据导入方式
选择 Docker标准输出
- 配置容器标准输出日志采集策略
{
"inputs": [
{
"detail": {
"IncludeEnv": {
"K_SERVICE": "wordpress"
},
"IncludeLabel": {},
"ExcludeLabel": {}
},
"type": "service_docker_stdout"
}
],
"processors": [
{
"detail": {
"KeepSource": false,
"NoMatchError": true,
"Keys": [
"ip",
"time",
"action",
"url",
"code"
],
"NoKeyError": true,
"Regex": "(\\d+.\\d+.\\d+.\\d+)\\s+-\\s+(\\d+/\\w+/\\d+:\\d+:\\d+:\\d+\\s\\+\\d+)\\s\"(\\w+)\\s(.*)\"\\s(\\d+)",
"SourceKey": "content"
},
"type": "processor_regex"
}
]
}
分别为相应的键值 ip、time、action、url 和 code 设置数据类型
创建完成以后回到刚才的 Project 可以看到创建的 logstore , 然后即可进行日志查询等管理动作
告警
code 400 | SELECT COUNT(*) as total
触发告警
watch -n 1 ' curl http://wordpress.default.kubedemo.com/wp-admin/admin-ajax.php'
过一分钟左右可以看到邮件告警通知
Autoscaler
简单压测
可以到这里下载二进制文件,然后执行如下所示的命令开始压测。
hey -z 15s -c 30 "http://wordpress.default.kubedemo.com/" && kubectl get pods
knload 压测工具
- https://github.com/knative-sample/knload
- token-server :https://github.com/knative-sample/token-server
压测数据展示
压测的并发数陡增导致服务响应时间抖动,但随着 Pod 数量的自动扩容 RT 很快就恢复到了正常水位。
OSS 事件触发
- 安装 MNSOSS Chart 包
- namespace 开启默认 broker
kubectl label namespace default knative-eventing-injection=enabled --overwrite
- 安装 mnsoss source 配置
kubectl apply -f mnsoss.yaml
- 详情参考: https://yq.aliyun.com/articles/706126
- 实验原理
- 向 OSS 中上传一张带有人像的图片
- OSS 上传图片的事件自动触发 Knative 人脸识别程序执行,并且生成一张新图片。新图片中有人像性别的标识。
- 更多场景
清理环境
- 取消 Istio 自动注入
kubectl label namespace default istio-injection-
- 卸载 Knative 组件