如何通过kube-apiserver访问K8s集群中的App

本文分享自华为云社区《通过kube-apiserver访问K8s集群中的App》,作者: tsjsdbd。

K8s集群中的App(或者svc),通常使用ClusterIP,NodePort,Loadbalancer这些方式访问,但是你也可以通过Kube-apiserver(管理面)来访问App。

在《跟唐老师学习云网络 - Kubernetes网络实现》里面,提到K8s集群里面的容器,有几种访问方法:

  • LoadBalancer
  • Ingress
  • ClusterIP
  • NodePort

这里就不再分析,直接看如何通过Kube-apiserver来访问容器里面的App。下图(5)

一、启动App

创建文件ng-dp.yaml,内容如下:

yaml 复制代码
apiVersion: apps/v1

kind: Deployment

metadata:

name: nginx-deployment

labels:

app: nginx

spec:

replicas: 1

selector:

matchLabels:

app: nginx

template:

metadata:

labels:

app: nginx

spec:

containers:

- name: nginx

image: nginx:stable-perl

ports:

- containerPort: 80

执行命令:

复制代码
kubectl apply -f ng-dp.yaml

这样会启动一个nginx容器,并在容器里面监听80端口。

二、设置svc访问

创建文件ng-svc.yaml,内容如下:

yaml 复制代码
apiVersion: v1

kind: Service

metadata:

name: my-nginx

spec:

ports:

- port: 80

protocol: TCP

selector:

app: nginx

执行命令:

复制代码
kubectl apply -f ng-svc.yaml

这样就会为App开启集群内可访问的svc通道。

scss 复制代码
kubectl get svc

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE

kubernetes ClusterIP 10.247.0.1 <none> 443/TCP 7d

my-nginx ClusterIP 10.247.124.234 <none> 80/TCP 4h4m

有了svc后,我们就可以通过Kube-apiserver访问该App了。

三、访问App

查询Kube-apiserver的地址:

ruby 复制代码
kubectl cluster-info

Kubernetes control plane is running at https://192.168.0.116:5443

CoreDNS is running at https://192.168.0.116:5443/api/v1/namespaces/kube-system/services/coredns:dns/proxy

1)通过token方式访问:

查询sa(service-account)

arduino 复制代码
kubectl get sa

NAME SECRETS AGE

default 1 7d

然后查询sa内容

vbnet 复制代码
kubectl describe sa default

Name: default

Namespace: default

Mountable secrets: default-token-vztbc

Tokens: default-token-vztbc

接着查询secret内容,获得token值。

vbnet 复制代码
kubectl describe secret default-token-vztbc

Name: default-token-vztbc

Namespace: default

Type: kubernetes.io/service-account-token

====

token: eyJhbGciOiJSUzI1NiIsImtpZCI6InJlRWUxSFpvektO <== 取这个内容

设置env后,就可以访问App了

bash 复制代码
export TOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6InJlRWUxSFpvektO

curl --noproxy '*' -kv -H "Authorization: Bearer $TOKEN" \

https://192.168.0.116:5443/api/v1/namespaces/default/services/http:my-nginx:80/proxy/

如果权限不够,说明要提高sa的权限,比如:

scss 复制代码
kubectl create clusterrolebinding sa-tsj --clusterrole=cluster-admin --serviceaccount=default:default

2)通过证书方式访问:

除了获取token,也可以直接配置证书方式来访问。我们从kubeconfig文件里面,取出对应的证书。

bash 复制代码
grep -A1 'client-certificate-data: ' /root/.kube/config | tail -n 1 | sed 's/ *//' | base64 -d >cert.pem

grep -A1 'client-key-data: ' /root/.kube/config | tail -n 1 | sed 's/ *//' | base64 -d >key.pem

grep -A1 'certificate-authority-data: ' /root/.kube/config | tail -n 1 | sed 's/ *//' | base64 -d >ca.pem

然后,配置证书后访问:

bash 复制代码
curl --noproxy '*' -kv --cacert ./ca.pem --key ./key.pem --cert ./cert.pem \

https://192.168.0.116:5443/api/v1/namespaces/default/services/http:my-nginx:80/proxy/

四、URL格式说明

Kube-apiserver提供代理URL格式如下:

ruby 复制代码
http://api_addr/api/v1/namespaces/namespace_name/services/service_name/proxy

其中,你可以将App的url后缀,parameter参数等附加到尾部。如:

ruby 复制代码
http://api_addr/api/v1/namespaces/namespace_name/services/service_name[:port_name]/proxy

如果没有指定「端口名」,也可以使用「端口号」,如:

ruby 复制代码
http://api_addr/api/v1/namespaces/namespace_name/services/service_name[:port_num]/proxy

反正不管有没有指定「端口名」,用「端口号」肯定是可以的。

默认情况, Kube-apiserver是使用http来访问你的App,如果要使用https的话,则要指定,如下:

ruby 复制代码
http://api_addr/api/v1/namespaces/namespace_name/services/https:service_name:[port_name]/proxy

所有支持的proxy的URL格式总结如下:

<service_name> - 使用http访问默认的端口

<service_name>:<port_name> - 使用http访问指定的端口

<service_name>:<port_number> - 使用http访问指定的端口

https:<service_name>: - 使用https访问默认的端口(注意有个冒号)

https:<service_name>:<port_name> - 使用https访问指定的端口

五、有什么用?

很多时候,K8s集群里面App的访问,都是只能通过「数据面」访问(无论是ClusterIP,NodePort,Ingress等),比如要从互联网访问,就得靠绑定EIP来完成。但是如果「管理面」也能访问到App的话,我们就可以设计一种"代理模式",通过复用管理面通道,提供App的默认访问能力。这样你的用户,不用额外绑定EIP也能访问他的App。

点击关注,第一时间了解华为云新鲜技术~

相关推荐
Java爱好狂.20 分钟前
Java程序员体系化学习路线(2026最新版)
java·后端·java面试·java架构师·java程序员·java八股文·java学习路线
陈随易39 分钟前
Redis 8.8发布,一定要更新
前端·后端·程序员
装不满的克莱因瓶1 小时前
SpringBoot 如何将 lib 目录中jar包打包进最终的jar包里面
spring boot·后端·maven·jar·mvn
ltl2 小时前
Transformer 原论文实验结果:为什么 28.4 BLEU 足以改写路线图
后端
excel2 小时前
为什么我推荐使用 Termius:现代 SSH 工具的完整体验
前端·后端
卷毛的技术笔记3 小时前
Java后端硬核实战:用Spring AI Alibaba+Redis给LLM装上“超强记忆中枢”
java·人工智能·redis·后端·spring·ai·系统架构
IT_陈寒4 小时前
Java的Optional差点让我掉坑里,这几个坑你别踩
前端·人工智能·后端
子兮曰4 小时前
Harness 驾驭工程深度教程:从 AGENTS.md 到全链路 AI 编码基础设施
前端·后端·ai编程
小杍随笔4 小时前
【Rust 工具链管理工具再升级!rust-verse v1.3.1 ~ v1.3.5 最新更新深度解析】
开发语言·后端·rust
百珏5 小时前
海量人群包存储优化:基于 RoaringBitmap 交换格式与 Redis 分片 Bitmap 的实践
java·后端·架构