官方API文档:https://v1-13.docs.kubernetes.io/docs/reference/#api-reference
Kube 1.13版API文档:https://v1-13.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.13/
通过 Kubernetes API 访问集群(官方中文):https://k8smeetup.github.io/docs/tasks/administer-cluster/access-cluster-api/
kubenetes master使用curl 操作API:https://www.cnblogs.com/fengjian2016/p/6563938.html
CentOS 6下curl无法访问k8s api的解决
关于centos 6下curl无法链接k8s api的问题:curl: (35) SSL connect error
原因:centos 6默认安装的curl版本为 7.19.7 并且使用的密码学套件是nss而不是openssl,所以7.19版本不支持TLS v1.1以上的协议,官方的说法是要支持TLS v1.2 至少要长级到curl 7.34版本
解决方法是升级到新版本的curl,或更换密码学套件为openssl,或升级nss(升级nss未做测试)
方法一:升级curl版本
rpm -Uvh \
https://mirror.city-fan.org/ftp/contrib/sysutils/Mirroring/libcurl7155-7.15.5-17.cf.fc13.x86_64.rpm \
https://mirror.city-fan.org/ftp/contrib/sysutils/Mirroring/curl-7.66.0-1.1.cf.fc13.x86_64.rpm \
https://mirror.city-fan.org/ftp/contrib/sysutils/Mirroring/libcurl-7.66.0-1.1.cf.fc13.x86_64.rpm \
https://mirror.city-fan.org/ftp/contrib/libraries/c-ares-1.15.0-4.0.cf.fc13.x86_64.rpm \
https://mirror.city-fan.org/ftp/contrib/libraries/c-ares-devel-1.15.0-4.0.cf.fc13.x86_64.rpm \
https://mirror.city-fan.org/ftp/contrib/sysutils/Mirroring/libcurl-devel-7.66.0-1.1.cf.fc13.x86_64.rpm \
https://mirror.city-fan.org/ftp/contrib/libraries/libssh2-1.8.2-1.0.cf.fc13.x86_64.rpm \
https://mirror.city-fan.org/ftp/contrib/libraries/libssh2-devel-1.8.2-1.0.cf.fc13.x86_64.rpm \
https://mirror.city-fan.org/ftp/contrib/libraries/libmetalink-0.1.3-9.fc13.x86_64.rpm \
https://mirror.city-fan.org/ftp/contrib/libraries/libidn-1.34-3.0.el6.x86_64.rpm
方法二:重新编译curl 替换nss为openssl
wget https://curl.haxx.se/download/archeology/curl-7.19.7.tar.gz
tar zxf curl-7.19.7.tar.gz
cd curl-7.19.7
./configure --prefix=/usr --without-nss --with-ssl
# 下面的编译参数和系统原来的开启的功能是一样的
# ./configure --prefix=/usr --without-nss --with-ssl --enable-ldaps --with-libssh2 --with-gssapi --enable-ipv6
make
# cp src/curl src/.libs/curl 可能需要这个步骤 不然还是nss的
make install
curl -V
官方文档上的访问集群API方法
kubectl config view # 查看kubeconfig
使用kubectl代理
推荐的方式,由kubectl处理apiserver的定位和认证,不存在中间人攻击
# 本地访问
kubectl proxy --port=8080 &
# 远程访问
kubectl proxy --address=0.0.0.0 --port=8080 --accept-hosts=.* &
# 提供静态文件服务 访问/www可查看静态文件
kubectl proxy --address=0.0.0.0 --port=8080 --accept-hosts=.* --www=./ --www-prefix=/www/
# /提供静态文件 mykube下为api
kubectl proxy --address=0.0.0.0 --port=8080 --accept-hosts=.* --www=./ --www-prefix=/ --api-prefix=/mykube/
直接使用认证token
APISERVER=$(kubectl config view | grep server | cut -f 2- -d ":" | tr -d " ")
# tr -d '\t' 可能会失败 可能是空格
# TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t')
TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d ' ')
curl $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
需要注意的是,这里使用的认证凭据是 default名称空间下的default这个SA,所以,能访问的api资源是受限制的,如果要更多的权限,需要更换SA或授予default更多的权限(不建议这么做),如何查看某个searviceaccount拥有哪些权限呢,可以使用工具 rakkess
在容器内访问API
证书和token会默认挂载到容器中
/var/run/secrets/kubernetes.io/serviceaccount/token
/var/run/secrets/kubernetes.io/serviceaccount/ca.crt
因为有证书,所以不需要--insecure
集群权限查看工具 rakkess
项目地址:https://github.com/corneliusweig/rakkess
rakkess
# 查看名称空间级别权限
rakkess --namespace default
# 查看某SA的权限
rakkess --sa kube-system:namespace-controller
# 使用指定的kubeconfig
rakkess --kubeconfig=my-config --as default:default
# 查看某一资源不同用户所拥有的权限
rakkess resource configmaps
rakkess resource configmaps -n default
rakkess resource -n dev svc scm-api
部署方法:
curl -Lo rakkess.gz https://github.com/corneliusweig/rakkess/releases/download/v0.4.1/rakkess-linux-amd64.gz && \
gunzip rakkess.gz && chmod +x rakkess && mv rakkess $GOPATH/bin/
使用K8s API
API文档是首要查看的:https://v1-13.docs.kubernetes.io/docs/reference/generated/kubernetes-api/v1.13/
关于kubectl的输出
kubectl也是基于api调用集群功能的,通过添加 -v 参数,可以展现这一过程,会返回完整的curl命令,请求头、响应头及响应的json串
--v 或 -v
为8时,显示请求及响应的内容,较简略
为9时,显示更为详细的信息,包括curl命令,完整的json内容
一条kubectl命令可能包括几次api请求
利用kubectl命令加 -v 9参数学习api是非常好的方式
kubectl get 的 -o 格式化输出
-o的选项有:
json|yaml|wide|name
custom-columns=...|custom-columns-file=...
go-template=...|go-template-file=...
jsonpath=...|jsonpath-file=...
-o name 输出 资源类型/资源名称 ,如 service/tomcat-test
-o custom-columns= 可自定义列名
kubectl get svc -n test svc-tomcat -o custom-columns=NAME:.metadata.name,ClusterIP:.spec.clusterIP
-o go-template= 自定义输出
kubectl get pods --all-namespaces -o go-template --template='{{range.items}}{{.metadata.name}},{{end}}'
# 输出所有pod名称 并以逗号分隔
kubectl get pods --all-namespaces -o go-template --template='{{range .items}}{{printf "%s\n" .metadata.name}}{{end}}'
# 输出所有pod名称 换行显示
-o jsonpath= 自定义输出
kubectl -n test get svc svc-tomcat -o jsonpath='{.metadata.annotations.service\.beta\.kubernetes\.io\/alicloud-loadbalancer-id}'
# 注意,键名中包含有点.和斜杠\,需要进行转义,键名实际为 service.beta.kubernetes.io/alicloud-loadbalancer-id
常用API
流式查看日志
GET /api/v1/namespaces/kube-system/pods/<pod名称>/log?follow=true&tailLines=10
转载请注明:轻风博客 » Kubernetes API 的使用