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

提到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。

  • 41
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要排查Kubernetes的DNS解析和kube-proxy问题,可以按照以下步骤进行: 1. 检查DNS配置:首先,请确保Kubernetes集群的DNS配置正确。可以使用以下命令检查kube-dns或coredns的Pod是否正在运行: ``` kubectl get pods -n kube-system -l k8s-app=kube-dns ``` 如果Pod没有处于运行状态,可以使用以下命令查看它们的详细信息: ``` kubectl describe pod -n kube-system <kube-dns-pod-name> ``` 确保DNS Pod没有任何错误或异常,并且它们的IP地址集群其他组件的IP地址是可访问的。 2. 检查DNS解析配置:确保你的Service和Pod的DNS配置正确。可以使用以下命令检查Service和Pod的DNS名称是否正确解析为IP地址: ``` kubectl run -it --rm --restart=Never busybox --image=busybox:1.31 nslookup <service-name> ``` 这将在一个临时Pod执行nslookup命令来检查DNS解析情况。 3. 检查kube-proxy配置:确认kube-proxy的配置正确,并且它正在正常运行。可以使用以下命令检查kube-proxy的状态: ``` kubectl get pods -n kube-system -l k8s-app=kube-proxy ``` 如果kube-proxy Pod没有处于运行状态,可以使用以下命令查看它们的详细信息: ``` kubectl describe pod -n kube-system <kube-proxy-pod-name> ``` 确保kube-proxy没有任何错误,并且它正在监听正确的网络接口。 4. 检查网络策略和防火墙:如果你启用了网络策略(NetworkPolicy),请确保它允许从源Pod访问目标Pod的DNS。另外,检查防火墙规则是否允许DNS流量通过。 这些步骤可用于排查Kubernetes的DNS解析和kube-proxy问题。如果问题仍然存在,请提供更多详细信息,以便我能够提供更准确的帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值