tke在pod内通过kubectl访问集群
现在各类云厂商都有提供托管的k8s服务,并且有提供可视化的前端来访问集群内资源,同样tke集群也是如此,但是作为一个k8s的使用者,用kubectl来访问集群是必不可少的,tke控制台并不是会显示所有资源类型,像一些自定义的crd就只能通过命令查看了,并且及时有控制台查看,很多大佬还是习惯命令操作了。但是云上的权限一般都管控比较严格,你可能只有控制台操作权限,没有登录机器的权限,又或者说你的集群没有开启公网访问,只能内网访问,这个时候该怎么通过kubectl去访问集群呢?
下面我们通过在tke集群内部署一个kubectl的pod,来作为客户端访问集群的apiserver,这个前提是你能在控制台操作tke集群。
1. 通过configmap挂载集群kubeconfig
1.1 控制台获取kubeconfig
如果你能控制台操作tke集群说明你账号下的kubeconfig是有权限的,在集群的基本信息页获取kubeconfig
1.2 获取集群apiserver内部访问ip地址
因为是kubectl是在集群内pod,所以我们通过apiserver的cluserip来访问即可,获取下default命名空间下的kubernetes这个service的clusterip,端口是443。
1.3 创建configmap
参考下面修改yaml,通过configmap将我们修改后的kubeconfig挂载到pod,这里需要注意的是将控制台获取的Kubeconfig 文件中 clusters.cluster.server 字段替换为 https://<kubernetes svc的clusterip>:443 即可。
apiVersion: v1
data:
config: |-
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZ
server: https://172.16.0.1:443
name: cls-xxxx
contexts:
- context:
cluster: cls-xxxx
user: "xxxxx"
name: cls-xxxxx-xxxxx-context-default
current-context: cls-xxxx-xxxxx-context-default
kind: Config
preferences: {}
users:
- name: "xxxxxx"
user:
client-certificate-data: LS0tLS1CRUdJTiBDRVJU
client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVk
kind: ConfigMap
metadata:
name: config
namespace: tke-test
2. 部署kubectl工作负载
这里我们部署下工作负载,并且挂载上一步创建的configmap,让kubectl能直接默认读到kubeconfig,因为kubectl镜像没有常驻进程,所以这里加个sleep作为pod的常驻进程,访问pod起不来。
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: kubectl
qcloud-app: kubectl
name: kubectl
namespace: tke-test
spec:
replicas: 1
selector:
matchLabels:
k8s-app: kubectl
qcloud-app: kubectl
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
template:
metadata:
labels:
k8s-app: kubectl
qcloud-app: kubectl
spec:
containers:
- args:
- 3600d
command:
- sleep
image: mohamedltaief/kubctl-helm:latest
imagePullPolicy: Always
name: kubectl
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 250m
memory: 256Mi
securityContext:
privileged: false
volumeMounts:
- mountPath: /root/.kube/config
name: vol
subPath: config
dnsPolicy: ClusterFirst
imagePullSecrets:
- name: qcloudregistrykey
restartPolicy: Always
volumes:
- configMap:
defaultMode: 420
name: config
name: vol
3. 测试访问集群
pod启动成功后,登录pod执行kubectl能查看到集群信息则说明访问成功。