diff --git a/metrics-demo/README.md b/metrics-demo/README.md
new file mode 100644
index 00000000..de355189
--- /dev/null
+++ b/metrics-demo/README.md
@@ -0,0 +1,124 @@
+# metrics-demo
+
+## Environment prepare
+
+- KubeEdge、k8s 、node、cloud and so on
+
+## Steps
+
+1. Open `edgeStream` in edge
+
+ ```sh
+ vim /etc/kubeedge/config/edgecore.yaml
+ ```
+
+ ```yaml
+ modules:
+ ...
+ edgeStream:
+ enable: true
+ handshakeTimeout: 30
+ readDeadline: 15
+ server: 124.222.110.11:10004
+ tlsTunnelCAFile: /etc/kubeedge/ca/rootCA.crt
+ tlsTunnelCertFile: /etc/kubeedge/certs/server.crt
+ tlsTunnelPrivateKeyFile: /etc/kubeedge/certs/server.key
+ writeDeadline: 15
+ ....
+ ```
+
+
+
+2. Restart EdgeCore
+
+ ```sh
+ systemctl restart edgecore.service
+ ```
+
+3. Download `metrics-server` yaml,You should care about `Metrics Server Version` and ` Kubernetes version` ,more in [metrics-server](https://github.com/kubernetes-sigs/metrics-server)
+
+ ```sh
+ wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
+ ```
+
+4. Add ` hostNetwork: true` in yaml and ` - --kubelet-insecure-tls`
+
+ ```yaml
+ template:
+ metadata:
+ labels:
+ k8s-app: metrics-server
+ spec:
+ hostNetwork: true
+ containers:
+ - args:
+ - --cert-dir=/tmp
+ - --secure-port=4443
+ - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
+ - --kubelet-use-node-status-port
+ - --metric-resolution=15s
+ - --kubelet-insecure-tls
+ image: k8s.gcr.io/metrics-server/metrics-server:v0.6.2
+ ```
+
+5. Apply for metrics-server when you can normal download from `k8s.gcr.io`
+
+ ```sh
+ kubectl apply -f components.yaml
+ ```
+
+ When you can't access normally `k8s.gcr.io`,you can try this way:
+
+ ```sh
+ # find the image
+ cat components.yaml
+
+ # Pull from dockerproxy
+ docker pull k8s.dockerproxy.com/metrics-server/metrics-server:v0.6.2
+
+ # use docker tag
+ docker tag k8s.dockerproxy.com/metrics-server/metrics-server:v0.6.2 k8s.gcr.io/metrics-server/metrics-server:v0.6.2
+
+ # apply for yaml
+ kubectl apply -f components.yaml
+ ```
+
+ ## Test
+
+ It is tested by redis.
+
+ 1. Edit the `redis.yaml`, you should care `spec/nodeName` to use your nodeName
+
+ ```sh
+ vim redis.yaml
+ ```
+
+ 2. Apply for `redis.yaml`
+
+ ```sh
+ kubectl apply redis.yaml
+ ```
+
+ 3. Now,you can view logs from edge
+
+ ```sh
+ # find redid pod
+ kubectl get po -A
+
+ # view logs in cloud
+ kubectl logs redis-7c84bc4b7f-x5kmk
+
+ # view log in edge to validate
+ docker logs k8s_redis_redis-7c84bc4b7f-znjs4_default_3ce4f96b-f8a8-4d1f-a983-b8165b65522f_0
+ ```
+
+
+You will get results just like this
+
+Cloud logs:
+
+
+
+Edge logs:
+
+
diff --git a/metrics-demo/crds/components.yaml b/metrics-demo/crds/components.yaml
new file mode 100644
index 00000000..d804dcb5
--- /dev/null
+++ b/metrics-demo/crds/components.yaml
@@ -0,0 +1,197 @@
+apiVersion: v1
+kind: ServiceAccount
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: metrics-server
+ namespace: kube-system
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ labels:
+ k8s-app: metrics-server
+ rbac.authorization.k8s.io/aggregate-to-admin: "true"
+ rbac.authorization.k8s.io/aggregate-to-edit: "true"
+ rbac.authorization.k8s.io/aggregate-to-view: "true"
+ name: system:aggregated-metrics-reader
+rules:
+ - apiGroups:
+ - metrics.k8s.io
+ resources:
+ - pods
+ - nodes
+ verbs:
+ - get
+ - list
+ - watch
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRole
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: system:metrics-server
+rules:
+ - apiGroups:
+ - ""
+ resources:
+ - nodes/metrics
+ verbs:
+ - get
+ - apiGroups:
+ - ""
+ resources:
+ - pods
+ - nodes
+ verbs:
+ - get
+ - list
+ - watch
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: RoleBinding
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: metrics-server-auth-reader
+ namespace: kube-system
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: Role
+ name: extension-apiserver-authentication-reader
+subjects:
+ - kind: ServiceAccount
+ name: metrics-server
+ namespace: kube-system
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: metrics-server:system:auth-delegator
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: system:auth-delegator
+subjects:
+ - kind: ServiceAccount
+ name: metrics-server
+ namespace: kube-system
+---
+apiVersion: rbac.authorization.k8s.io/v1
+kind: ClusterRoleBinding
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: system:metrics-server
+roleRef:
+ apiGroup: rbac.authorization.k8s.io
+ kind: ClusterRole
+ name: system:metrics-server
+subjects:
+ - kind: ServiceAccount
+ name: metrics-server
+ namespace: kube-system
+---
+apiVersion: v1
+kind: Service
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: metrics-server
+ namespace: kube-system
+spec:
+ ports:
+ - name: https
+ port: 443
+ protocol: TCP
+ targetPort: https
+ selector:
+ k8s-app: metrics-server
+---
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: metrics-server
+ namespace: kube-system
+spec:
+ selector:
+ matchLabels:
+ k8s-app: metrics-server
+ strategy:
+ rollingUpdate:
+ maxUnavailable: 0
+ template:
+ metadata:
+ labels:
+ k8s-app: metrics-server
+ spec:
+ hostNetwork: true
+ containers:
+ - args:
+ - --cert-dir=/tmp
+ - --secure-port=4443
+ - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
+ - --kubelet-use-node-status-port
+ - --metric-resolution=15s
+ image: k8s.gcr.io/metrics-server/metrics-server:v0.6.2
+ imagePullPolicy: IfNotPresent
+ livenessProbe:
+ failureThreshold: 3
+ httpGet:
+ path: /livez
+ port: https
+ scheme: HTTPS
+ periodSeconds: 10
+ name: metrics-server
+ ports:
+ - containerPort: 4443
+ name: https
+ protocol: TCP
+ readinessProbe:
+ failureThreshold: 3
+ httpGet:
+ path: /readyz
+ port: https
+ scheme: HTTPS
+ initialDelaySeconds: 20
+ periodSeconds: 10
+ resources:
+ requests:
+ cpu: 100m
+ memory: 200Mi
+ securityContext:
+ allowPrivilegeEscalation: false
+ readOnlyRootFilesystem: true
+ runAsNonRoot: true
+ runAsUser: 1000
+ volumeMounts:
+ - mountPath: /tmp
+ name: tmp-dir
+ nodeSelector:
+ kubernetes.io/os: linux
+ priorityClassName: system-cluster-critical
+ serviceAccountName: metrics-server
+ volumes:
+ - emptyDir: {}
+ name: tmp-dir
+---
+apiVersion: apiregistration.k8s.io/v1
+kind: APIService
+metadata:
+ labels:
+ k8s-app: metrics-server
+ name: v1beta1.metrics.k8s.io
+spec:
+ group: metrics.k8s.io
+ groupPriorityMinimum: 100
+ insecureSkipTLSVerify: true
+ service:
+ name: metrics-server
+ namespace: kube-system
+ version: v1beta1
+ versionPriority: 100
diff --git a/metrics-demo/crds/redis.yaml b/metrics-demo/crds/redis.yaml
new file mode 100644
index 00000000..7d696cbb
--- /dev/null
+++ b/metrics-demo/crds/redis.yaml
@@ -0,0 +1,18 @@
+apiVersion: apps/v1
+kind: Deployment
+metadata:
+ name: redis
+spec:
+ selector:
+ matchLabels:
+ app: redis
+ replicas: 1
+ template:
+ metadata:
+ labels:
+ app: redis
+ spec:
+ nodeName: edge-02
+ containers:
+ - name: redis
+ image: redis
diff --git a/metrics-demo/images/metrics-redis-result-cloud.png b/metrics-demo/images/metrics-redis-result-cloud.png
new file mode 100644
index 00000000..ed2033e1
Binary files /dev/null and b/metrics-demo/images/metrics-redis-result-cloud.png differ
diff --git a/metrics-demo/images/metrics-redis-result-edge.png b/metrics-demo/images/metrics-redis-result-edge.png
new file mode 100644
index 00000000..90955e4b
Binary files /dev/null and b/metrics-demo/images/metrics-redis-result-edge.png differ