集群里那个固定的服务
每个集群都会在 default 命名空间创建名为 kubernetes 的 Service,它指向集群的 API Server。Pod 内部既可以通过这个服务名访问接口,也可以从环境变量里读到地址与端口。这个对象由集群自动维护,不是用户创建的,删除后系统会重新建立。
基本信息
| 对象位置 | default 命名空间的 kubernetes 服务 |
|---|---|
| 作用 | 把 API Server 暴露为集群内可访问的服务 |
| 注入内容 | 服务地址环境变量、凭据与集群证书文件 |
| 访问协议 | HTTPS,配合集群内部域名使用 |
| 权限依据 | Pod 所用服务账号绑定的角色 |
典型使用场景
- 应用需要在集群内读写其他资源,例如自制控制器与发布工具
- 在容器里快速确认当前集群的接口是否可达
- 排查应用报错无法连接接口:先确认域名解析与网络策略
- 验证服务账号权限:用同一身份调用接口观察返回状态码
- 编写自愈脚本或告警脚本时,从环境变量读取地址而不写死
查看与验证
查看与验证
kubectl get svc kubernetes -n default -o wide # 服务地址与端口
kubectl get endpoints kubernetes -n default # 后端地址是否正常
kubectl exec -it web-x -- env | grep KUBERNETES_SERVICE # 容器内注入的地址
exec -it web-x -- sh -c 'ls /var/run/secrets/kubernetes.io/serviceaccount/' # 凭据文件
kubectl exec -it web-x -- curl -sk https://kubernetes.default.svc/version # 实际调用Pod 内访问三要素
| 项目 | 位置 | 说明 |
|---|---|---|
| 服务地址 | 环境变量中的主机与端口 | 由节点代理注入,随服务变化 |
| 凭据与证书 | 服务账号挂载目录 | 应用用它完成身份认证 |
| 身份权限 | 服务账号绑定的角色 | 能否调用取决于授权结果 |
| 网络路径 | 集群网络与网络策略 | 出口被全拒时需要显式放行 |
应用应当通过服务名访问接口,而不是记录具体地址。地址由集群分配,集群重建或服务重建后可能变化,写死会造成难以定位的失效。
给容器绑定高权限的服务账号,意味着容器内的任何进程都能操作集群。只有确实需要调用接口的应用才应绑定相应权限。