写点什么

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

  • 2024-01-12
    广东
  • 本文字数:2129 字

    阅读完需:约 7 分钟

如何通过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,内容如下:


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,内容如下:


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 通道。


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 的地址:


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)


kubectl get sa
NAME SECRETS AGE
default 1 7d
复制代码


然后查询 sa 内容


kubectl describe sa default
Name: default
Namespace: default
Mountable secrets: default-token-vztbc
Tokens: default-token-vztbc
复制代码


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


kubectl describe secret default-token-vztbc
Name: default-token-vztbc
Namespace: default
Type: kubernetes.io/service-account-token
====
token: eyJhbGciOiJSUzI1NiIsImtpZCI6InJlRWUxSFpvektO <== 取这个内容
复制代码


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


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 的权限,比如:


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

2)通过证书方式访问:


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


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
复制代码


然后,配置证书后访问:


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 格式如下:


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


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


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


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


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


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


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


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
用户头像

提供全面深入的云计算技术干货 2020-07-14 加入

生于云,长于云,让开发者成为决定性力量

评论

发布
暂无评论
如何通过kube-apiserver访问K8s集群中的App_开发_华为云开发者联盟_InfoQ写作社区