Kubernetes_14_静态Pod网关apiserver底层都是restful接口
系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、所有的kubectl底层都是https请求
- 1.1 所有的kubectl底层都是https请求
- 1.2 从集群外使用https访问k8s集群的权限问题及其两种解决方案
- 二、打开外网
- 2.1 理论: 打开外网的需求
- 2.2 实践: 打开外网的操作
- 总结
前言
一个k8s集群每个node节点上都有 kubelet服务、kube-proxy容器、calico容器,主节点上有 kube-apiserver、kube-proxy、kube-controller-manager、kube-scheduler,这四个被称为静态Pod,其次,主节点上还有 kube-dns/coredns 域名解析 和 etcd 配置中心。
本文讲解 kube-apiserver,直译为网关,所有的发送给 k8s 集群的请求会从 kube-apiserver 经过,类似写 spring 服务端程序的拦截器。对于 kube-apiserver 静态Pod,与工程开发相关,有四个方面需要学习:所有的kubectl底层都是http请求、rbac 权限机制、audit 审计日志。
本文介绍所有的kubectl底层都是http请求,并且k8s打开外网,然后集群外访问到。
一、所有的kubectl底层都是https请求
1.1 所有的kubectl底层都是https请求
对于k8s集群而言,kubectl、kubelet、kubeadm是版本是一致的,kubectl是操作命令,kubeadm是安装工具(安装kubeadm init,重置kubeadm reset),kubelet是linux服务(systemctl status kubelet查看)。
kubectl作为命令操作工具,其实每一条kubectl命令底层本质都是restful风格的https请求。
注意:所有对于k8s的都是https请求,没有http请求。
以 kubectl get ns 为例,如下:
使用Postman发送请求也可以使用相同的效果,如下:
先查询到对应的 url,如下
然后使用Postman发送请求,如下:
GET /api/v1/namespaces
现在就验证了,所有的kubectl底层都是https请求,对于k8s api而言,这里提供三个官方链接,可方便日常使用,如下:
restful接口:https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.19/
kubectl命令:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#patch
swagger:https://raw.githubusercontent.com/kubernetes/kubernetes/master/api/openapi-spec/swagger.json
1.2 从集群外使用https访问k8s集群的权限问题及其两种解决方案
在提供https访问的时候,常见的问题是:User “system:anonymous” cannot list resource “configmaps”
https://192.168.100.155:6443/api/v1/namespaces
因为是Get请求,在chrome浏览器中也可以尝试,如下:
解决方案有两种,要么去掉鉴权,主节点上执行:kubectl create clusterrolebinding test:anonymous --clusterrole=cluster-admin --user=system:anonymous
要么在带密钥发送http请求,如下:
步骤1:先获得token
步骤2:使用token访问
1.创建一个k8s-admin.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: dashboard-admin
namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: dashboard-admin
subjects:
- kind: ServiceAccount
name: dashboard-admin
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io
2.应用k8s-admin.yaml配置
kubectl apply -f k8s-admin.yaml
3.获取admin-token名字
kubectl get secret -n kube-system|grep admin
4.Describe查询token内容
kubectl describe secret dashboard-admin-token-slc8x -n kube-system
请求头上廷加 bearer 具体token
二、打开外网
2.1 理论: 打开外网的需求
搭建 k8s 集群使用的是kubeadm init命令,这个命令要求使用的是内网ip,使用外网ip/公网ip是无法搭建成功的。所以默认的集群,各个node节点的内网ip写入到了k8s集群的密钥里面去,但是公网ip没有写入到密钥里面去的。
我现在直接搭建的是在vmware上的,因为 windows 和 vmware 在同一局域网里面,所以因为在 windows 直接使用内网ip 192.168.100.155 ,所以在 windows 的 Postman 可以访问到。
如果是使用 云服务器搭建的话,使用公网ip在Postman调用,是无法成功的,所以需要手动打开外网,将外网ip添加到密钥里面去。
2.2 实践: 打开外网的操作
本质就是到 /etc/kubernetes/pki 目录下,重新生成 apiserver.key apiserver.crt 这两个证书。
步骤1:查看当前允许哪些通过哪些ip操作k8s集群 (默认只允许 内网ip:6443 操作k8s集群,不允许外网ip:6443 操作k8s集群)
cd /etc/kubernetes/pki
openssl x509 -noout -text -in apiserver.crt |grep IP
步骤2:移走 apiserver.key apiserver.crt 两个证书
mkdir -pv /opt/cert
mv apiserver.* /opt/cert (这里必须移走,否则生成报错,不是可选操作)
注意:这里必须移走,否则生成报错,不是可选操作
步骤3:重新生成 apiserver.key apiserver.crt 这两个证书
kubeadm init phase certs apiserver \
--apiserver-advertise-address 内网ip \
--apiserver-cert-extra-sans apiserver.xxx域名 或者 本机外网ip 或者 代理机外网ip
这里有两个参数:
–apiserver-advertise-address 后面接内网ip
–apiserver-cert-extra-sans 后面接apiserver.xxx域名 或者 本机外网ip 或者 代理机外网ip
步骤4:重启主节点上的kubelet服务 (各个从节点上的kubelet服务不需要重启)
systemctl restart kubelet.service
我是使用vmware虚拟机,没有外网ip,所以这里无法截图演示了。没有云服务器,穷。
总结
本文介绍所有的kubectl底层都是https请求,并且k8s打开外网,然后集群外访问到。
天天打码,天天进步!