Transcendence - 1


---------------------------------------------------------------------------------------Let me share some pearls of wisdom from a book. 
Transcendence
My Spiritual Experiences with Pramukh Swamiji
by A.P.J. Abdul Kalam
with Arun Tiwari. 

This is not a book review.
This article is just like
'key take away points' for me. 

The book is divided in 4 parts. This article covers 1st part of the book. 

---------------------------------------------------------------------------------------

Part 1 Experiencing the presence 

Tolerance of others' view and opinions is essential in building teams and accomplishing tasks that are beyond the individuals' capacities. 
- Dr. Brahma Prakash

1.

Srimad Bhagavad Gita defines renunciation in a unique way: "One must renounce not the performance of deeds, but renounce the desire for the fruits of those actions." 
- Pramukh Swamiji

2. 

When things go smoothly and fall into place, you have most likely made the right choices so that the right event could come into your life. When your decisions of efforts encounter resistance or roadblocks, seriously re-examine the choices you have made. 

"Who I really am".... can only be revealed when the mind is quiet and no longer telling me who I am. When all the preconceptions about myself are stilled, what remains is who I really am: consciousness, awareness, stillness, presence, peace, love, and the Divine. You are that which is nameless and yet has been given a thousand names.

3. 

Harmony makes small things grow, lack of it makes great things decay. 
- Sallust
1st century BC Roman senator

When you go to a place of worships, you pray for peace and prosperity, not only for yourself but also for everyone around you. 

Sulah meaning peace and peacemaking in Arabic. 
Sulah is also the root of the word Islah denoting development and improvement. 

4.

It is easier to build strong children than to repair broken men
- Frederick Douglass
19th Centaury African-American social reformer

The empires of the future are the empires of the mind. Dream, dream, dream. Dreaming leads to thoughts. Thoughts lead to action. 

"How can you mix spirituality and social service?"
Pramukh Swamiji asks, "How can you separate the two?"

5. 

Success can only come to you by courageous devotion to the task in front of you... You will be remembered for creating the one page in the history of the nation - whether it is the page of invention, innovation, discovery or fighting injustice. 
A.P.J. Abdul Kalam (in book 'Indomitable Spirit') 

6. 

The wise discipline themselves, the unwise discipline others
- Pramukh Swamiji

As long as there is the pull of gravity whatever you throw up is always going to come down. But once a rocket is out of the attraction of the Earth's gravity, it will not fall back and will escape into space. Likewise, as long as we are attracted and attached to 
- the comforts of this body
- desires of the mind and
- the material world,
we are consigned to the cycle of births and deaths. There will be no escape. But as your wordly desires decreases, you transcend the pull of the world and eventually you connect to God. 
- Pramukh Swamiji

Transcendence - 2


---------------------------------------------------------------------------------------Let me share some pearls of wisdom from a book. 
Transcendence
My Spiritual Experiences with Pramukh Swamiji
by A.P.J. Abdul Kalam
with Arun Tiwari. 

This is not a book review.
This article is just like
'key take away points' for me. 

The book is divided in 4 parts. This article covers 2nd part of the book. 

---------------------------------------------------------------------------------------

Part 2 Spirituality in Action

9.

Appearance is a glimpse of the unseen
- Anaxagora
Pre-Socratic Greek Philosopher

A temple is the physical  manifestation of the unseen
- Pramukh Swami Maharaj

Do not confuse excellence with perfection. Excellence man can reach, but perfection is God's work. 
- Pramukh Swami Maharaj

10.

Courage is not absence of fear, but the triumph over it. The brave man is not be who does not feel afraid, but he who conquers the fear. 
-Nelson Mandela

To overcome fear by forgiving through faith. 
- Pramukh Swami Maharaj

11.

If you surround yourself with good and righteous, they can only raise you up. 
If you surround yourself with ordinary, they will drag you down into the pessimism of mediocrity, and they will keep you there, but only as long as you permit it. 
- father of A.P.J. Abdul Kalam

Youth needs a wisdom. 
Youth needs a vision.
Youth needs credible guidance
and above youth needs an example. 
Great minds give all three. 

The vision of a prosperous and peaceful humanity. 
guidance through the idea of great institutions like BAPS
and the example of impeccable service 
are beacons of that guide souls from drifting and foundering 
however deep and dark the turbulent sea. 

Where there is faith, there is love
Where there is love, there is peace
Where there is peace, there is God
And where there is God, there is no need. 
- Leo Tolstoy 
in book "The Kingdom of God Is Within You"

