当前位置: 首页 > news >正文

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打开外网,然后集群外访问到。

天天打码,天天进步!

相关文章:

  • 网站开发的关键计算机资源计划/seo排名优化厂家
  • wordpress多站点数据共享/seo是什么化学名称
  • 太原网站制作策划/网络运营好学吗
  • 3 建设营销型网站流程/东莞优化怎么做seo
  • 装潢设计师要学什么/什么是seo优化?
  • 网站需求分析网站建设/新泰网站设计
  • buuctf刷题8 (ssti注入nmap- oG指令别样的sql注入)
  • python中的迭代器,可迭代对象(详细剖析)
  • TYUT太原理工大学2022需求工程考试选择题背诵版
  • 【Linux】远程登陆、远程开发以及Vim的使用
  • 小程序 | 案例---自定义tabBar
  • 【Geometry】Introduction 计算机几何学(3)网格的细分与简化
  • mysql 联合索引去查询的逻辑
  • 常见知识库对比:DBpedia/Freebase/OpenCyc/Wikidata/YAGO3
  • Java---抽象类和接口
  • java优先级队列(堆)
  • Java项目:防盗门进销存管理系统(java+SSM+HTML+BootStrap+Mysql)
  • 【C++初阶】简析拷贝构造、赋值运算符重载