{"id":266,"date":"2023-03-20T13:00:09","date_gmt":"2023-03-20T13:00:09","guid":{"rendered":"https:\/\/keyshell.net\/blog\/?p=266"},"modified":"2023-03-20T13:00:09","modified_gmt":"2023-03-20T13:00:09","slug":"setup-efk-stack-on-amazon-eks-cluster","status":"publish","type":"post","link":"https:\/\/keyshell.net\/blog\/2023\/03\/20\/setup-efk-stack-on-amazon-eks-cluster\/","title":{"rendered":"Setup EFK Stack on Amazon EKS cluster"},"content":{"rendered":"<h1 id=\"a4a2\" class=\"ie if hh bd ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb bi\" data-selectable-paragraph=\"\"><strong class=\"ak\">About EFK<\/strong><\/h1>\n<p id=\"d8e4\" class=\"pw-post-body-paragraph jc jd hh je b jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ha bi\" data-selectable-paragraph=\"\">When it comes to Kubernetes in production environment, logging has its important role to play. It help to understand where the problem is and what went wrong.<\/p>\n<p id=\"6882\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">EFK is used for log streaming, log analysis, and log monitoring. It is a combination of 3 components.<\/p>\n<p id=\"4e9b\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">1. Elasticsearch \u2014 logging backend for storing, searching and analyzing log data.<\/p>\n<p id=\"03c8\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">2. Fluentd \u2014 logging agent which continuously streams log data to the logging backend.<\/p>\n<p id=\"c2bd\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">3. Kibana \u2014 A tool to visualize log data in the form of dashboards.<\/p>\n<p id=\"0213\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Here, we are using K8s cluster created using AWS EKS. It has 4 nodes with type \u2018t3.medium\u2019 and AMI \u2018amazon linux 2\u2019. Also, add-ons used while setting up the cluster were \u2018kube-proxy\u2019, \u2018vpc-cni\u2019, \u2018coredns\u2019 and \u2018aws-ebs-csi-driver\u2019.<\/p>\n<p id=\"3651\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Also, we have to create persistent volume for Elasticsearch. In that case, \u2018Amazon EBS CSI driver IAM role\u2019 need to be created. For that , please refer the AWS official documentation page:<\/p>\n<p id=\"ebd8\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><a class=\"ae kf\" href=\"https:\/\/docs.aws.amazon.com\/eks\/latest\/userguide\/csi-iam-role.html\" target=\"_blank\" rel=\"noopener ugc nofollow\">https:\/\/docs.aws.amazon.com\/eks\/latest\/userguide\/csi-iam-role.html<\/a><\/p>\n<p id=\"0e9f\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">(You may skip step 11 if KMS Key Encryption is not required).<\/p>\n<p id=\"d536\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">After setting up the EKS cluster, ssh to the Bastion host and install aws cli version 2. Configure the AWS credentials and add the access key ID and secret key using,<\/p>\n<p id=\"c499\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">aws configure<\/em><\/strong><\/p>\n<p id=\"138f\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Add the cluster as a new context using the following command.<\/p>\n<p id=\"6314\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">aws eks \u2014 region=&lt;region&gt; update-kubeconfig \u2014 name &lt;cluster_name&gt;<\/em><\/strong><\/p>\n<p id=\"0200\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">eg:<\/p>\n<p id=\"423a\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">aws eks \u2014 region=us-east-1 update-kubeconfig \u2014 name eks-cluster<\/p>\n<p id=\"959d\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Added new context arn:aws:eks:us-east-1:103423222380:cluster\/eks-cluster to \/root\/.kube\/config<\/p>\n<p id=\"60db\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Install kubectl so that we can manage out cluster from the Bastion host.<\/p>\n<pre>kubectl <span class=\"hljs-keyword\">get<\/span> nodes\r\nNAME STATUS ROLES AGE VERSION\r\nip<span class=\"hljs-number\">-10<\/span>\u2013<span class=\"hljs-number\">0<\/span>\u2013<span class=\"hljs-number\">129<\/span>\u2013<span class=\"hljs-number\">220.<\/span>ec2.<span class=\"hljs-keyword\">internal<\/span> Ready &lt;none&gt; <span class=\"hljs-number\">27<\/span>m v1<span class=\"hljs-number\">.24<\/span><span class=\"hljs-number\">.10<\/span>-eks<span class=\"hljs-number\">-48e63<\/span>af\r\nip<span class=\"hljs-number\">-10<\/span>\u2013<span class=\"hljs-number\">0<\/span>\u2013<span class=\"hljs-number\">149<\/span>\u2013<span class=\"hljs-number\">55.<\/span>ec2.<span class=\"hljs-keyword\">internal<\/span> Ready &lt;none&gt; <span class=\"hljs-number\">26<\/span>m v1<span class=\"hljs-number\">.24<\/span><span class=\"hljs-number\">.10<\/span>-eks<span class=\"hljs-number\">-48e63<\/span>af\r\nip<span class=\"hljs-number\">-10<\/span>\u2013<span class=\"hljs-number\">0<\/span>\u2013<span class=\"hljs-number\">190<\/span>\u2013<span class=\"hljs-number\">100.<\/span>ec2.<span class=\"hljs-keyword\">internal<\/span> Ready &lt;none&gt; <span class=\"hljs-number\">30<\/span>m v1<span class=\"hljs-number\">.24<\/span><span class=\"hljs-number\">.10<\/span>-eks<span class=\"hljs-number\">-48e63<\/span>af\r\nip<span class=\"hljs-number\">-10<\/span>\u2013<span class=\"hljs-number\">0<\/span>\u2013<span class=\"hljs-number\">226<\/span>\u2013<span class=\"hljs-number\">108.<\/span>ec2.<span class=\"hljs-keyword\">internal<\/span> Ready &lt;none&gt; <span class=\"hljs-number\">30<\/span>m v1<span class=\"hljs-number\">.24<\/span><span class=\"hljs-number\">.10<\/span>-eks<span class=\"hljs-number\">-48e63<\/span>af\r\n\r\n<\/pre>\n<h1 id=\"fd35\" class=\"ie if hh bd ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb bi\" data-selectable-paragraph=\"\"><strong class=\"ak\">Setup EFK Stack<\/strong><\/h1>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"my-custom-class\" src=\"https:\/\/keyshell.net\/blog\/wp-content\/uploads\/2023\/03\/efk-stack.png\" alt=\"\" width=\"1982\" height=\"1004\" \/><\/p>\n<h1 id=\"606e\" class=\"ie if hh bd ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb bi\" data-selectable-paragraph=\"\"><strong class=\"ak\">Elasticsearch as a Statefulset<\/strong><\/h1>\n<p id=\"9820\" class=\"pw-post-body-paragraph jc jd hh je b jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ha bi\" data-selectable-paragraph=\"\">Elasticsearch is deployed as a\u00a0<strong class=\"je hi\">Statefulset<\/strong>\u00a0and the multiple replicas connect with each other using a headless service (svc). The headless svc helps in the DNS domain of the pods.<\/p>\n<p id=\"505a\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">The statefulset creates the\u00a0<strong class=\"je hi\">Persistent Volume Claim (PVC)<\/strong>\u00a0with the default available storage class. If you have a custom storage class for PVC, you can add it in the volumeClaimTemplates by uncommenting the\u00a0<strong class=\"je hi\">storageClassName<\/strong>\u00a0parameter.<\/p>\n<p id=\"3470\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Following are the manifests for statefulset and service.<\/p>\n<pre><em>apiVersion: apps\/v1<\/em>\r\n\r\n<em>kind: StatefulSet<\/em>\r\n\r\n<em>metadata:<\/em>\r\n\r\n<em>\u00a0 name: es-cluster<\/em>\r\n\r\n<em>spec:<\/em>\r\n\r\n<em>\u00a0 serviceName: elasticsearch<\/em>\r\n\r\n<em>\u00a0 replicas: 3<\/em>\r\n\r\n<em>\u00a0 selector:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 matchLabels:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 app: elasticsearch<\/em>\r\n\r\n<em>\u00a0 template:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 metadata:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 labels:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 app: elasticsearch<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 spec:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 containers:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 - name: elasticsearch<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 image: docker.elastic.co\/elasticsearch\/elasticsearch:7.5.0<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 resources:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 limits:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cpu: 1000m<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 requests:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cpu: 100m<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ports:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - containerPort: 9200<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 name: rest<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 protocol: TCP<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - containerPort: 9300<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 name: inter-node<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 protocol: TCP<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 volumeMounts:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: data<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 mountPath: \/usr\/share\/elasticsearch\/data<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 env:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: cluster.name<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: k8s-logs<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: node.name<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 valueFrom:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fieldRef:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 fieldPath: metadata.name<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: discovery.seed_hosts<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: \"es-cluster-0.elasticsearch,es-cluster-1.elasticsearch,es-cluster-2.elasticsearch\"<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: cluster.initial_master_nodes<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: \"es-cluster-0,es-cluster-1,es-cluster-2\"<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: ES_JAVA_OPTS<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: \"-Xms512m -Xmx512m\"<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 initContainers:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 - name: fix-permissions<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 image: busybox<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 command: [\"sh\", \"-c\", \"chown -R 1000:1000 \/usr\/share\/elasticsearch\/data\"]<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 securityContext:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 privileged: true<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 volumeMounts:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: data<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 mountPath: \/usr\/share\/elasticsearch\/data<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 - name: increase-vm-max-map<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 image: busybox<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 command: [\"sysctl\", \"-w\", \"vm.max_map_count=262144\"]<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 securityContext:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 privileged: true<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 - name: increase-fd-ulimit<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 image: busybox<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 command: [\"sh\", \"-c\", \"ulimit -n 65536\"]<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 securityContext:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 privileged: true<\/em>\r\n\r\n<em>\u00a0 volumeClaimTemplates:<\/em>\r\n\r\n<em>\u00a0 - metadata:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 name: data<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 labels:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 app: elasticsearch<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 spec:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 accessModes: [ \"ReadWriteOnce\" ]<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 # storageClassName: \"\"<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 resources:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 requests:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 storage: 3Gi<\/em><\/pre>\n<p><strong class=\"je hi\"><em class=\"kg\">kubectl create -f es-sts.yaml<\/em><\/strong><\/p>\n<p>&nbsp;<\/p>\n<pre><em>apiVersion: v1<\/em>\r\n\r\n<em>kind: Service<\/em>\r\n\r\n<em>metadata:<\/em>\r\n\r\n<em>\u00a0 name: elasticsearch<\/em>\r\n\r\n<em>\u00a0 labels:<\/em>\r\n\r\n<em>\u00a0\u00a0 \u00a0app: elasticsearch<\/em>\r\n\r\n<em>spec:<\/em>\r\n\r\n<em>\u00a0 selector:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 app: elasticsearch<\/em>\r\n\r\n<em>\u00a0 clusterIP: None<\/em>\r\n\r\n<em>\u00a0 ports:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 - port: 9200<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 name: rest<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 - port: 9300<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 name: inter-node<\/em><\/pre>\n<p><strong class=\"je hi\"><em class=\"kg\">kubectl create -f es-svc.yaml<\/em><\/strong><\/p>\n<p>&nbsp;<\/p>\n<p>You can check the PVC status using,<\/p>\n<pre>kubectl <span class=\"hljs-keyword\">get<\/span> pvc\r\n\r\nNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE\r\n<span class=\"hljs-keyword\">data<\/span>-es-cluster-<span class=\"hljs-number\">0<\/span> Bound pvc-fefd5503\u2013<span class=\"hljs-number\">72e9<\/span>\u201348ed-8ebb-053c45fe372f 3Gi RWO gp2 24h\r\n<span class=\"hljs-keyword\">data<\/span>-es-cluster-<span class=\"hljs-number\">1<\/span> Bound pvc-a3c272a1\u2013<span class=\"hljs-number\">7135<\/span>\u201340dc-a188\u201387fdf1804550 3Gi RWO gp2 24h\r\n<span class=\"hljs-keyword\">data<\/span>-es-cluster-<span class=\"hljs-number\">2<\/span> Bound pvc-837d2edb-159a-4de1\u20138d14\u20135b8fbdb67237 3Gi RWO gp2 24h\r\n\r\nOnce the Elasticsearch pods come into running status,<\/pre>\n<pre>kubectl <span class=\"hljs-keyword\">get<\/span> pods\r\nNAME READY STATUS RESTARTS AGE\r\nes<span class=\"hljs-operator\">-<\/span>cluster<span class=\"hljs-number\">-0<\/span> <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">20<\/span>h\r\nes<span class=\"hljs-operator\">-<\/span>cluster<span class=\"hljs-number\">-1<\/span> <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">20<\/span>h\r\nes<span class=\"hljs-operator\">-<\/span>cluster<span class=\"hljs-number\">-2<\/span> <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">20<\/span>h\r\n\r\n<\/pre>\n<p id=\"2061\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Port-forward it using,<\/p>\n<p id=\"e47f\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">kubectl port-forward es-cluster-0 9200:9200<\/em><\/strong><\/p>\n<p id=\"d401\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">To check the health of the Elasticsearch cluster, run the following command in the terminal which will give an output as shown.<\/p>\n<p id=\"7b6c\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">curl\u00a0<\/em><\/strong><a class=\"ae kf\" href=\"http:\/\/localhost:9200\/_cluster\/health\/?pretty\" target=\"_blank\" rel=\"noopener ugc nofollow\"><strong class=\"je hi\"><em class=\"kg\">http:\/\/localhost:9200\/_cluster\/health\/?pretty<\/em><\/strong><\/a><\/p>\n<pre><span class=\"hljs-punctuation\">{<\/span>\r\n<span class=\"hljs-attr\">\"cluster_name\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"k8s-logs\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"status\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-string\">\"green\"<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"timed_out\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-literal\"><span class=\"hljs-keyword\">false<\/span><\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"number_of_nodes\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">3<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"number_of_data_nodes\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">3<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"active_primary_shards\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">0<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"active_shards\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">0<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"relocating_shards\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">0<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"initializing_shards\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">0<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"unassigned_shards\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">0<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"delayed_unassigned_shards\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">0<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"number_of_pending_tasks\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">0<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"number_of_in_flight_fetch\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">0<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"task_max_waiting_in_queue_millis\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">0<\/span><span class=\"hljs-punctuation\">,<\/span>\r\n<span class=\"hljs-attr\">\"active_shards_percent_as_number\"<\/span> <span class=\"hljs-punctuation\">:<\/span> <span class=\"hljs-number\">100.0<\/span>\r\n<span class=\"hljs-punctuation\">}<\/span><\/pre>\n<h1 id=\"8987\" class=\"ie if hh bd ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb bi\" data-selectable-paragraph=\"\"><strong class=\"ak\">Kibana Deployment &amp; Service<\/strong><\/h1>\n<p id=\"f375\" class=\"pw-post-body-paragraph jc jd hh je b jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ha bi\" data-selectable-paragraph=\"\">Create the Kibana deployment manifest as kibana-deployment.yaml.<\/p>\n<pre><em>apiVersion: apps\/v1<\/em>\r\n\r\n<em>kind: Deployment<\/em>\r\n\r\n<em>metadata:<\/em>\r\n\r\n<em>\u00a0 name: kibana<\/em>\r\n\r\n<em>\u00a0 labels:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 app: kibana<\/em>\r\n\r\n<em>spec:<\/em>\r\n\r\n<em>\u00a0 replicas: 1<\/em>\r\n\r\n<em>\u00a0 selector:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 matchLabels:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 app: kibana<\/em>\r\n\r\n<em>\u00a0 template:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 metadata:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 labels:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 app: kibana<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 spec:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 containers:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 - name: kibana<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 image: docker.elastic.co\/kibana\/kibana:7.5.0<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 resources:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 limits:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cpu: 1000m<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 requests:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cpu: 100m<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 env:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: ELASTICSEARCH_URL<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: http:\/\/elasticsearch:9200<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ports:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - containerPort: 5601<\/em><\/pre>\n<p id=\"34fd\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Create the manifest using,<\/p>\n<p id=\"fb9c\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">kubectl create -f kibana-deployment.yaml<\/em><\/strong><\/p>\n<p id=\"4e9f\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Here, we are using a service type \u2018LoadBalancer\u2019 to access the Kibana UI.<\/p>\n<pre><em>apiVersion: v1<\/em>\r\n\r\n<em>kind: Service<\/em>\r\n\r\n<em>metadata:<\/em>\r\n\r\n<em>\u00a0 name: kibana-np<\/em>\r\n\r\n<em>spec:<\/em>\r\n\r\n<em>\u00a0 selector:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 app: kibana<\/em>\r\n\r\n<em>\u00a0 type: LoadBalancer<\/em>\r\n\r\n<em>\u00a0 ports:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 - port: 8080<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 targetPort: 5601<\/em><\/pre>\n<p id=\"e291\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Create the kibana-svc now.<\/p>\n<p id=\"39ae\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">kubectl create -f kibana-svc.yaml<\/em><\/strong><\/p>\n<p id=\"970d\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Check if the kibana deployment and pod are running using,<\/p>\n<pre>kubectl <span class=\"hljs-keyword\">get<\/span> deployment\r\nNAME READY UP-<span class=\"hljs-keyword\">TO<\/span>-<span class=\"hljs-type\">DATE<\/span> AVAILABLE AGE\r\nkibana <span class=\"hljs-number\">1<\/span>\/<span class=\"hljs-number\">1<\/span> <span class=\"hljs-number\">1<\/span> <span class=\"hljs-number\">1<\/span> <span class=\"hljs-number\">24<\/span>h\r\n\r\n\r\nkubectl <span class=\"hljs-keyword\">get<\/span> pods\r\nNAME READY STATUS RESTARTS AGE\r\nes<span class=\"hljs-operator\">-<\/span>cluster<span class=\"hljs-number\">-0<\/span> <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">24<\/span>h\r\nes<span class=\"hljs-operator\">-<\/span>cluster<span class=\"hljs-number\">-1<\/span> <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">24<\/span>h\r\nes<span class=\"hljs-operator\">-<\/span>cluster<span class=\"hljs-number\">-2<\/span> <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">24<\/span>h\r\nkibana<span class=\"hljs-number\">-6<\/span>db5f8d7c8<span class=\"hljs-operator\">-<\/span>zxjtf <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">3<\/span>h30m\r\n\r\n<\/pre>\n<p>Create the kibana-svc now.<\/p>\n<p><strong><em>kubectl create -f kibana-svc.yaml<\/em><\/strong><\/p>\n<p>Check if the kibana deployment and pod are running using,<\/p>\n<p id=\"2b6f\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Check using the load balancer endpoint,<\/p>\n<p id=\"e230\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">curl\u00a0<\/em><\/strong><a class=\"ae kf\" href=\"http:\/\/a3f05882d30a740e5a08ce942d84321b-694215210.us-east-1.elb.amazonaws.com:8080\/app\/kibana\" target=\"_blank\" rel=\"noopener ugc nofollow\"><strong class=\"je hi\"><em class=\"kg\">http:\/\/a3f05882d30a740e5a08ce942d84321b-694215210.us-east-1.elb.amazonaws.com:8080\/app\/kibana<\/em><\/strong><\/a><\/p>\n<h1 id=\"ee16\" class=\"ie if hh bd ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb bi\" data-selectable-paragraph=\"\"><strong class=\"ak\">Fluentd Daemon set<\/strong><\/h1>\n<p id=\"6745\" class=\"pw-post-body-paragraph jc jd hh je b jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ha bi\" data-selectable-paragraph=\"\">For Fluentd, we require a\u00a0<strong class=\"je hi\">ClusterRole<\/strong>, to give permissions for pods and namespaces.<\/p>\n<p id=\"db14\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Create a manifest fluentd-role.yaml<\/p>\n<pre><em>apiVersion: rbac.authorization.k8s.io\/v1<\/em>\r\n\r\n<em>kind: ClusterRole<\/em>\r\n\r\n<em>metadata:<\/em>\r\n\r\n<em>\u00a0 name: fluentd<\/em>\r\n\r\n<em>\u00a0 labels:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 app: fluentd<\/em>\r\n\r\n<em>rules:<\/em>\r\n\r\n<em>- apiGroups:<\/em>\r\n\r\n<em>\u00a0\u00a0- \"\"<\/em>\r\n\r\n<em>\u00a0 resources:<\/em>\r\n\r\n<em>\u00a0 - pods<\/em>\r\n\r\n<em>\u00a0 - namespaces<\/em>\r\n\r\n<em>\u00a0 verbs:<\/em>\r\n\r\n<em>\u00a0 - get<\/em>\r\n\r\n<em>\u00a0 - list<\/em>\r\n\r\n<em>\u00a0 - watch<\/em><\/pre>\n<p>Apply the manifest<\/p>\n<p><strong><em>kubectl create -f fluentd-role.yaml<\/em><\/strong><\/p>\n<p>Next, is the service account fluentd-sa.yaml.<\/p>\n<pre><em>apiVersion: v1<\/em>\r\n\r\n<em>kind: ServiceAccount<\/em>\r\n\r\n<em>metadata:<\/em>\r\n\r\n<em>\u00a0 name: fluentd<\/em>\r\n\r\n<em>\u00a0 labels:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 app: fluentd<\/em>\r\n\r\n<\/pre>\n<p id=\"127d\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Apply the manifest<\/p>\n<p id=\"2ecf\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">kubectl create -f fluentd-sa.yaml<\/em><\/strong><\/p>\n<p id=\"d1c1\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Now, we have to bind the role with service account. Create a manifest fluentd-rb.yaml.<\/p>\n<pre><em>kind: ClusterRoleBinding<\/em>\r\n\r\n<em>apiVersion: rbac.authorization.k8s.io\/v1<\/em>\r\n\r\n<em>metadata:<\/em>\r\n\r\n<em>\u00a0 name: fluentd<\/em>\r\n\r\n<em>roleRef:<\/em>\r\n\r\n<em>\u00a0 kind: ClusterRole<\/em>\r\n\r\n<em>\u00a0 name: fluentd<\/em>\r\n\r\n<em>\u00a0 apiGroup: rbac.authorization.k8s.io<\/em>\r\n\r\n<em>subjects:<\/em>\r\n\r\n<em>- kind: ServiceAccount<\/em>\r\n\r\n<em>\u00a0 name: fluentd<\/em>\r\n\r\n<em>\u00a0 namespace: default<\/em><\/pre>\n<p>&nbsp;<\/p>\n<p id=\"e7f4\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Apply the manifest<\/p>\n<p id=\"7118\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">kubectl create -f fluentd-rb.yaml<\/em><\/strong><\/p>\n<p id=\"b83b\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">We are deploying fluentd as a daemon set so that it runs in all the nodes and collect the container logs. Create fluentd-ds.yaml.<\/p>\n<pre><em>apiVersion: apps\/v1<\/em>\r\n\r\n<em>kind: DaemonSet<\/em>\r\n\r\n<em>metadata:<\/em>\r\n\r\n<em>\u00a0 name: fluentd<\/em>\r\n\r\n<em>\u00a0 labels:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 app: fluentd<\/em>\r\n\r\n<em>spec:<\/em>\r\n\r\n<em>\u00a0 selector:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 matchLabels:<\/em>\r\n\r\n<em>\u00a0 \u00a0\u00a0\u00a0\u00a0app: fluentd<\/em>\r\n\r\n<em>\u00a0 template:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 metadata:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 labels:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 app: fluentd<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 spec:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 serviceAccount: fluentd<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 serviceAccountName: fluentd<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 containers:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 - name: fluentd<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 image: fluent\/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 env:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name:\u00a0 FLUENT_ELASTICSEARCH_HOST<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: \"elasticsearch.default.svc.cluster.local\"<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name:\u00a0 FLUENT_ELASTICSEARCH_PORT<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: \"9200\"<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: FLUENT_ELASTICSEARCH_SCHEME<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: \"http\"<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: FLUENTD_SYSTEMD_CONF<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 value: disable<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 resources:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 limits:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 memory: 512Mi<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 requests:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 cpu: 100m<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 memory: 200Mi<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 volumeMounts:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: varlog<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 mountPath: \/var\/log<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 - name: varlibdockercontainers<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 mountPath: \/var\/lib\/docker\/containers<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 readOnly: true<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 terminationGracePeriodSeconds: 30<\/em>\r\n\r\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0volumes:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 - name: varlog<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 hostPath:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 path: \/var\/log<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0 - name: varlibdockercontainers<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 hostPath:<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 path: \/var\/lib\/docker\/containers<\/em><\/pre>\n<p id=\"1b14\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Apply the fluentd manifest<\/p>\n<p id=\"97cd\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">kubectl create -f fluentd-ds.yaml<\/em><\/strong><\/p>\n<pre>kubectl <span class=\"hljs-keyword\">get<\/span> pods\r\nNAME READY STATUS RESTARTS AGE\r\nes<span class=\"hljs-operator\">-<\/span>cluster<span class=\"hljs-number\">-0<\/span> <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">24<\/span>h\r\nes<span class=\"hljs-operator\">-<\/span>cluster<span class=\"hljs-number\">-1<\/span> <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">24<\/span>h\r\nes<span class=\"hljs-operator\">-<\/span>cluster<span class=\"hljs-number\">-2<\/span> <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">24<\/span>h\r\nfluentd<span class=\"hljs-operator\">-<\/span>d49sw <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">3<\/span>h30m\r\nfluentd<span class=\"hljs-operator\">-<\/span>pkh2l <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">3<\/span>h30m\r\nfluentd<span class=\"hljs-operator\">-<\/span>qd6f6 <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">3<\/span>h31m\r\nfluentd<span class=\"hljs-operator\">-<\/span>rvdvx <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">3<\/span>h30m\r\nkibana<span class=\"hljs-number\">-6<\/span>db5f8d7c8<span class=\"hljs-operator\">-<\/span>zxjtf <span class=\"hljs-number\">1<\/span><span class=\"hljs-operator\">\/<\/span><span class=\"hljs-number\">1<\/span> <span class=\"hljs-keyword\">Running<\/span> <span class=\"hljs-number\">0<\/span> <span class=\"hljs-number\">3<\/span>h30m\r\n\r\n<\/pre>\n<p id=\"5b5e\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Now, the EFK setup is completed.<\/p>\n<h1 id=\"4f82\" class=\"ie if hh bd ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb bi\" data-selectable-paragraph=\"\"><strong class=\"ak\">Test Pod<\/strong><\/h1>\n<p id=\"49ee\" class=\"pw-post-body-paragraph jc jd hh je b jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ha bi\" data-selectable-paragraph=\"\">Save the following as test-pod.yaml<\/p>\n<pre><em>apiVersion: v1<\/em>\r\n\r\n<em>kind: Pod<\/em>\r\n\r\n<em>metadata:<\/em>\r\n\r\n<em>\u00a0 name: counter<\/em>\r\n\r\n<em>spec:<\/em>\r\n\r\n<em>\u00a0 containers:<\/em>\r\n\r\n<em>\u00a0 - name: count<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 image: busybox<\/em>\r\n\r\n<em>\u00a0\u00a0\u00a0 args: [\/bin\/sh, -c,'i=0; while true; do echo \"Thanks for visiting devopscube! $i\"; i=$((i+1)); sleep 1; done']<\/em>\r\n\r\n<\/pre>\n<p id=\"4244\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Apply the manifest<\/p>\n<p id=\"be59\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\"><strong class=\"je hi\"><em class=\"kg\">kubectl create -f test-pod.yaml<\/em><\/strong><\/p>\n<h1 id=\"5208\" class=\"ie if hh bd ig ih ii ij ik il im in io ip iq ir is it iu iv iw ix iy iz ja jb bi\" data-selectable-paragraph=\"\"><strong class=\"ak\">Kibana Dashboard<\/strong><\/h1>\n<p id=\"c70b\" class=\"pw-post-body-paragraph jc jd hh je b jf jg jh ji jj jk jl jm jn jo jp jq jr js jt ju jv jw jx jy jz ha bi\" data-selectable-paragraph=\"\">Access the Kibana dashboard using the load balancer endpoint along with post 8080.<\/p>\n<p data-selectable-paragraph=\"\"><img loading=\"lazy\" decoding=\"async\" class=\"my-custom-class\" src=\"https:\/\/keyshell.net\/blog\/wp-content\/uploads\/2023\/03\/Kibana_Dashboard.jpg\" alt=\"\" width=\"1365\" height=\"734\" \/><\/p>\n<p id=\"2d24\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Click on the\u00a0<strong class=\"je hi\">management<\/strong>\u00a0icon at the bottom left corner of the page. There, under Kibana, select the option \u2018<strong class=\"je hi\">Index Patterns<\/strong>\u2019.<\/p>\n<p id=\"4027\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Create a new Index Patten using the pattern \u2014 \u201clogstash-*\u201d, click next and select \u201c@timestamp\u201d in the timestamps option. Create index pattern.<\/p>\n<p id=\"4ca5\" class=\"pw-post-body-paragraph jc jd hh je b jf ka jh ji jj kb jl jm jn kc jp jq jr kd jt ju jv ke jx jy jz ha bi\" data-selectable-paragraph=\"\">Move to the console option at the top left of the page where you can see the logs from our test pod.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>About EFK When it comes to Kubernetes in production environment, logging has its important role to play. It help to understand where the problem is and what went wrong. EFK is used for log streaming, log analysis, and log monitoring. It is a combination of 3 components. 1. Elasticsearch \u2014 logging backend for storing, searching [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"pagelayer_contact_templates":[],"_pagelayer_content":"","footnotes":""},"categories":[1],"tags":[15,14,16,17],"class_list":["post-266","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-efk","tag-eks","tag-k8s","tag-kibana"],"_links":{"self":[{"href":"https:\/\/keyshell.net\/blog\/wp-json\/wp\/v2\/posts\/266","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/keyshell.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/keyshell.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/keyshell.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/keyshell.net\/blog\/wp-json\/wp\/v2\/comments?post=266"}],"version-history":[{"count":9,"href":"https:\/\/keyshell.net\/blog\/wp-json\/wp\/v2\/posts\/266\/revisions"}],"predecessor-version":[{"id":280,"href":"https:\/\/keyshell.net\/blog\/wp-json\/wp\/v2\/posts\/266\/revisions\/280"}],"wp:attachment":[{"href":"https:\/\/keyshell.net\/blog\/wp-json\/wp\/v2\/media?parent=266"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/keyshell.net\/blog\/wp-json\/wp\/v2\/categories?post=266"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/keyshell.net\/blog\/wp-json\/wp\/v2\/tags?post=266"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}