12.

If you are irritated by every run, how will your mirror be polished? 
- Rumi
13th Century Persian poet

Where there is righteousness in the heart, 
There is beauty in the character. 
When there is beauty in the character, 
There is harmony in the home.
When there is harmony in the home, 
There is order in the nation.
When there is order in the nation, 
There is peace in the world. 

13.

We cannot teach people anything; we can only help them discover it within themselves. 
-Galileo Galilei
16th century Italian philosopher. 

Human brain
* 2% of body weight
* receives 15% of cardiac power
* 20 % of total body consumption
* 25 % of total body glucose utilization

I recommend, all people - with scientific temperament - must read chapter 14. 

15. 

If you talk to a man in a language he has learned in school, it goes to his head. If you talk to him in a lanugage he has heard from his mother, it goes to his heart
-Nelson Mandela

If I have a beautiful mind, I will have beautiful thoughts
If I have a beautiful thoughts, I will have beautiful life
If I have a beautiful life, I will become a great soul like Pramukh Swamiji

Confidence leads to creativity
Creativity leads to knowledge
Knowledge leads to thinking
Thinking makes on great. 

Every time we smile angel wins and every time we sulk Satan wins

Jaeger + Elastic Search: Handson


Steps

docker run --rm -it --name=elasticsearch -e "ES_JAVA_OPTS=-Xms2g -Xmx2g" -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e "xpack.security.enabled=false" docker.elastic.co/elasticsearch/elasticsearch:6.8.0

docker run --rm -it --link=elasticsearch --name=kibana -p 5601:5601 docker.elastic.co/kibana/kibana:6.8.0

docker run --rm -it --link=elasticsearch --name=jaeger -e SPAN_STORAGE_TYPE=elasticsearch -e ES_SERVER_URLS=http://elasticsearch:9200 -e ES_TAGS_AS_FIELDS_ALL=true -p 16686:16686 jaegertracing/all-in-one:1.12


docker run --rm --link jaeger --env JAEGER_AGENT_HOST=jaeger --env JAEGER_AGENT_PORT=6831 -p8080-8083:8080-8083 jaegertracing/example-hotrod:latest all 

Create a file JSON.txt with below conntent

{
    "query" : {
        "match_all" : {}
    }

}

curl -XGET "localhost:9200/jaeger-span-YYYY-MM-DD/_search" -H "Content-Type: application/json" -d @json.txt

curl -XGET "localhost:9200/jaeger-span-YYYY-MM-DD/_search?size=10000" -H "Content-Type: application/json" -d @json.txt

Reference:

https://medium.com/jaegertracing/jaeger-elasticsearch-and-kibana-7ecb846137b6


JSON Output: 

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 441,
    "max_score": 1,
    "hits": [
      {
        "_index": "jaeger-span-2019-11-12",
        "_type": "span",
        "_id": "mQ2cXm4BVYoOLxBFNHpP",
        "_score": 1,
        "_source": {
          "traceID": "553c8316169ab970",
          "spanID": "2cd1c33438cb79f5",
          "flags": 1,
          "operationName": "HTTP GET /route",
          "references": [
            {
              "refType": "CHILD_OF",
              "traceID": "553c8316169ab970",
              "spanID": "44fa89467cc873aa"
            }
          ],
          "startTime": 1573545324720315,
          "startTimeMillis": 1573545324720,
          "duration": 53302,
          "tags": [],
          "tag": {
            "component": "net/http",
            "http@method": "GET",
            "http@status_code": 200,
            "http@url": "/route?dropoff=728%2C326&pickup=106%2C311",
            "internal@span@format": "proto",
            "span@kind": "server"
          },
          "logs": [
            {
              "timestamp": 1573545324720369,
              "fields": [
                {
                  "key": "event",
                  "type": "string",
                  "value": "HTTP request received"
                },
                {
                  "key": "level",
                  "type": "string",
                  "value": "info"
                },
                {
                  "key": "method",
                  "type": "string",
                  "value": "GET"
                },
                {
                  "key": "url",
                  "type": "string",
                  "value": "/route?dropoff=728%2C326&pickup=106%2C311"
                }
              ]
            }
          ],
          "process": {
            "serviceName": "route",
            "tags": [],
            "tag": {
              "client-uuid": "761a24cbd892ada8",
              "hostname": "367b2536b5f9",
              "ip": "172.17.0.5",
              "jaeger@version": "Go-2.20.0"
            }
          }
        }
      },
.....
    ]
  }
}

