基础结构

本次实战的基础结构如下图所示: 

8a83dd720106d80b165aeb1d9815cbd0.png

一共有两个Pod:ELK和web应用;

ELK的Pod会暴露两个服务,一个暴露logstash的5044端口,给filebeat用,另一个暴露kibana的5601端口,给搜索日志的用户访问的时候用;

web应用暴露一个服务,给用户通过浏览器访问;

实战步骤简介

部署ELK的pod和服务;

部署web应用的pod和服务;

web应用的pod从一个扩展为三个;

体验ELK;

部署ELK

我们从ELK Sever开始部署吧: 

1. ssh登录到可以执行kubectl命令的机器上去; 

2. 创建elk的部署脚本elkhost.yaml,内容如下:

apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: elkhostspec:  replicas: 1  template:    metadata:     labels:       name: elkhost    spec:     containers:     - name: elkhost       image: sebp/elk:622       tty: true       ports: [{          "containerPort": 5601        },{          "containerPort": 5044        }]

如上所示,暴露了两个端口:kibana的5601和logstash的5044; 3. 在elkhost.yaml所在目录执行命令kubectl create -f elkhost.yaml,即可创建elk对应的pod,如下:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl get podsNAME                       READY     STATUS    RESTARTS   AGEelkhost-54c9bbd8d5-ffq68   1/1       Running   0          3m

4. 将kibana的5601端口以NodePort的方式对外暴露,这样外部就可以通过节点IP地址来访问kibana服务了,创建部署脚本elkkibana-svc.yaml,kibana的服务通过node节点的30001端口对外暴露,内容如下:

apiVersion: v1kind: Servicemetadata:  name: elkkibanaspec:  type: NodePort  ports:       - port: 5601         nodePort: 30001  selector:    name: elkhost

5. 将logstash的5044端口以ClusterIP的方式对外暴露,这样其他pod的filebeat就可以通过服务名加5044端口来访问logstash服务了,创建部署脚本elkhost-svc.yaml,logstash的服务通过5044端口对K8S内部的pod暴露,内容如下:

apiVersion: v1kind: Servicemetadata:  name: elkhostspec:  type: ClusterIP  ports:       - port: 5044         targetPort: 5044  selector:    name: elkhost

6. 在elkhost-svc.yaml所在目录执行命令kubectl create -f elkhost-svc.yaml && kubectl create -f elkkibana-svc.yaml,即可创建elkhost和elkkibana这两个服务,如下:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl create -f elkhost-svc.yaml && kubectl create -f elkkibana-svc.yamlservice "elkhost" createdservice "elkkibana" createdroot@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl get serviceNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEelkhost      ClusterIP   10.43.103.244           5044/TCP         9selkkibana    NodePort    10.43.219.137           5601:30001/TCP   9skubernetes   ClusterIP   10.43.0.1               443/TCP          16d

7. 执行命令查看elkhost的pod部署在K8S的哪个node节点上:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl describe pod elkName:           elkhost-54c9bbd8d5-ffq68Namespace:      defaultNode:           willzhao-vostro-3267/192.168.31.89Start Time:     Mon, 30 Apr 2018 16:22:04 +0800Labels:         name=elkhost                pod-template-hash=1075668481Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"elkhost-54c9bbd8d5","uid":"9096cde8-4c4f-11e8-a776-024f8a041a1a"...Status:         Running...

如上所示,Node: willzhao-vostro-3267/192.168.31.89显示了这个pod部署的节点IP是192.168.31.89; 

8. 打开浏览器,输入192.168.31.89:30001,即可访问到Kibana服务,如下图: 

21b8f6639aa2b20c88835216df0345ad.png

部署应用

ELK Sever已经OK,接下来部署web应用: 

1. 创建elkwebdemo的部署脚本elkwebdemo.yaml,内容如下:

apiVersion: extensions/v1beta1kind: Deploymentmetadata:  name: elkwebdemospec:  replicas: 1  template:    metadata:     labels:       name: elkwebdemo    spec:     containers:     - name: elkwebdemo       image: bolingcavalry/elkdemo:0.0.1-SNAPSHOT       tty: true       ports:       - containerPort: 8080

2. 在elkwebdemo.yaml所在目录执行命令kubectl create -f elkwebdemo.yaml,即可创建elk对应的pod,如下:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl get podNAME                         READY     STATUS    RESTARTS   AGEelkhost-944bcbcd4-8vpbs      1/1       Running   0          4melkwebdemo-dddbcfc6f-x4pk6   1/1       Running   0          9s

3. 创建elk对外服务的部署脚本elkwebdemo-svc.yaml,web的服务通过node节点的30002端口对外暴露,内容如下:

apiVersion: v1kind: Servicemetadata:  name: elkwebdemospec:  type: NodePort  ports:       - port: 8080         nodePort: 30002   selector:    name: elkwebdemo

