Kubernetes学习笔记(七):访问Pod元数据与Kubernetes API
Downward API
我们已经了解到,使用ConfigMap和Secret向应用传递配置数据,这对于运行前预设的数据是可行的。但是对于那些不能预先知道的,就需要使用Downward API。
Downward API允许我们通过环境变量或者卷的方式向应用传递元数据。可传递的数据包括:Pod的IP、名称、标签、注解、所在命令空间、运行的节点名称、运行所属的ServiceAccountName,每个容器请求的CPU和内存使用量以及限制。
通过环境变量暴露元数据
env.valueFrom
下引用Pod的字段使用fieldRef
,引用容器的cpu和内存使用resourceFieldRef
。
对于暴露资源的请求和使用显示的环境变量,我们通常会设置一个基数单位。实际的资源请求值和使用限制值除以这个基数单位,所得结果通过环境变量暴露出去。
# downward-env.yaml
apiVersion: v1
kind: Pod
metadata:
name: downward-env
spec:
containers:
- name: alpine
image: alpine
command: ["sleep","999999"]
resources:
requests:
cpu: 15m
memory: 100Ki
limits:
cpu: 500m
memory: 100Mi
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: SERVICE_ACCOUNT
valueFrom:
fieldRef:
fieldPath: spec.serviceAccountName
- name: CONTAINER_CPU_REQ_MILLICORES
valueFrom:
resourceFieldRef:
resource: requests.cpu
divisor: 1m
- name: CONTAINER_MEMORY_LIMIT_KIBIBYTES
valueFrom:
resourceFieldRef:
resource: limits.memory
divisor: 1Ki
查看一下环境变量
-> [root@kube0.vm] [~] k create -f downward-env.yaml
pod/downward-env created
-> [root@kube0.vm] [~] k exec downward-env env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=downward-env
POD_NAME=downward-env
POD_NAMESPACE=default
POD_IP=10.244.1.24
NODE_NAME=kube1.vm
SERVICE_ACCOUNT=default
CONTAINER_CPU_REQ_MILLICORES=15
CONTAINER_MEMORY_LIMIT_KIBIBYTES=102400
通过Downward卷传递元数据
使用downward卷的方式传递元数据,当Pod的标签和注解修改后,Kubernetes会更新存有相关信息的文件。而环境变量方式下,新值无法暴露。
该描述文件定义了一个downward类型的卷,挂载到容器的/tmp/downward。卷中包含的内容是用downwardAPI.items定义的。
# downward-volume.yaml
apiVersion: v1
kind: Pod
metadata:
name: downward-volume
labels:
foo: bar
annotations:
key1: value1
key2: |
multi
line
value
spec:
containers:
- name: alpine
image: alpine
command: ["sleep","999999"]
resources:
requests:
cpu: 15m
memory: 100Ki
limits:
cpu: 500m
memory: 100Mi
volumeMounts:
- name: downward
mountPath: /tmp/downward
volumes:
- name: downward
downwardAPI:
items:
- path: "podName"
fieldRef:
fieldPath: metadata.name
- path: "podNamespace"
fieldRef:
fieldPath: metadata.namespace
- path: "labels"
fieldRef:
fieldPath: metadata.labels
- path: "annotations"
fieldRef:
fieldPath: metadata.annotations
- path: "containerCpuReqMillicores"
resourceFieldRef:
containerName: alpine
resource: requests.cpu
divisor: 1m
- path: "containerMemoryLimitBytes"
resourceFieldRef:
containerName: alpine
resource: limits.memory
divisor: 1
创建查看
-> [root@kube0.vm] [~] k create -f downward-volume.yaml
pod/downward-volume created
-> [root@kube0.vm] [~] k exec downward-volume ls /tmp/downward
annotations
containerCpuReqMillicores
containerMemoryLimitBytes
labels
podName
podNamespace
与Kubernetes API服务器交互
DownwardAPI可以获得当前Pod的部分元数据,但是无法获得到其他的Pod的,以及一些集群中的其他资源信息。
Kubernetes REST API
先来查看集群信息,找到API服务器地址。然后 curl -k https://192.168.199.117:6443 ,当然结果也是访问受限的。
-> [root@kube0.vm] [~] k cluster-info
Kubernetes master is running at https://192.168.199.117:6443
KubeDNS is running at https://192.168.199.117:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
所以我们通过 kubectl proxy 访问API服务器。kubectl proxy启动一个代理,接收来自本机的HTTP请求并验证身份,转发到API服务器。
-> [root@kube0.vm] [~] k proxy
Starting to serve on 127.0.0.1:8001
新开一个窗口,访问根路径实时
-> [root@kube0.vm] [~] curl http://localhost:8001/
{
"paths": [
"/api",
"/api/v1",
"/apis",
"/apis/",
............
从pod内部与API服务器交互
确定API服务器的地址
-> [root@kube0.vm] [~] k get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d1h
或者从任意Pod查找服务的环境变量
-> [root@kube0.vm] [~] k exec myalpine env|grep KUBERNETES_SERVICE
KUBERNETES_SERVICE_PORT=443
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_SERVICE_HOST=10.96.0.1
用一个有curl的镜像启动一个Pod
首先验证服务器身份,定义CURL_CA_BUNDLE环境变量,省去每次都要 curl --cacert 指定证书
export CURL_CA_BUNDLE=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
其次获得服务器授权:定义TOKEN
export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
绕过RBAC,赋予所有服务账户(也可以说所有pod)的集群管理员权限。
-> [root@kube0.vm] [~] k create clusterrolebinding permissive-binding --clusterrole=cluster-admin --group=system:serviceaccounts
clusterrolebinding.rbac.authorization.k8s.io/permissive-binding created
访问API服务器
$ curl -H "Authorization: Bearer $TOKEN" https://kubernetes/
{
"paths": [
"/api",
"/api/v1",
...........
获取当前运行Pod所在的命名空间
export NS=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
列出当前命名空间的Pods
$ curl -H "Authorization: Bearer $TOKEN" https://kubernetes/api/v1/namespaces/$NS/pods
{
"kind": "PodList",
"apiVersion": "v1",
"metadata": {
"selfLink": "/api/v1/namespaces/default/pods",
"resourceVersion": "454829"
..........
简化与API服务器的交互
在Pod中,除了主容器外另起一个运行kubectl proxy的容器,这样主容器就可以通过http://127.0.0.1:8001/访问API服务器了。
先构建镜像,准备kubectl-proxy.sh和Dockerfile。
# kubectl-proxy.sh
#!/bin/sh
API_SERVER="https://$KUBERNETES_SERVICE_HOST:$KUBERNETES_SERVICE_PORT"
CA_CRT="/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
TOKEN="$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"
/kubectl proxy --server="$API_SERVER" --certificate-authority="$CA_CRT" --token="$TOKEN" --accept-paths='^.*'
myalpine就是一个安装了curl的自制镜像
# Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/orzi/myalpine
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.18.0/bin/linux/amd64/kubectl && chmod +x ./kubectl && mv ./kubectl /
COPY kubectl-proxy.sh /kubectl-proxy.sh
ENTRYPOINT ["/kubectl-proxy.sh"]
构建、推送
docker build -t registry.cn-hangzhou.aliyuncs.com/orzi/myalpine:kubeproxy .
docker push registry.cn-hangzhou.aliyuncs.com/orzi/myalpine:kubeproxy
描述文件
# mykubeproxy.yaml
apiVersion: v1
kind: Pod
metadata:
name: mykubeproxy
spec:
containers:
- name: myalpine
image: registry.cn-hangzhou.aliyuncs.com/orzi/myalpine
command: ["sleep","999999"]
- name: mykubeproxy
image: registry.cn-hangzhou.aliyuncs.com/orzi/myalpine:kubeproxy
创建、查看
-> [root@kube0.vm] [~] k create -f mykubeproxy.yaml
pod/mykubeproxy created
-> [root@kube0.vm] [~] k exec -it mykubeproxy -c myalpine sh
$ curl http://127.0.0.1:8001
{
"paths": [
"/api",
"/api/v1",
"/apis",
.......
小结
- Downward API允许我们将不能预先知道的Pod元数据通过环境变量或者卷的方式传递给应用。
- Downward API可传递的数据包括:Pod的IP、名称、标签、注解、所在命名空间、运行的节点名称、运行所属的ServiceAccountName,每个容器请求的CPU和内存的使用量和限制。
env.valueFrom
下引用Pod的字段使用fieldRef
,引用容器的cpu和内存使用resourceFieldRef
。- 对于暴露资源的请求和使用显示的环境变量,我们通常会设置一个基数单位。实际的资源请求值和使用限制值除以这个基数单位,所得结果通过环境变量暴露出去。
- 使用downward卷的方式传递元数据,当Pod的标签和注解修改后,Kubernetes会更新存有相关信息的文件。而环境变量方式下,新值无法暴露。
- 可以通过运行kubectl proxy后,在节点上访问API服务器。也可以在Pod中另起一个专门运行kubectl proxy的容器,在主容器中访问。
Kubernetes学习笔记(七):访问Pod元数据与Kubernetes API的更多相关文章
- kubernetes学习笔记之十二:资源指标API及自定义指标API
第一章.前言 以前是用heapster来收集资源指标才能看,现在heapster要废弃了从1.8以后引入了资源api指标监视 资源指标:metrics-server(核心指标) 自定义指标:prome ...
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
- Kubernetes 学习笔记(一):基础概念
个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...
- Linux学习笔记(七) 查询系统
1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...
- Kubernetes学习笔记(八):Deployment--声明式的升级应用
概述 本文核心问题是:如何升级应用. 对于Pod的更新有两种策略: 一是删除全部旧Pod之后再创建新Pod.好处是,同一时间只会有一个版本的应用存在:缺点是,应用有一段时间不可用. 二是先创建新Pod ...
- (转)Qt Model/View 学习笔记 (七)——Delegate类
Qt Model/View 学习笔记 (七) Delegate 类 概念 与MVC模式不同,model/view结构没有用于与用户交互的完全独立的组件.一般来讲, view负责把数据展示 给用户,也 ...
- Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...
- Typescript 学习笔记七:泛型
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(七) 学习网站博客推荐
python3.4学习笔记(七) 学习网站博客推荐 深入 Python 3http://sebug.net/paper/books/dive-into-python3/<深入 Python 3& ...
随机推荐
- 虚拟化学习笔记-KVM虚拟化跨机迁移原理
参考:https://zhuanlan.zhihu.com/p/27055555 在线迁移过程划分为三个阶段:准备阶段.迁移阶段和切换阶段.迁移环境为虚拟化底层KVM+Qemu.虚拟化管理Libvir ...
- .NET Core+WebApi+EF访问数据新增用户数据
新建一个.NET Core项目,我使用的IDE是VS2019 依次创建三个Core类库:第一个命名api.Model,第二个api.Common,第三个api.Bo 解释一下这个三类库的作用: 第一个 ...
- C++编程入门题目--No.5
题目: 输入三个整数x,y,z,请把这三个数由小到大输出. 程序分析: 我们想办法把最小的数放到x上,先将x与y进行比较,如果x>y则将x与y的值进行交换, 然后再用x与z进行比较,如果x> ...
- 数学--数论---P4718 Pollard-Rho算法 大数分解
P4718 [模板]Pollard-Rho算法 题目描述 MillerRabin算法是一种高效的质数判断方法.虽然是一种不确定的质数判断法,但是在选择多种底数的情况下,正确率是可以接受的.Pollar ...
- POJ2376Cleaning Shifts(区间覆盖贪心)
应该还是蛮简单的一题,但是因为模拟太差,一直没调出来....... \(显而易见的应该按照左区间从小到大排序,相等按照右区间大到小排序\). \(那么第一个区间的l一定要是1,而且必拿(否则没有区间能 ...
- Web概念
目录 Web概念概述 Web概念概述 JavaWeb 使用 Java 语言开发基于互联网的项目 软件架构 C / S:Client / Server 客户端 / 服务器端 在用户本地有一个客户端程序, ...
- matlab数值数据和变量名
1.2MATLAB数值数据 l 数值数据类型的分类 l 数值数据的输出格式 l 常用数学函数内部函数 1.数值数据类型的分类 l 整型 l 浮点型 l 复数型 (1)整型 1.数值数据类型 ...
- 将csv文件导入sql数据库
有一个csv文件需要导入到Sql数据库中,其格式为 “adb”,"dds","sdf" “adb”,"dds","sdf" ...
- SpringCloud (一) :微服务架构
什么是微服务架构 简而言之,微服务架构风格就是将单一应用的开发分为多个小的服务,每个小的服务在自己的进程中运行并使用轻量级机制进行通信(通常是一个HTTP API源),这些服务围绕业务性能进行构建,并 ...
- 使用Java实现简单的斗地主案例
使用Java实现简单的斗地主案例 案例说明:使用Java实现简单的斗地主洗牌发牌的操作: 具体规则: 共有54张牌,顺序打乱: 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后留三张为底牌(地主牌) ...