OpenShift Pod中定位APIServer的推荐方式及DNS缺失问题咨询
kubernetes DNS名称的问题解答 你的理解其实没偏差——标准Kubernetes确实默认会在集群中创建kubernetes这个ClusterIP Service,对应的DNS名称kubernetes.default.svc.cluster.local能在所有Pod中解析。但OpenShift 3.7这个版本有个特殊点:它仅在default命名空间中保留kubernetes Service,而在用户创建的其他项目(命名空间)里,默认不会自动创建这个Service,这就是你在Pod终端里找不到该DNS记录的原因。
下面是几个OpenShift 3.7中定位API Server的标准替代方式:
使用OpenShift专属的
openshiftService DNS
OpenShift 3.x默认会在每个项目中创建名为openshift的ClusterIP Service,它直接路由到OpenShift的API Server。同项目内的Pod可以直接用简化域名openshift访问,跨项目的话则用完整域名openshift.default.svc.cluster.local。比如在Pod里执行curl -k https://openshift:443就能测试API连通性(-k是忽略证书验证,生产环境建议挂载集群信任证书)。利用自动注入的环境变量
OpenShift会给每个启动的Pod自动注入API Server相关的环境变量:KUBERNETES_SERVICE_HOST:API Server的集群IPKUBERNETES_SERVICE_PORT:API Server的端口(默认443)
你可以直接拼接这两个变量来构建API地址,比如在Pod里执行curl -k https://${KUBERNETES_SERVICE_HOST}:${KUBERNETES_SERVICE_PORT},这个方式不依赖DNS,稳定性更高。
直接使用API Server的完整内部域名
即使你的项目里没有kubernetesService,集群DNS通常仍能解析kubernetes.default.svc.cluster.local这个完整域名到API Server的ClusterIP。你可以先在Pod里用nslookup kubernetes.default.svc.cluster.local验证解析是否正常,确认后直接用这个域名访问即可。
如果出于特殊需求,一定要在自己的项目里创建kubernetes Service,也可以手动编写YAML创建,但不推荐这种方式(可能和集群默认配置冲突):
apiVersion: v1 kind: Service metadata: name: kubernetes namespace: <你的项目名称> spec: type: ClusterIP clusterIP: 172.30.0.1 # 此为OpenShift 3.x默认的Kubernetes API ClusterIP,需根据你的集群实际值调整 ports: - port: 443 targetPort: 8443
内容的提问来源于stack exchange,提问作者csp713