5. 在elkwebdemo-svc.yaml所在目录执行命令kubectl create -f elkwebdemo-svc.yaml,即可创建elkwebdemo对应的pod,如下:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl get serviceNAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGEelkhost      ClusterIP   10.43.103.244           5044/TCP         6melkkibana    NodePort    10.43.219.137           5601:30001/TCP   6mkubernetes   ClusterIP   10.43.0.1               443/TCP          16d

6. 执行命令查看elkwebdemo的pod部署在K8S的哪个node节点上:

root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl describe pod elkwebdemoName:           elkwebdemo-dddbcfc6f-8bbrbNamespace:      defaultNode:           willzhao-vostro-3267/192.168.31.89Start Time:     Mon, 30 Apr 2018 16:28:37 +0800Labels:         name=elkwebdemo                pod-template-hash=888679729Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicaSet","namespace":"default","name":"elkwebdemo-dddbcfc6f","uid":"7a9364d1-4c50-11e8-a776-024f8a041a1...Status:         Running...

如上所示,Node: willzhao-vostro-3267/192.168.31.89显示了这个pod部署的节点IP是192.168.31.89; 

7. 打开浏览器,输入http://192.168.31.89:30002/hello/tom,即可访问到web服务,如下图: 

e7100b08df3555be1dd868c862101fb5.png

设置kibana

再次打开kibana页面,如下图所示,点击红框中的“Discover”,发现已经搜集到了上报的日志,如绿框所示: 

6c724475db7f734ae7e463ea6b042c04.png

如下图设置: 

d4c88b52c2e4250b2a07539a19170194.png

继续设置,如下图: 

7bbbdc0c0e6d4125f1bc9adbe5e4b871.png

再此点击左上角的”Discover”,既可开始搜索web应用日志,如下图: 

59505998bf8af8b460ffdf15fa59cd1d.png

web应用扩容

现在我们模拟生产环境的在线扩容: 

1. 将web应用从一个扩展到三个,执行以下命令:

kubectl scale deployment elkwebdemo --replicas=3

2. 可以看到web应用对应的pod已经扩展了,如下所示:

root@willzhao-Vostro-3267:~# kubectl scale deployment elkwebdemo --replicas=3

deployment "elkwebdemo" scaled

root@willzhao-Vostro-3267:~# kubectl get pod

NAME                         READY     STATUS    RESTARTS   AGE

elkhost-944bcbcd4-8vpbs      1/1       Running   0          1h

elkwebdemo-dddbcfc6f-crzcp   1/1       Running   0          11s

elkwebdemo-dddbcfc6f-tsppk   1/1       Running   0          11s

elkwebdemo-dddbcfc6f-x4pk6   1/1       Running   0          1h

3. 为了能多上报一些日志,在浏览器上多刷新几次这个地址:http://192.168.31.89:30002/hello/tom 4. 回到kibana页面,如下图,点击红框中的“host”,展开的信息显示,这些日志来自三个host: 

fc00c3dc5db77203ff0b06eb6e99bd51.png

5. 打开K8S的dashboard页面看一下容器信息,如下图,可以见到三个web容器的hostname和kibana中的host是一样的:

68410792d788e52e3be69666f2a10e1a.png


欢迎关注运维自研堂订阅号,运维自研堂是一个技术分享平台,主要是运维自动化开发:linux、python、django、saltstack、tornado、bootstrap、redis、golang、docker、etcd、k8s、ci/cd、devops等经验分享。

  • 容器平台自动化CI/CD流水线实操

  • 谷歌开源 Kubernetes 原生 CI/CD 构建框架 Tekton

  • 架构师是怎么炼成的

  • IPv6时代对业务的挑战

  • 如何打造一个安全稳定高效的容器云平台

  • 深入理解无服务器架构(Faas/Serverless)

  • CI/CD 场景价值

  • 云原生架构及设计原则

  • Jira与Zabbix结合

  • 【Zabbix】告警事件归档与提取

  • 【HMonitor】Zabbix告警管理平台

  • Zabbix 告警收敛

  • Zabbix v3.0微信报警及API使用

  • zabbix v3.0安装部署及使用

  • Web权限设计

  • 搭建 kubernetes 容器编排平台

  • 区块链入门教程

  • 基于Gogs+Drone搭建的私有CI/CD平台

  • WEB架构设计心得

  • Docker与CI/CD

  • 【实战篇】Docker的CI/CD流水线实践

  • 基于 Harbor 搭建 Docker 私有镜像仓库

  • 利用helm部署应用到kubernetes

开源    创新     共享

投稿&商务合作

Mail:idevops168@163.com       QQ:785249378     微信:Idevops001

234615cd3c76cd1b5f4fd7f5c4194570.gif

牛人并不可怕,可怕的是牛人比我们还努力!

717982752d0cfd7ef7d02f894c0c8135.png

长按图片,识别加入我们!

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