一  为何需要与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. 11g RAC 集群数据库不能跟随集群启动

    1.查看集群资源详细情况 [oracle@rac01-+ASM1 ~]$ crsctl stat res -p 2.修改集群资源ora.rac.db的auto_start属性改为always [ora ...

  2. K8S安装Kubesphere

    准备工作 安装Helm curl -L https://git.io/get_helm.sh | bash 创建账户 cat > heml-rbac.yaml << EOF apiV ...

  3. 实验4 汇编应用编程和c语言程序反汇编分析

    1. 实验任务1 教材「实验9 根据材料编程」(P187-189)编程:在屏幕中间分别显示绿色.绿底红色.白底蓝色的字符串'welcome to masm!'. 解题思路:根据学习的知识,我知道该页在 ...

  4. react第九单元(propTypes验证)

    第九单元(propTypes验证) #课程目标 理解类型验证的必要性 灵活掌握类型验证的使用 #知识点 在给react组件传属性的的时候,我们可以定义属性的类型,此时我们需要下载prop-types这 ...

  5. [日常摸鱼]UVA11424&11426 GCD - Extreme

    话说UVa的机子跑的好快呀- (两题题意一样,前一题数据范围比较小) 题意:求$\sum_{i=1}^{n-1} \sum_{j=i+1}^n gcd(i,j),n<4\times 10^6$ ...

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

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

  7. 如何去掉ul和li前面的小黑点

    做网站的时候经常会遇到如上图所示的小圆点,难看不说,还容易影响布局,下面就介绍几种消除小圆点的方法: 1. 找到相关CSS文件,在.ul 和.li 部分添加: 1 list-style: none; ...

  8. 让vs2013自带的IISExpress支持apk文件下载

    使用vs2013作为android的服务器端开发时,总是会碰到需要自动更新的功能,VS2013自带IIS Express,想要下载apk文件,就需要添加MIME映射.没有图形界面,只能命令行.进入C: ...

  9. 简单测试linq to sql性能

         前些日子,做了一个物业收费系统,cs模式,用到了linq to sql 技术,这是我第一次使用这个东东写程序存取数据库,迷迷糊糊搞得一塌糊涂,当时有个同学他们找好的分页组件,然后写好了调用方 ...

  10. Semaphore信号量深度解析

    1. 使用指南 package com.multthread; import java.util.concurrent.ExecutorService; import java.util.concur ...