一、通过Downward API卷传递本pod的元数据
1、可用的元数据
pod名称
pod IP
pod命名空间
pod运行节点的名称
pod运行所归属的服务账户的名称
每个容器请求的CPU和内存使用量
每个容器可用的CPU和内存限制
pod 的标签
pod 的注解
2、通过环境变量暴露元数据
可以通过kubectl exec downward env查看pod的环境变量
3、通过downwardAPI卷传递元数据
创建一个downwardAPI类型的卷Volumn,将其挂载到容器内
这个最终的结果不是在env里了,而是在文件中
可以到/etc/downward目录下ls查看一下,就能看到各个文件
查看文件内容:
kubectl exec downward cat /etc/downward/annotations
key1="value1"
key2="multi\nline\nvalue\n"
注意一个细节:卷定义中引用容器级的元数据,需要指定容器名称
二、与k8s API服务器交互
上面都是暴露pod和容器自身的元数据,怎么知道其他pod或资源的信息呢?通过查k8s API服务器
1、学会使用API服务器
(1)查看集群信息
kubectl cluster-info
Kubernetes master is running at https://ip:8443
尝试连接
curl https://ip:8443 -k
Unauthorized
服务器使用https协议需要授权,-k可以跳过证书验证,但也还是访问不通的
(2)使用kubectl proxy访问:
kubectl proxy启动了一个代理服务,接收本机的http请求并转发至API服务器,同时处理身份认证。还可以确保我们直接和API服务器交互,而不是一个中间人
先启动,直接运行
kubectl proxy
Starting to serve on 127.0.0.1:8001
然后
curl localhost:8001
可以看到一些接口url,通过curl这些url可以查看某些具体资源的信息
2、pod内部与API服务器交互
(1)发现API服务器地址,其实pod的环境变量里默认添加了这些,甚至还有DNS入口
env | grep KUBERNETES_SERVICE
甚至直接
curl https://kubernetes
这里也要认证,加上证书和token就可以了,记得Secret里面挂载的路径吗?
ls /var/run/secrets/kubernetes.io/serviceaccount
ca.crt namespace token
curl的时候把环境变量配置一下就通了
export CURL_BUNDLE=/var/run/secrets/kubernetes.io/serviceaccout/ca.crt
TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
curl -N "Authorization: Bearer $TOKEN" https://kubernetes
namespace也应该在这个目录下获取
NS=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
(2)同样使用代理:通过ambassador容器
构造一个pod,运行两个容器,一个主容器main,一个ambassador容器
ambassador容器的启动命令就是kubectl proxy,在main容器中直接curl 8001就可以访问API服务器,因为ambassador可以转发请求
curl localhost:8001
三、客户端与API服务器交互
官方客户端只有go、python,非官方的有很多,都可以用
java的可以看下GitHub - fabric8io/kubernetes-client: Java client for Kubernetes & OpenShift
使用起来就是new一个client,用client的一些方法去与API服务器交互