网络知识 娱乐 tke在pod内通过kubectl访问集群

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能查看到集群信息则说明访问成功。