本次實戰的基礎結構如下圖所示:
一共有兩個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/v1beta1
kind: Deployment
metadata:
name: elkhost
spec:
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 pods
NAME READY STATUS RESTARTS AGE
elkhost-54c9bbd8d5-ffq68 1/1 Running 0 3m
4. 將kibana的5601埠以NodePort的方式對外暴露,這樣外部就可以透過節點IP地址來訪問kibana服務了,建立部署指令碼elkkibana-svc.yaml,kibana的服務透過node節點的30001埠對外暴露,內容如下:
apiVersion: v1
kind: Service
metadata:
name: elkkibana
spec:
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: v1
kind: Service
metadata:
name: elkhost
spec:
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.yaml
service “elkhost” created
service “elkkibana” created
root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elkhost ClusterIP 10.43.103.244 5044/TCP 9s
elkkibana NodePort 10.43.219.137 5601:30001/TCP 9s
kubernetes ClusterIP 10.43.0.1 443/TCP 16d
7. 執行命令檢視elkhost的pod部署在K8S的哪個node節點上:
root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl describe pod elk
Name: elkhost-54c9bbd8d5-ffq68
Namespace: default
Node: willzhao-vostro-3267/192.168.31.89
Start Time: Mon, 30 Apr 2018 16:22:04 +0800
Labels: name=elkhost
pod-template-hash=1075668481
Annotations: 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服務,如下圖:
部署應用
ELK Sever已經OK,接下來部署web應用:
1. 建立elkwebdemo的部署指令碼elkwebdemo.yaml,內容如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: elkwebdemo
spec:
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 pod
NAME READY STATUS RESTARTS AGE
elkhost-944bcbcd4-8vpbs 1/1 Running 0 4m
elkwebdemo-dddbcfc6f-x4pk6 1/1 Running 0 9s
3. 建立elk對外服務的部署指令碼elkwebdemo-svc.yaml,web的服務透過node節點的30002埠對外暴露,內容如下:
apiVersion: v1
kind: Service
metadata:
name: elkwebdemo
spec:
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 service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elkhost ClusterIP 10.43.103.244 5044/TCP 6m
elkkibana NodePort 10.43.219.137 5601:30001/TCP 6m
kubernetes ClusterIP 10.43.0.1 443/TCP 16d
6. 執行命令檢視elkwebdemo的pod部署在K8S的哪個node節點上:
root@willzhao-Vostro-3267:/usr/local/work/elkk8s# kubectl describe pod elkwebdemo
Name: elkwebdemo-dddbcfc6f-8bbrb
Namespace: default
Node: willzhao-vostro-3267/192.168.31.89
Start Time: Mon, 30 Apr 2018 16:28:37 +0800
Labels: name=elkwebdemo
pod-template-hash=888679729
Annotations: 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服務,如下圖:
設定kibana
再次開啟kibana頁面,如下圖所示,點選紅框中的“Discover”,發現已經蒐集到了上報的日誌,如綠框所示:
如下圖設定:
繼續設定,如下圖:
再此點選左上角的”Discover”,既可開始搜尋web應用日誌,如下圖:
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:
5. 開啟K8S的dashboard頁面看一下容器資訊,如下圖,可以見到三個web容器的hostname和kibana中的host是一樣的: