欢迎访问我的博客,你的支持,是我最大的动力!

Kubernetes API 的使用

Linux 小马奔腾 168℃ 评论
目录:
[显示]

官方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版本

https://mirror.city-fan.org/ftp/contrib/sysutils/Mirroring/ 提供了解决方案,所有包都可以在上面下载
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

yum install libssh2-devel  # --with-libssh2 需要
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 --help
# 本地访问
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 " ")
TOKEN=$(kubectl describe secret $(kubectl get secrets | grep default | cut -f1 -d ' ') | grep -E '^token' | cut -f2 -d':' | tr -d '\t')
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 的使用

喜欢 (0)or分享 (0)