如何通过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。

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

相关推荐
追逐时光者5 小时前
推荐 12 款开源美观、简单易用的 WPF UI 控件库,让 WPF 应用界面焕然一新!
后端·.net
Jagger_5 小时前
敏捷开发流程-精简版
前端·后端
苏打水com6 小时前
数据库进阶实战:从性能优化到分布式架构的核心突破
数据库·后端
间彧7 小时前
Spring Cloud Gateway与Kong或Nginx等API网关相比有哪些优劣势?
后端
间彧7 小时前
如何基于Spring Cloud Gateway实现灰度发布的具体配置示例?
后端
间彧7 小时前
在实际项目中如何设计一个高可用的Spring Cloud Gateway集群?
后端
间彧7 小时前
如何为Spring Cloud Gateway配置具体的负载均衡策略?
后端
间彧7 小时前
Spring Cloud Gateway详解与应用实战
后端
-L78 小时前
【Kubernetes】常见面试题汇总(十九)
云原生·容器·kubernetes
EnCi Zheng9 小时前
SpringBoot 配置文件完全指南-从入门到精通
java·spring boot·后端