kube-api-server的端口是8080和6443,前者是http的端口,后者是https的端口,因为最近在做项目实例需要用到kuboard,在连接集群时输入要输入网址和端口号
在命名空间的kube-system命名空间里,有一个名称为kube-api-master的pod,
这个pod就是运行着kube-api-server进程,它绑定了master主机的ip地址和6443端口,但是在default命名空间下,存在一个叫kubernetes的服务,该服务对外暴露端口为443,目标端口6443,
这个服务的ip地址是clusterip地址池里面的第一个地址,同时这个服务的yaml定义里面并没有指定标签选择器,
也就是说这个kubernetes服务所对应的endpoint是手动创建的,该endpoint也是名称叫做kubernetes,该endpoint的yaml定义里面代理到master节点的6443端口,也就是kube-api-server的IP和端口。
这样一来,其他pod访问kube-api-server的整个流程就是:pod创建后嵌入了环境变量,pod获取到了kubernetes这个服务的ip和443端口,请求到kubernetes这个服务其实就是转发到了master节点上的6443端口的kube-api-server这个pod里面。
如何访问api
方法1:kube-proxy
1.集群内:
启动proxy端口9999,访问该端口将proxy到api-server
# kubectl proxy --address='178.104.163.243' --accept-hosts='^*$' --port=9999
2.集群外:
# curl http://178.104.163.243:9999/api/v1/nodes
方法2: Token
1.集群内:创建sa
kubectl create serviceaccount sa-test
2.集群内:rbac给sa赋权
将clusterrole:cluster-admin绑定给sa,该sa拥有了管理员的权限:
kubectl create clusterrolebinding sa-test-cluster-admin --clusterrole='cluster-admin' --serviceaccount=default:sa-test
3.集群内:获得token
刚创建的sa带一个secret,secret中存放了token:
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='sa-test')].data.token}"|base64 -d)
4.集群外:使用token访问API
curl --header "Authorization: Bearer $TOKEN" --insecure -X GET https://178.104.163.38:6443/api/v1/namespaces/monitoring/pods?limit=1
方法3: 证书
要求使用apiserver的key文件和cert文件:
curl -k --key /etc/kubernetes/pki/apiserver-kubelet-client.key --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt https://178.104.163.38:6443/api/v1/nodes