Trace JSON at Kibana APM

{
    "events": [
        {
            "@timestamp": "2018-07-30T18:53:42.281Z",
            "agent": {
                "name": "elastic-node",
                "version": "3.14.0"
            },
            "parent": {
                "id": "abcdef0123456789"
            },
            "processor": {
                "event": "span",
                "name": "transaction"
            },
            "service": {
                "environment": "staging",
                "name": "backendspans"
            },
            "span": {
                "action": "query.custom",
                "duration": {
                    "us": 141581
                },
                "id": "abcdef01234567",
                "name": "GET /api/types",
                "subtype": "postgresql",
                "type": "db"
            },
            "timestamp": {
                "us": 1532976822281000
            },
            "trace": {
                "id": "fdedef0123456789abcdef9876543210"
            },
            "transaction": {
                "id": "01af25874dec69dd"
            }

        },
.....
    ]

}


Reference
https://www.elastic.co/guide/en/apm/server/current/span-indices.html

Distributed Tracing FAQ



** Is tracing only for request-response pair? How tracing happens for indication where response is not expected.

Zipkin
This is: One-way RPC Tracing. One-way is the same as normal RPC tracing, except there is no response anticipated.
In normal RPC tracing 4 annotations are used: “cs” “sr” (request) then “ss” “cr” (response). In one-way tracing, the first two are used “cs” “sr” as there is no response returned to the caller.
So, the client adds “cs” to a span and reports it to zipkin. Then, the server adds “sr” to the same span and reports it. Neither side add Span.timestamp or duration because neither side know both when the span started and finished.
CS = Client Send
SR = Server Receive
SS = Server Sent
CR = Client Receive
They are annotations for spans in Zipkin format



Jaeger

For asynchronous messaging communications: “span.kind” tag values are: Producer and Consumer
For synchronous RPC communications: “span.kind” tag values are: Client and Server
The span.kind=server tag denotes an entry span, e.g. a span created in the local code in response to an external request. Likewise, span.kind=client denotes an exit span, e.g. a call made from the local code to another server.









** At ‘Istio service mesh’, does ‘Envoy sidecar proxy’ add ‘B3 headers’ for incoming message or outgoing message,
For incoming message.

** What if some of the microservices use Zipkin format and new microservices use Jaeger format at K8s cluster?
Jaeger provides backward compatibility. So, just need to route ‘Zipkin format data’ from ‘legacy services’ to ‘Jaeger backend’ using ‘zipkin collector’

Backwards compatibility with Zipkin
Although we recommend instrumenting applications with OpenTracing API and binding to Jaeger client libraries to benefit from advanced features not available elsewhere, if your organization has already invested in the instrumentation using Zipkin libraries, you do not have to rewrite all that code. Jaeger provides backwards compatibility with Zipkin by accepting spans in Zipkin formats (Thrift or JSON v1/v2) over HTTP. Switching from Zipkin backend is just a matter of routing the traffic from Zipkin libraries to the Jaeger backend.

** The ‘Envoy sidecar proxy’ at ‘Istio Service Mesh’ sends collected span data (JSON format) to Jaeger Collector. It it for incoming message or outgoing message?
The ‘Envoy sidecar proxy’ sends a single span (JSON format), asynchronously, anytime, after receiving response for the request which was originated by application.

** Can we bypass Jaeger Agent?
Yes for C++ Jaeger ClientLib.

** Can Jaeger Collector work on UDP?
No.

** How to use Baggage in Jaeger headers?
Key: uberctx-{baggage-key}
Value: url-encoded string

** How to use Baggage in Zipkin B3 header?
baggage-:
The support is only for Java and Go languages

** What is thrift
https://en.wikipedia.org/wiki/Apache_Thrift. It is for RPC with format like: JSON, Binary etc.

** what is TChannel?
It is a protocol over TCP for RPC

** Does Zipkin supports binary/compress format?
Zipkin can work on TChannel. It also supports compact Thrift format. However, Jaeger is better as being CNCF project.

** TChannel, Thrift, or its combination, which one is better?
Now, Jaeger collector supports gRPC as well. gRPC can be even better choice.

** Wild card query is supported at Jaeger UI?
No, due to limitations of other storage implementations. However, one can use Kibana + Elastic Search for the same.

Programming Kubernetes - I


Meetup Event : https://www.meetup.com/kubernetes-openshift-India-Meetup/events/264123372/

on 24th August 2019


* Only API server interact with etcd

* Extend K8s

