一  为何需要与kubernets集群的API服务器进行交互

  1.1  kubernets提供了一种downapi的资源可以将pod的元数据渲染成环境变量或者downward卷的形式挂载到容器的文件系统上面去,但是这种操作只能将很少的数据暴露挂载pod的容器中,如果希望能将更多的数据暴露到容器里面去,需要在容器里面与kubernets的集群API服务器进行交互下面来介绍如何来与API服务器进行交互。

二 如何与API服务器进行通信

  2.1  第一步获取API服务器的url,通过如下命令获取

[root@node01 ~]# k cluster-info
Kubernetes control plane is running at https://172.16.70.6:6443
KubeDNS is running at https://172.16.70.6:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
  • api的地址是https://172.16.70.6:6443

  2.2  从节点通过kubectl proxy与API服务器进行通信

[root@node01 ~]# k proxy
Starting to serve on 127.0.0.1:8001 [root@node01 ~]# curl 127.0.0.1:8001
{
"paths": [
"/api",
"/api/v1",
"/apis",
"/apis/",
"/apis/admissionregistration.k8s.io",
"/apis/admissionregistration.k8s.io/v1beta1",
"/apis/apiextensions.k8s.io",
"/apis/apiextensions.k8s.io/v1beta1",
"/apis/apiregistration.k8s.io",
"/apis/apiregistration.k8s.io/v1",
"/apis/apiregistration.k8s.io/v1beta1",
"/apis/apps",
"/apis/apps/v1",
"/apis/apps/v1beta1",
"/apis/apps/v1beta2",
"/apis/authentication.k8s.io",
"/apis/authentication.k8s.io/v1",
"/apis/authentication.k8s.io/v1beta1",
"/apis/authorization.k8s.io",
"/apis/authorization.k8s.io/v1",
"/apis/authorization.k8s.io/v1beta1",
"/apis/autoscaling",
"/apis/autoscaling/v1",
"/apis/autoscaling/v2beta1",
"/apis/autoscaling/v2beta2",
"/apis/batch",
"/apis/batch/v1",
"/apis/batch/v1beta1",
  • 执行k proxy
  • 之后就可以来访问api服务器了
  • 这是因为,k proxy的这个代理里面已经包含了要与api服务器通信的所有必备因素,k proxy接受所有来自节点的http请求,之后将请求转发到proxy,并且将从api服务器接受到的信息返回给节点

  2.3 在pod内部与api服务器进行通信

    

    我们已经能够能在节点上与api服务器进行通信,下一步需要的是希望能够在pod内部与api服务器进行通信,但是pod内部没有kuberctl,所以我们只能通过其他的方式来与API服务器进行通信,需要关注一下几件事情

  • 确定API服务器的位置
  • 确定是API服务器而不是其他的冒名顶替的
  • 通过服务器的认证,否则将看不到任何的资源,同时也无法操作任何的资源

    之前提到过,每个pod中都会挂载一个secrets,这个secret中包含了与API服务器通信的所有必要因素,在此之前我们需要先创建一个金丝雀pod用来测试与API服务器进行通信,里面配置很简单,只需要一个主进程保持睡眠,然后使用里面挂载的secrets三要素ca.cert,namespace,token来访问API服务器

[root@node01 Chapter08]# cat curl.yml
apiVersion: v1
kind: Pod
metadata:
name: curl
spec:
containers:
- name: main
image: tutum/curl
command: ["sleep", "999999"]

  

  下面我们进入到pod里面执行访问命令API服务命令

export CURL_CA_BUNDLE=/var/run/secrets/kubernetes.io/serviceaccount/ca.crt

TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)

curl -H "Authorization: Bearer $TOKEN" https://kubernetes

  

  如果我们所在的集群基于角色的访问控制(RBAC),我们需要创建以下资源来绕过

k create clusterrolebinding permissive-binding --clusterrole=cluster-admin --group=system:serviceaccounts

  2.4 通过ambassador容器简化与API服务器的交互

    在运行主容器的同时运行一个ambassador容器,并在其中运行一个kuberctl proxy,主容器在运行的时候需要向API服务器发起请求的时候,会将请求以http的形式发送到ambassador中,ambassador容器将请求以https的形式转发到API服务器,ambassador挂载着secrets,用以提供对API服务器的认证

    运行一个带有附加ambassador容器的CURL容器

apiVersion: v1
kind: Pod
metadata:
name: curl-with-ambassador
spec:
containers:
- name: main
image: tutum/curl
command: ["sleep", "999999"]
- name: ambassador
image: luksa/kubectl-proxy:1.6.2

    之后在主容器里面执行访问API服务器的命令

[root@node01 Chapter08]# k exec -it curl-with-ambassador -c main bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. root@curl-with-ambassador:/# curl localhost:8001
{
"paths": [
"/api",
"/api/v1",
"/apis",
"/apis/",

    其中的原理如下图所示

  • 由于同一个pod里面的2个容器共享相同的主机命名空间,所以在该pod里面可以直接curl本机地址加端口将请求转发到kubectl proxy
  • kubectl-proxy接受到请求之后进行一系列的认证,鉴权等,之后将相关请求以https的形式发送到API服务器
  • API服务器响应之后,在将请求的数据转发给主容器,完成一次连接请求
  • 还可以根据各种各样的客户端进行与API服务器的交互

kubernets与API服务器进行交互的更多相关文章

  1. ionic 运行过程中动态切换API服务器地址

    ionic 运行过程中动态切换API服务器地址 keywords: ionic,phonegap,cordova,网络制式,动态切换,变更,API,服务器地址,$resource,localstora ...

  2. 运用socket实现简单的服务器客户端交互

    Socket解释: 网络上的两个程序通过一个双向的通信连接实现数据的交换,这个连接的一端称为一个socket. Socket的英文原义是“孔”或“插座”.作为BSD UNIX的进程通信机制,取后一种意 ...

  3. 使用XML与远程服务器进行交互

    最近在做的一个项目其中的一部分是与远程服务器进行交互,确定身份验证的合法性,于是编写了SendRequest方法 此方法发送给远程服务器XML请求,服务器经过处理后,返回XML回应,由此方法接收到后进 ...

  4. Appcn 移动开发 前台与服务器数据交互

    第一次写.嘿嘿. 言归正传,这几天开始学习移动开发,使用的是Appcan平台.Appcan平台采用HTML5+CSS3做开发 实现跨平台,正好可以满足我们的业务需求. Appacn和数据库进行交互的方 ...

  5. Ajax概述及浅谈其与服务器的交互过程

    概念: 首先AJAX不只是一个特定的客户端技术,更应算是一种技巧.Ajax技术的核心操作是用XmlHttpRequest(下称XHR)对象进行异步数据处理. 所谓异步,即通过 AJAX,JavaScr ...

  6. [置顶] Asp.Net底层原理(一、浏览器和服务器的交互原理)

    …… 一.浏览器和服务器的交互原理 二.写自己的"迷你"Asp.net框架 三.Asp.Net的请求与响应过程 1.在此之前,首先简单的模拟一下我们去请求一个网址的时候,浏览器和服 ...

  7. Golang:使用 httprouter 构建 API 服务器

    https://medium.com/@gauravsingharoy/build-your-first-api-server-with-httprouter-in-golang-732b7b01f6 ...

  8. 多服务器终端交互利器--polysh和atnodes到高逼格日志中心

    最近博客更新的少了,相对而言,我在自己的个人公众号里还是挺活跃的,大家可以扫描旁边的二维码,或者微信搜索公众号:“编程一生”加关注. 在分布式的年代,一个应用需要部署到多台服务器上.那么要查看日志文件 ...

  9. UDP协议实现客户服务器数据交互

    UDP协议实现客户服务器数据交互 按照往常一样将今天自己写的题目答案写在了博客上习题:客户端循环发送消息给服务端,服务端循环接收,并打印出来,直到收到Bye就退出程序. package network ...

随机推荐

  1. 七、TestNG传递参数2

    数据提供者本身可以接受两个类型的参数:Method和ITestContext 在创建@DataProvider方法是可以有四种格式如图: 第一种在上一篇中有学到 1-Methode参数使用 @Data ...

  2. 一、本地项目部署到GitHub上

    部署之前准备工作,本地安装Git和注册一个GitHub账号: 本地安装Git 因为官网下载速度较慢,从其他地方下载 https://npm.taobao.org/mirrors/git-for-win ...

  3. XSS攻击与防止

    1.XSS又称CSS, cross sitescript, 跨站脚本攻击,是web程序中常见的漏洞 XSS属于被动式且用于客户端的攻击方式 XSS攻击类似于SQL注入攻击,攻击之前,我们先找到一个存在 ...

  4. Shell-匹配行及date日期转换

    #将指定字符串转化为从1970年1月1日到现在的秒数. date -d '20170506' "+%s" #将1970年1月1日到现在累计的秒数转化为日期 date -d @149 ...

  5. python一键搭建ftp服务

    from pyftpdlib.authorizers import DummyAuthorizer from pyftpdlib.handlers import FTPHandler from pyf ...

  6. VSCode---REST Client接口测试辅助工具

    我们一般都会用 PostMan 来完成接口测试的工作,因为用起来十分简单快捷,但是一直以来我也在寻找更好的方案,一个不用切换窗口多开一个 app 的方案 -- 终于在使用 VSCode 一段时版本间, ...

  7. Python将word文档批量转PDF

    前面有一篇<Python批量创建word文档(2)- 加图片和表格>的文章,利用这篇文章创建的word文档来批量转PDF文档.代码: 1 ''' 2 #python批量将word文档转换成 ...

  8. MySQL 存储函数的创建、调用、查找

    MySQL存储函数(自定义函数),函数一般用于计算和返回一个值,可以将经常需要使用的计算或功能写成一个函数 1.创建存储函数:使用 create function关键字 2.调用存储函数: 3.示例: ...

  9. JAVA中IO流详解

    IO流:数据传输是需要通道的,而IO流就是数据传输的通道. IO流可以形象的比喻为运送货物的传输带. IO流的分类: ①根据操作的数据类型的不同可以分为 :字节流与字符流. ②根据数据的流向分为:输入 ...

  10. MySQL中的排序

    在编写SQL 语句时常常会用到 order by 进行排序,那么排序过程是什么样的?为什么有些排序执行比较快,有些排序执行很慢?又该如何去优化? 索引排序 索引排序指的是在通过索引查询时就完成了排序, ...