自主搭建DNS后验证部署失败

  • Choerodon平台版本: 0.6.0

  • 遇到问题的执行步骤: 验证部署

  • 文档地址:
    http://choerodon.io/zh/docs/installation-configuration/steps/dns/#自主搭建dns

  • 环境信息(如:节点信息):
    [root@node1 ~]# kubectl get nodes
    NAME STATUS ROLES AGE VERSION
    node1 Ready master 6d v1.8.5

  • 报错日志:
    [root@node1 ~]# kubectl exec -n choerodon-devops-prod $(kubectl get po -n choerodon-devops-prod -l example.choerodon.io/infra=dnsmasq -o jsonpath="{.items[0].metadata.name}") host example.choerodon.io
    error: error executing jsonpath “{.items[0].metadata.name}”: array index out of bounds: index 0, length 0
    Error from server (NotFound): pods “Error” not found

独立抽取子语句执行后:
[root@node1 ~]# kubectl get po -n choerodon-devops-prod -l example.choerodon.io/infra=dnsmasq -o jsonpath="{.items[0].metadata.name}"
Error executing template: array index out of bounds: index 0, length 0. Printing more information for debugging the template:
template was:
{.items[0].metadata.name}
object given to jsonpath engine was:
map[string]interface {}{“kind”:“List”, “apiVersion”:“v1”, “metadata”:map[string]interface {}{“selfLink”:"", “resourceVersion”:""}, “items”:[]interface {}{}}

error: error executing jsonpath “{.items[0].metadata.name}”: array index out of bounds: index 0, length 0

  • 疑问:

    好像kube-dns.cm.yml里面的域名没有注册成功? 但是验证之前的全部语句都是执行成功的,没有报错。

亲,若你设置的域名为example.choerodon.io 那么检查命令为:

kubectl exec -n choerodon-devops-prod $(kubectl get po -n choerodon-devops-prod -l choerodon.io/infra=dnsmasq -o jsonpath="{.items[0].metadata.name}") host example.choerodon.io

试过这个命令了,因为报这个,才把前面那个域名换成example.choerodon.io试一试
[root@node1 ~]# kubectl exec -n choerodon-devops-prod $(kubectl get po -n choerodon-devops-prod -l choerodon.io/infra=dnsmasq -o jsonpath="{.items[0].metadata.name}") host example.choerodon.io
;; connection timed out; no servers could be reached
command terminated with exit code 1

请执行一下以下命令,提供一下返回结果

kubectl get cm dnsmasq-cm -n choerodon-devops-prod -o yaml

[root@node1 /]# kubectl get cm dnsmasq-cm -n choerodon-devops-prod -o yaml

apiVersion: v1
data:
  dnsmasq.conf: |
    #dnsmasq config, for a complete example, see:
    #  http://oss.segetech.com/intra/srv/dnsmasq.conf
    #log all dns queries
    log-queries
    #dont use hosts nameservers
    no-resolv
    #use 114 as default nameservers
    server=114.114.114.114
    #explicitly define host-ip mappings
    address=/example.choerodon.io/172.16.27.141
kind: ConfigMap
metadata:
  creationTimestamp: 2018-08-30T08:44:38Z
  name: dnsmasq-cm
  namespace: choerodon-devops-prod
  resourceVersion: "103043"
  selfLink: /api/v1/namespaces/choerodon-devops-prod/configmaps/dnsmasq-cm
  uid: ee04b3aa-ac30-11e8-99f7-005056bf6ceb

再执行下这个

kubectl get  svc dnsmasq -n choerodon-devops-prod -o yaml

[root@node1 /]# kubectl get svc dnsmasq -n choerodon-devops-prod -o yaml

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: 2018-08-30T08:44:38Z
  labels:
    choerodon.io/infra: dnsmasq
    choerodon.io/release: dnsmasq
  name: dnsmasq
  namespace: choerodon-devops-prod
  resourceVersion: "103046"
  selfLink: /api/v1/namespaces/choerodon-devops-prod/services/dnsmasq
  uid: ee05646f-ac30-11e8-99f7-005056bf6ceb
spec:
  clusterIP: 10.233.13.175
  externalIPs:
  - 172.16.27.141
  ports:
  - name: http
    port: 18080
    protocol: TCP
    targetPort: http
  - name: dnsmasq
    port: 53
    protocol: UDP
    targetPort: dnsmasq
  selector:
    choerodon.io/infra: dnsmasq
    choerodon.io/release: dnsmasq
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

查看上述结果一切正常,再看看这个配置文件

