1. 前言
本實驗文檔基於單機 es7 作為 skywalking 的后端存儲,使用 nfs 動態卷 storageclass,es 沒有使用賬號密碼。
2. 環境
- k8s 集群:v1.20.4 版本
k8s-master1 | 192.168.110.235 |
---|---|
k8s-node1 | 192.168.110.236 |
k8s-node2 | 192.168.110.237 |
nfs | 192.168.110.239 |
- elasticsearch:7.12.0
- skywalking:
- oap-server: 無狀態服務后端,主要負責處理核心邏輯,可以簡單理解為一個標准 java web 項目。
- skywalking-ui: UI 前端,通過 graphql 連接 oap-server 提供用戶查詢等 UI 展示。
- agent: 各種語言實現的 agent 負責抓取應用運行數據並上報給 oap-server,核心的指標上報來源。
- DB: 各種數據庫,負責存儲 Skywalking 的指標數據,生產環境推薦 ES、TiDB、MySQL。
3. nfs 安裝
4. elasticsearch 安裝
4.1 安裝 es 7.12.0
cat > elasticsearch-single.yaml << EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: elasticsearch-single
namespace: efk
labels:
k8s-app: elasticsearch-single
spec:
replicas: 1
selector:
matchLabels:
k8s-app: elasticsearch-single
template:
metadata:
labels:
k8s-app: elasticsearch-single
spec:
containers:
- image: elasticsearch:7.12.0
name: elasticsearch-single
resources:
limits:
cpu: 2
memory: 3Gi
requests:
cpu: 0.5
memory: 500Mi
env:
- name: "discovery.type"
value: "single-node"
- name: ES_JAVA_OPTS
value: "-Xms512m -Xmx2g"
ports:
- containerPort: 9200
name: db
protocol: TCP
volumeMounts:
- name: elasticsearch-data
mountPath: /usr/share/elasticsearch/data
volumes:
- name: elasticsearch-data
persistentVolumeClaim:
claimName: es-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: es-pvc
namespace: efk
spec:
#指定動態PV 名稱
storageClassName: "elastic-nfs-client"
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: elasticsearch-single
namespace: efk
spec:
ports:
- port: 9200
protocol: TCP
targetPort: 9200
selector:
k8s-app: elasticsearch-single
EOF
kubectl apply -f elasticsearch-single.yaml
5. 安裝 skywalking
5.1 安裝 helm
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
5.2 初始化 skywalking 的 charts 配置
# clone helm 倉庫
git clone https://github.com/apache/skywalking-kubernetes
cd skywalking-kubernetes/chart
# 即使使用外部 ES 也要添加這個 repo,否則會導致依賴錯誤
helm repo add elastic https://helm.elastic.co
helm dep up skywalking
# 創建 skywalking 的 namespace
kubectl create namespace skywalking
5.3 配置 skywalking 的 vaules 配置參數:
初始化完成后需要自行調整配置文件,配置 oap-server 使用外部 ES,當然你也可以使用 values 自帶的 es 的配置示例,這里不做過多介紹
cat > skywalking/values-my-es-01.yaml <<EOF
oap:
image:
tag: 8.4.0-es7
storageType: elasticsearch7
ui:
image:
tag: 8.4.0
service:
type: NodePort
externalPort: 80
internalPort: 8080
nodePort: 30008
elasticsearch:
enabled: false
config:
host: elasticsearch-single.efk
port:
http: 9200
#user: "" # [optional]
#password: "xxx" # [optional]
EOF
5.4 helm 安裝 skywalking 8.4.0
helm install skywalking skywalking -n skywalking -f ./skywalking/values-my-es-01.yaml
5.4.1 卸載方式:
helm uninstall skywalking -n skywalking
5.4.2 持續查看 pod 安裝進度
kubectl get pod -n skywalking -w
5.4.3 對外暴露 skywalking 端口,臨時,但是本篇我用了 NodePort 的方法開放了端口,生產中也可以使用 ingress 的方式開放
export POD_NAME=$(kubectl get pods --namespace skywalking -l "app=skywalking,release=skywalking,component=ui" -o jsonpath="{.items[0].metadata.name}")
kubectl port-forward $POD_NAME 8080:8080 --namespace skywalking
5.4.4 查看 skywalking 的訪問:其實就是 k8s master/node ip + nodeport
export NODE_PORT=$(kubectl get --namespace skywalking -o jsonpath="{.spec.ports[0].nodePort}" services skywalking-ui)
export NODE_IP=$(kubectl get nodes --namespace skywalking -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
5.5 運行狀態檢查
[root@node01 chart]# kubectl get pod,svc -n skywalking
NAME READY STATUS RESTARTS AGE
pod/skywalking-es-init-22g88 0/1 Completed 0 115s
pod/skywalking-oap-687f98bd9b-p5d69 1/1 Running 0 114s
pod/skywalking-oap-687f98bd9b-wxffb 1/1 Running 0 114s
pod/skywalking-ui-6fd5544496-cmmf9 1/1 Running 0 115s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/skywalking-oap ClusterIP 10.0.0.88 <none> 12800/TCP,11800/TCP 115s
service/skywalking-ui NodePort 10.0.0.87 <none> 80:30553/TCP 115s
5.6 結果:
es 多了一堆 index
skywalking 訪問狀態