kubectl允许我们以命令行的方式来和kuberneted做交互,这个命令行可以给它一些参数和输入文件,这些文件是一个个准备好的kubernetes对象,这些文件它读取之后,本质上相当于是一个转换器,他会将对象转换为rest调用。(kubernetes apiserver是一个server),kubelctl就是接受这些指令,并且将指令转化为rest调用传给apiserver。
-v 9 代表这条命令的log级别为9。可以看到去默认加载了kubecobnfig
- [root@master ~]# kubectl get pod -v 9
- I0623 17:09:34.998578 73360 loader.go:375] Config loaded from file: /root/.kube/config
- I0623 17:09:35.013322 73360 round_trippers.go:423] curl -k -v -XGET -H "Accept: application/json, */*" -H "User-Agent: kubectl/v1.19.0 (linux/amd64) kubernetes/e199641" 'https://192.168.111.6:6443/api?timeout=32s'
- I0623 17:09:35.041788 73360 round_trippers.go:443] GET https://192.168.111.6:6443/api?timeout=32s 200 OK in 28 milliseconds
- I0623 17:09:35.041813 73360 round_trippers.go:449] Response Headers:
这个kubeconfig本身就是一个配置文件,你可以配置很多的cluster,每个cluster有自己的名字,最重要的有server。
- - cluster:
- certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM1ekNDQWMrZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1EUXhPREE1TURBeE9Gb1hEVE15TURReE5UQTVNREF4T0Zvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBS2dQClBZWXh3cWgrbklpTWJUeElkM1Y3NjBQS3VOQ3FzNDRHWGdUSEtWMWJBM3NpNzIrQXVlSFIyQ0piNWVvY2g0OHkKSFZkUkJRRmJNZnZPWTV3SC8yZFZnSFI0KzR6OWsxQk1STUh2dXZZUWxtWGFUNFl2SlIxNFRiOU5ESGdqdFcvZwpiYVJmcEV4UDl1WDR4NDU3MmJRTWhySWhOeldnUDdYdU1JbGtrQzhWNDFsVVNPSnU1Z2NiaE1xaERMSElpL1lJCmo1N1RmaDdUNkNxWjBmS3NQd2ZHeXM4MWFadWxoQ2RsVmE1Q3VTcFh1UHFDVjlxa2FZQm0xOGdQclFjcHFFNXkKd0lzUDlGUHhyWis5UzV1VWFCZEQ4L0VzZFlveTExbmdROG1kZm1CS2hPbkh4ekg5c1VOSVo3QldML0VETFEvbwo3U2QxV0xoUi9QZ3I3UzBOUEVNQ0F3RUFBYU5DTUVBd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZPL3FyYTJYbk00QmVqR3IraTFXN21nRjBON2ZNQTBHQ1NxR1NJYjMKRFFFQkN3VUFBNElCQVFBdktnOENGcSsxV25IVUszWVkyRHRuUm5CS0xJYnM3eVkrb0diN0czd1A0djBiYTl4WQp3ZEczZmp1czJwUFgwckhxNG5HZFVxejl0Tk85S05Xd3huNmpvK1lRZHJJMEMwTXZNdGdsaHpoc3BCWkdMaE5sCjdWekpDcVpxZUV4c3JJbGlSRHQ5M3M4dzExd1d2RDU2ZmpoeFI0enNMNWdQd29LZERMVmNWOGJheGdzd3Q5MlQKVXFEc2Z5UWtrK2c2RzlPTi9ZZmI1OUxoTi9NcW5xaUg3UElSNDNDb21UYjAya0tzWXVvanZsNXJBVVprSjFQSwo3WTRLMWtKMVVDNmhIanZaUWtxT3RJSlM3dTEwZ1Q1NlRLMU42VHlCU2RVTkNRMm5NbE92YUx1RXYzWmtHakQ3CnBwVXh1VkNOdXAxTDNaNnFSUEZDK1VndXVmSmpxQmRJR2Q5VgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
- server: https://192.168.111.6:6443
- name: kubernetes
context是配置的上下文,它指定了去连接k8s当中的哪个集群,因为可以配置多个cluster。其次使用哪个用户去访问它,用户信息就在下面user部分,其次是context的名字叫啥,当前叫做kubernetes-admin@kubernetes。
- contexts:
- - context:
- cluster: kubernetes
- user: kubernetes-admin
- name: kubernetes-admin@kubernetes
- current-context: kubernetes-admin@kubernetes
- kind: Config
- preferences: {}
用户信息
- users:
- - name: kubernetes-admin
- user:
- client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURFekNDQWZ1Z0F3SUJBZ0lJRkVDa2hGazExU0F3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TWpBME1UZ3dPVEF3TVRoYUZ3MHlNekEwTVRnd09UQXdNakphTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXQyWVU5RGlNQWNYZWh6QjYKL3ZSMTVDenpaVzRQdmxUMGFZcTJuaVgzZmRYRkhwRlhLamVWVUZ1RGNnY3A5QzlmeFBqa2UwYVpjdEN4bGNycQp2a2xRbWZpNnRpMW5CVEk0SE4rQVdJNzdEMlo2ZEM5bTJ1bmxQRk5vU3RQQ1ZOTEdpU3BHayszS3pXbEU5ZFgzCkFzZGF0SnFJcHRSVG1mTFFHNG1ncXZHZzU1d3RaUFZ4VTU3YVFMbmsrK1NBRy9UZ1ZhUFZQNk9aeUZRakp4QmgKcjM1c1RyNUJEdTB6TWRUUFZzV2JvK09wQm4vUXdwdDV3aVo0azU1czR3Y1hqUXlLcDFvYVMxUnhPbEdZR2M1RwpJclFVOFNOTGUxZnZ5ZWRMWUhSOGVXMTlNM2hCUDRkWTBXbU12cXhvM3ZNWnp5QmYxTXhNM2RzMTdVN3RpbGcxCmZpU25ld0lEQVFBQm8wZ3dSakFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0h3WURWUjBqQkJnd0ZvQVU3K3F0clplY3pnRjZNYXY2TFZidWFBWFEzdDh3RFFZSktvWklodmNOQVFFTApCUUFEZ2dFQkFEdXFWeU93S2JqVGUya0FXOG9SU3JlUGFnQkNDOGhZSkZlazNIMDg4eGFadDhFckh5K2NNb3FRCmt6WnBuTlFuVFpDRHJxVEpJTkwyeWdXZTBjZGhZY1RDdG04SVdkbWVqRVVobmwvazR1b2FrTm1CdGY5Nzl6WEkKNEtHUCtPSm5OTWdzVk9KeEFZN1k3QWRCWXQ4aFJVYmdyT2U5TVRGRWFIaDQwMXNBWXc0Q1ZXYWNkRFRCYnFaTgpRWHZqdmtjOW9pakoyY05SdUd4ZndXeTJQVzlkQnI5MEtSSFVvNlR6WkJQKzBZeXg5SU14aktTQjdjdTRLSGRxCnlPOHFYVHZHeDN6VE1uUHkvYTUzbkxnY2JZdHREdCtzSVNocG1UZkdnclhIelEvd1dSM3ZkTWtPcHdqY3dOOGwKaUthRDdYQlZ2dlE5VllEaEI3UEtxamVhMGdRdG9QMD0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
Etcd本身除了是一个数据库,它还是一个消息中间件,它会将消息推送给apiserver,apiserver继承了同样的能力,一方面是list watch etcd,同时它也提供了同样的服务。
其他的组件包括kubectl也可以去watch apiserver,apiserver这边有任何的事件变化,其实是可以通知到的。
- [root@master ~]# kubectl get pod -w
- NAME READY STATUS RESTARTS AGE
- dns-test 1/1 Running 3 37d
- nginx-74d69c5bbb-6478r 1/1 Running 3 35d
- nginx-74d69c5bbb-mhmsc 1/1 Running 3 35d
- nginx-web-0 1/1 Running 4 37d
- nginx-web-1 1/1 Running 0 16h
- web-mychart-7d8f9bd8d6-jfdc9 1/1 Running 0 38m
通过watch就实时的知道了这个对象的变化,集群所有的组件都是通过这种机制去运作的。
大家都去watch apiserver,有任何的事件就来通知我。
想知道pod发生了什么事情,想知道pod的事件变化,这个事件除了包含了容器本身的详细信息之外,还有它相关的事件event。
event在k8s里面实际上是另外一个对象,这个对象在创建出来的时候是要去关联一个主对象的。
from可以看到事件是谁发的,有调度器发的和节点产生绑定的event,这样相当于我这个event在创建pod的时候有一个关联关系了。
其次是kubelet产生了event,以event形式记录下创建pod的日志信息,是为这个pod创建的一个event对象。
describe的时候,第一它会将主对象拉取下来,其次会去拉主对象相关的event对象,然后做一个整合展示。
所以describe的时候就能够看到这个对象相关的事件。
- Events:
- Type Reason Age From Message
- ---- ------ ---- ---- -------
- Normal Scheduled 57s Successfully assigned default/nginx-web-0 to node2
- Normal Pulled 92s kubelet, node2 Container image "nginx:1.11" already present on machine
- Normal Created 92s kubelet, node2 Created container nginx-test
- Normal Started 92s kubelet, node2 Started container nginx-test
exec能不能使用就看你容器镜像然后构建的,容器基础镜像是什么,提供的调试工具是什么,如果是一个scrach,那里面什么都没有,想运行任何命令都是不行的,那么只能在主机上面做调试了。
如果pod里面有多个容器,那么可以使用-c来指定看哪个容器的日志。