kubectl get cm kube-dns -n kube-system -o yaml

[root@node1 /]# kubectl get cm kube-dns -n kube-system -o yaml

apiVersion: v1
data:
  stubDomains: "{\"example.choerodon.io\": [\"172.16.24.141\"]} \n"
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"stubDomains":"{\"example.choerodon.io\": [\"172.16.24.141\"]} \n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"kube-dns","namespace":"kube-system"}}
  creationTimestamp: 2018-08-30T08:48:14Z
  name: kube-dns
  namespace: kube-system
  resourceVersion: "103340"
  selfLink: /api/v1/namespaces/kube-system/configmaps/kube-dns
  uid: 6e8cff93-ac31-11e8-99f7-005056bf6ceb

正确结果应该为:

apiVersion: v1
data:
  stubDomains: |
    {"example.choerodon.io": ["172.16.24.141"]}
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"stubDomains":"{\"example.choerodon.io\": [\"172.16.24.141\"]} \n"},"kind":"ConfigMap","metadata":{"annotations":{},"name":"kube-dns","namespace":"kube-system"}}
  creationTimestamp: 2018-08-30T08:48:14Z
  name: kube-dns
  namespace: kube-system
  resourceVersion: "103340"
  selfLink: /api/v1/namespaces/kube-system/configmaps/kube-dns
  uid: 6e8cff93-ac31-11e8-99f7-005056bf6ceb

请执行以下命令修改正确

kubectl edit cm kube-dns -n kube-system

我看了下,好像除了转义符之外,没啥区别?

就是不能要转移符啊

编辑后保存不行:
A copy of your changes has been stored to “/tmp/kubectl-edit-0133o.yaml”
error: Edit cancelled, no valid changes were saved.

运行你的命令后就是编辑临时文件,有其他方法吗?

那就先删除这个cm

kubectl delete cm kube-dns -n kube-system

然后再按照官网文档创建这个cm,然后重启kube-dns就好哈

我删除了重做一遍,那个文件还是有转义符。我的kube-dns.cm.yml文件是跟你们教程的一模一样的,就改了IP地址。

你好,请使用这个哈,注意内容最后不能有空格哈,官网的多了一个空格,我们将尽快修复,给你带来不便,敬请谅解。

apiVersion: v1
kind: ConfigMap
metadata:
  name: kube-dns
  namespace: kube-system
data:
  stubDomains: |
    {"example.choerodon.io": ["192.168.1.1"]}

错误如下:

[root@node1 ~]# kubectl get cm kube-dns -n kube-system -o yaml
apiVersion: v1
data:
stubDomains: |
{“example.choerodon.io”: [“172.16.24.141”]}
kind: ConfigMap
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{“apiVersion”:“v1”,“data”:{“stubDomains”:"{“example.choerodon.io”: [“172.16.24.141”]}\n"},“kind”:“ConfigMap”,“metadata”:{“annotations”:{},“name”:“kube-dns”,“namespace”:“kube-system”}}
creationTimestamp: 2018-09-06T01:16:28Z
name: kube-dns
namespace: kube-system
resourceVersion: “816662”
selfLink: /api/v1/namespaces/kube-system/configmaps/kube-dns
uid: 7ae649b6-b172-11e8-99f7-005056bf6ceb

删除了空格之后是没有了转义符,但是下面那个还是有转义符。 用kubectl exec -n choerodon-devops-prod $(kubectl get po -n choerodon-devops-prod -l choerodon.io/infra=dnsmasq -o jsonpath="{.items[0].metadata.name}") host example.choerodon.io 命令会报错:

[root@node1 ~]# kubectl exec -n choerodon-devops-prod $(kubectl get po -n choerodon-devops-prod -l choerodon.io/infra=dnsmasq -o jsonpath="{.items[0].metadata.name}") host example.choerodon.io
;; connection timed out; no servers could be reached
command terminated with exit code 1

下面那个还是有转义符是正常的

请问修改了这个configmap之后你重启kube-dns了吗?需要重启kube-dns之后再执行验证命令

修改文件后,执行顺序如下:
kubectl apply -f kube-dns.cm.yml
kubectl scale deployment kube-dns -n kube-system --replicas=0
kubectl scale deployment kube-dns -n kube-system --replicas=1
kubectl exec -n choerodon-devops-prod $(kubectl get po -n choerodon-devops-prod -l choerodon.io/infra=dnsmasq -o jsonpath="{.items[0].metadata.name}") host example.choerodon.io

重做了一遍,还是一样的问题,能支持一下吗?