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

举报
tsjsdbd 发表于 2024/01/11 21:23:23 2024/01/11
【摘要】 K8s集群中的App,除了使用LoadBalancer、NodePort,Ingress,Loadbalancer以外,还可以通过Kube-apiserver访问哦

 

K8s集群中的App(或者svc),通常使用ClusterIPNodePortLoadbalancer这些方式访问,但是你也可以通过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方式访问:

查询saservice-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

 

其中,你可以将Appurl后缀,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

 

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

<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的访问,都是只能通过「数据面」访问(无论是ClusterIPNodePortIngress等),比如要从互联网访问,就得靠绑定EIP来完成。但是如果「管理面」也能访问到App的话,我们就可以设计一种“代理模式”,通过复用管理面通道,提供App的默认访问能力。这样你的用户,不用额外绑定EIP也能访问他的App

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。