前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用k8s的api获取服务endpoint信息

使用k8s的api获取服务endpoint信息

作者头像
code4it
发布2023-08-31 14:28:08
2110
发布2023-08-31 14:28:08
举报
文章被收录于专栏:码匠的流水账码匠的流水账

本文主要研究一下如何使用k8s的api来获取服务endpoint信息

mac m2安装k8s

安装multipass

访问https://multipass.run/install,下载安装

创建实例

代码语言:javascript
复制
multipass launch --name primary --cpus 2 --disk 20G --memory 4G

安装microk8s

代码语言:javascript
复制
sudo snap install microk8s --classic
sudo usermod -a -G microk8s $USER
sudo chown -f -R $USER ~/.kube
microk8s status --wait-ready

配置alias(~/.bash_aliases)

代码语言:javascript
复制
alias kubectl='microk8s kubectl'

查看是否ready

代码语言:javascript
复制
kubectl get node

不ready的话,大概率是pause镜像拉取不到,使用pullk8s来修正一下,稍微改动下

代码语言:javascript
复制
#!/bin/bash

check(){
  if [ "$1"x == "--microk8s"x ]
  then
    logs=`microk8s kubectl get pod --all-namespaces|tail -n +2|grep -v Running|while read line
    do
     declare -a arr=( $line )
     microk8s kubectl describe pod ${arr[1]} --namespace=${arr[0]}
    done|grep -i "image"|sed -nr 's/.*(failed to pull|Back-off pulling) image \"([^\"]+)\".*/\2/p'|uniq`
    echo ${logs}
  fi
}

pull(){
  image=$1
  imageName=${image/#registry\.k8s\.io\//}
  if [ "$image"x == "$imageName"x ]
  then
    imageName=${image/#gcr\.io\/google_containers\//}
  fi
  echo Pull $imageName ...
  if [ "$image"x == "$imageName"x ]
  then
    echo Pull $imageName ...
    docker pull $image
    exit 0
  fi
  hubimage=${imageName//\//\-}

  if [ -n ”$hubimage“ ]
  then
    echo Pull $imageName ...
    docker pull opsdockerimage/$hubimage
    docker tag opsdockerimage/$hubimage $1
    docker rmi opsdockerimage/$hubimage
    if [ "$2"x == "--microk8s"x ]
    then
      saveImage=${1#:}
      docker save $saveImage > ~/.docker_image.tmp.tar
      microk8s ctr image import ~/.docker_image.tmp.tar
      rm ~/.docker_image.tmp.tar
    fi
  fi
}

然后执行

代码语言:javascript
复制
pullk8s check --microk8s
pullk8s pull registry.k8s.io/pause:3.7 --microk8s
microk8s stop
microk8s start

示例

创建nginx

代码语言:javascript
复制
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=8000 --target-port=80 --name=ngsvc
kubectl scale deployment nginx --replicas=3

使用kubectl查看

代码语言:javascript
复制
kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes   ClusterIP   10.152.183.1    <none>        443/TCP    87m
ngsvc        ClusterIP   10.152.183.50   <none>        8000/TCP   3m44s

kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-77b4fdf86c-xbd6s   1/1     Running   0          18m
nginx-77b4fdf86c-g9gt5   1/1     Running   0          2m35s
nginx-77b4fdf86c-xq76f   1/1     Running   0          2m35s

kubectl get endpoints
NAME         ENDPOINTS                                         AGE
kubernetes   192.168.64.2:16443                                85m
ngsvc        10.1.226.133:80,10.1.226.134:80,10.1.226.135:80   64s

pod中使用api查看

代码语言:javascript
复制
kubectl get pods
kubectl exec -it nginx-77b4fdf86c-xbd6s sh


# 指向内部 API 服务器的主机名
APISERVER=https://kubernetes.default.svc

# 服务账号令牌的路径
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount

# 读取 Pod 的名字空间
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)

# 读取服务账号的持有者令牌
TOKEN=$(cat ${SERVICEACCOUNT}/token)

# 引用内部证书机构(CA)
CACERT=${SERVICEACCOUNT}/ca.crt

# 使用令牌访问 API
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api/v1/namespaces/default/endpoints/ngsvc

返回如下:

代码语言:javascript
复制

{
  "kind": "Endpoints",
  "apiVersion": "v1",
  "metadata": {
    "name": "ngsvc",
    "namespace": "default",
    "uid": "bccd1acd-a8e2-419f-925e-8ae324bf2e8b",
    "resourceVersion": "5344",
    "creationTimestamp": "2023-07-22T05:57:24Z",
    "labels": {
      "app": "nginx"
    },
    "annotations": {
      "endpoints.kubernetes.io/last-change-trigger-time": "2023-07-22T05:58:26Z"
    },
    "managedFields": [
      {
        "manager": "kubelite",
        "operation": "Update",
        "apiVersion": "v1",
        "time": "2023-07-22T05:58:26Z",
        "fieldsType": "FieldsV1",
        "fieldsV1": {
          "f:metadata": {
            "f:annotations": {
              ".": {},
              "f:endpoints.kubernetes.io/last-change-trigger-time": {}
            },
            "f:labels": {
              ".": {},
              "f:app": {}
            }
          },
          "f:subsets": {}
        }
      }
    ]
  },
  "subsets": [
    {
      "addresses": [
        {
          "ip": "10.1.226.133",
          "nodeName": "primary",
          "targetRef": {
            "kind": "Pod",
            "namespace": "default",
            "name": "nginx-77b4fdf86c-xbd6s",
            "uid": "ebc83b51-a438-40a8-b543-17a14d98a267"
          }
        },
        {
          "ip": "10.1.226.134",
          "nodeName": "primary",
          "targetRef": {
            "kind": "Pod",
            "namespace": "default",
            "name": "nginx-77b4fdf86c-g9gt5",
            "uid": "956cda5b-1724-49f3-9bc6-96c523c3c946"
          }
        },
        {
          "ip": "10.1.226.135",
          "nodeName": "primary",
          "targetRef": {
            "kind": "Pod",
            "namespace": "default",
            "name": "nginx-77b4fdf86c-xq76f",
            "uid": "731f4544-2ccc-46c0-aeb6-610bd2a4fdf8"
          }
        }
      ],
      "ports": [
        {
          "port": 80,
          "protocol": "TCP"
        }
      ]
    }
  ]
}

容器外访问

获取api地址

代码语言:javascript
复制
kubectl get endpoints kubernetes
NAME         ENDPOINTS            AGE
kubernetes   192.168.64.2:16443   108m

查看token

代码语言:javascript
复制
/var/snap/microk8s/current/credentials/known_tokens.csv

获取admin的token

访问

代码语言:javascript
复制
curl -k --header "Authorization: Bearer ${token}" -X GET https://192.168.64.2:16443/api/v1/namespaces/default/endpoints/ngsvc

将上一步获取的token替换${token}即可

小结

k8s的api提供了获取endpoint的接口,可以根据service来获取对应pod的列表

doc

  • 使用multipass在mac搭建linux开发环境
  • github.com/OpsDocker/pullk8s
  • 从 Pod 中访问 Kubernetes API
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-07-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码匠的流水账 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • mac m2安装k8s
    • 安装multipass
      • 创建实例
        • 安装microk8s
          • 配置alias(~/.bash_aliases)
          • 查看是否ready
      • 示例
        • 创建nginx
          • 使用kubectl查看
            • pod中使用api查看
              • 容器外访问
                • 获取api地址
                • 查看token
                • 访问
            • 小结
            • doc
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档