1. Extend life cycle of API server by adding new controller
2. add more APIs : by adding new API resource types and by adding CRDs
3. cluster daemons for automation. E.g. collecting metrics
4. cluster assist to extend functionality. E.g. SSL certificate manager. 


* Action or commands on K8s resources

1 create
2 read
- get
- list
- watch
3 update
- patch
- replace
4 delete

Here are all such actions/command on Deployment resource
https://github.com/kubernetes/client-go/blob/master/kubernetes/typed/apps/v1/deployment.go

* API


apis///namespace//resource

Short form : GVR = group, version, resource 

Possible versions: 
Alpha (v1alpha1)
Beta (v1beata1)
Stable (v1)

* Few useful commands


kubectl api version
kubectl api-resource

we can get short names
kubectl get --raw 

* KIND used at YAML file is corrosponding to golang type. For any built-in K8s object:
1. https://github.com/kubernetes/api/blob/master///types.go has multiple struct in Go langugae corrpospond to each K8s object at YAML file.
2. https://github.com/kubernetes/client-go/tree/master/kubernetes/typed// folder has multiple files. Each file is corrsoponding to one K8s object. 
* K8s support for client library implemented in many languages: 
Official support for : Go, Python, Java, DotNet, JavaScript, Haskell
Many more language supported by community implementaiton
Please refer: https://kubernetes.io/docs/reference/using-api/client-libraries/ The source code is available at https://github.com/kubernetes-client
Out of all of them: client-go has cache and many more features. Kubectl and prometheus-operator also internally use client-go library. Important packages / utilities of client-go library are described at blog https://itnext.io/how-to-create-a-kubernetes-custom-controller-using-client-go-f36a7a7536cc E.g. Kubernetes, Discovery, Dynamic, Transport, Plugin, Scale, Util, tool/cache etc. tools/clientcmd package is useful to setup client from kubeconfig file. 

* Flatcar Linux: 

- an immutable Linux distribution for containers. 
- a friendly fork of CoreOS’s Container Linux and as such, compatible with it. 
- a self-updating operating system 
- It is designed for containers, making it ideal for running Kubernetes and other container platforms. 
- It aims to be an independently built, distributed, and supported Linux distribution designed for container workloads.
Reference : https://www.flatcar-linux.org/

* apimachienry
- Scheme, typing, encoding, decoding, and conversion packages for Kubernetes and Kubernetes-like API objects.
- This library is a shared dependency for servers and clients to work with Kubernetes API infrastructure without direct type dependencies. 
- Its first consumers are k8s.io/kubernetes, k8s.io/client-go, and k8s.io/apiserver.

* "~/.kube/config" path has all the security related file to interface with K8s master node (or minikybe) kubeconfig has context

* controller uses service account. secreat is mounted inside pod


* jq is a lightweight and flexible command-line JSON processor. It is like sed for JSON. Reference : https://stedolan.github.io/jq/

* YAML file consists 

1. api version
2. kind
3. matadata
4. spec
5. status
everything under metadata is in type of go language

Read Annotations
https://github.com/kubernetes/api/tree/master/core/v1
https://github.com/kubernetes/apimachinery/tree/master/pkg

Unit testing of controller with fake client

https://github.com/kubernetes-sigs/controller-runtime/blob/master/pkg/client/fake/client_test.go

* Join K8s slack channel "k8sBLR"


Reference 

Go Client to communicate with K8s cluster: https://github.com/kubernetes/client-go


Schema of the external API types that are served by the Kubernetes API server: https://github.com/kubernetes/api 

All relevant blogs: https://kubernauts.dev/ 

PPT slide deck: https://docs.google.com/presentation/d/1NgAxNrUxcOnodm9VA4plidrKradQM_kAbrTrF844gec/edit#slide=id.g5dcf860567_4_3

Github accounts

https://github.com/surajssd
https://github.com/surajssd/lspods
Relevant blogs

https://kubernetes.io/blog/2018/01/introducing-client-go-version-6/
https://itnext.io/how-to-create-a-kubernetes-custom-controller-using-client-go-f36a7a7536cc
https://medium.com/speechmatics/how-to-write-kubernetes-custom-controllers-in-go-8014c4a04235
https://jvns.ca/blog/2017/06/04/learning-about-kubernetes/


Book
https://go.heptio.com/rs/383-ENX-437/images/Managing_Kubernetes.pdf
https://www.oreilly.com/library/view/programming-kubernetes/9781492047094/


https://stackoverflow.com/questions/49953980/watch-customresourcedefinitions-crd-with-client-go