首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能在pod内部ping ClusterIP,DNS不适用于google.com这样的外部域。

不能在pod内部ping ClusterIP,DNS不适用于google.com这样的外部域。
EN

Stack Overflow用户
提问于 2016-03-02 08:36:04
回答 5查看 19.3K关注 0票数 13

我在裸金属/Ubuntu上安装了Kubernetes。我在6b649d7f9f2b09ca8b0dd8c0d3e14dcb255432d1上提交git。我使用cd kubernetes/cluster; KUBERNETES_PROVIDER=ubuntu ./kube-up.shcd kubernetes/cluster/ubuntu; ./deployAddons.sh来启动集群。一切都进行得很顺利,群聚起来了。

我的/ubuntu/config-default.sh如下:

代码语言:javascript
运行
复制
# Define all your cluster nodes, MASTER node comes first"
# And separated with blank space like <user_1@ip_1> <user_2@ip_2> <user_3@ip_3> 
export nodes=${nodes:-"root@192.168.48.170 root@192.168.48.180"}

# Define all your nodes role: a(master) or i(minion) or ai(both master and minion), must be the order same 
role=${role:-"ai i"}
# If it practically impossible to set an array as an environment variable
# from a script, so assume variable is a string then convert it to an array
export roles=($role)

# Define minion numbers
export NUM_NODES=${NUM_NODES:-2}
# define the IP range used for service cluster IPs.
# according to rfc 1918 ref: https://tools.ietf.org/html/rfc1918 choose a private ip range here.
export SERVICE_CLUSTER_IP_RANGE=${SERVICE_CLUSTER_IP_RANGE:-192.168.3.0/24}  # formerly PORTAL_NET
# define the IP range used for flannel overlay network, should not conflict with above SERVICE_CLUSTER_IP_RANGE
export FLANNEL_NET=${FLANNEL_NET:-172.16.0.0/16}

# Optionally add other contents to the Flannel configuration JSON
# object normally stored in etcd as /coreos.com/network/config.  Use
# JSON syntax suitable for insertion into a JSON object constructor
# after other field name:value pairs.  For example:
# FLANNEL_OTHER_NET_CONFIG=', "SubnetMin": "172.16.10.0", "SubnetMax": "172.16.90.0"'

export FLANNEL_OTHER_NET_CONFIG
FLANNEL_OTHER_NET_CONFIG=''

# Admission Controllers to invoke prior to persisting objects in cluster
export ADMISSION_CONTROL=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota,SecurityContextDeny

# Path to the config file or directory of files of kubelet
export KUBELET_CONFIG=${KUBELET_CONFIG:-""}

# A port range to reserve for services with NodePort visibility
SERVICE_NODE_PORT_RANGE=${SERVICE_NODE_PORT_RANGE:-"30000-32767"}

# Optional: Enable node logging.
ENABLE_NODE_LOGGING=false
LOGGING_DESTINATION=${LOGGING_DESTINATION:-elasticsearch}

# Optional: When set to true, Elasticsearch and Kibana will be setup as part of the cluster bring up.
ENABLE_CLUSTER_LOGGING=false
ELASTICSEARCH_LOGGING_REPLICAS=${ELASTICSEARCH_LOGGING_REPLICAS:-1}

# Optional: When set to true, heapster, Influxdb and Grafana will be setup as part of the cluster bring up.
ENABLE_CLUSTER_MONITORING="${KUBE_ENABLE_CLUSTER_MONITORING:-true}"

# Extra options to set on the Docker command line.  This is useful for setting
# --insecure-registry for local registries.
DOCKER_OPTS=${DOCKER_OPTS:-""}

# Extra options to set on the kube-proxy command line.  This is useful
# for selecting the iptables proxy-mode, for example.
KUBE_PROXY_EXTRA_OPTS=${KUBE_PROXY_EXTRA_OPTS:-""}

# Optional: Install cluster DNS.
ENABLE_CLUSTER_DNS="${KUBE_ENABLE_CLUSTER_DNS:-true}"
# DNS_SERVER_IP must be a IP in SERVICE_CLUSTER_IP_RANGE
DNS_SERVER_IP=${DNS_SERVER_IP:-"192.168.3.10"}
DNS_DOMAIN=${DNS_DOMAIN:-"cluster.local"}
DNS_REPLICAS=${DNS_REPLICAS:-1}

# Optional: Install Kubernetes UI
ENABLE_CLUSTER_UI="${KUBE_ENABLE_CLUSTER_UI:-true}"

# Optional: Enable setting flags for kube-apiserver to turn on behavior in active-dev
RUNTIME_CONFIG="--basic-auth-file=password.csv"

# Optional: Add http or https proxy when download easy-rsa.
# Add envitonment variable separated with blank space like "http_proxy=http://10.x.x.x:8080 https_proxy=https://10.x.x.x:8443"
PROXY_SETTING=${PROXY_SETTING:-""}

DEBUG=${DEBUG:-"false"}

然后,我使用以下yml文件创建了一个pod:

代码语言:javascript
运行
复制
apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx
    ports:
    - containerPort: 80

和使用以下yml的服务:

代码语言:javascript
运行
复制
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 8000
    targetPort: 80
    protocol: TCP
  selector:
    app: nginx
  type: NodePort

然后,我使用docker exec -it [CONTAINER_ID] bash进入了已启动的集装箱码头。主要有两个问题:

  1. 我不能像google.com这样的外部域,但是我可以像8.8.8.8这样的外部I。所以这个容器可以上网。
  2. 内部服务解决了纠正内部集群IP的问题,但我不能在容器中打开该IP。

主机的/etc/resolve.conf文件如下:

代码语言:javascript
运行
复制
nameserver 8.8.8.8
nameserver 127.0.1.1

容器的/etc/resolve.conf文件如下:

代码语言:javascript
运行
复制
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 192.168.3.10
nameserver 8.8.8.8
nameserver 127.0.1.1
options ndots:5

关于第一个问题,我认为它可能与SkyDNS名称服务器错误配置有关,也可能与我必须做的定制配置有关,但我不知道。

但是,我不知道为什么容器不能平分集群I。

有什么解决办法吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-25 18:32:50

我找到了解决办法。命令行参数部分中的SkyDNS文档,特别是用于“命名服务器”参数的文档,意味着:

名称服务器:将DNS请求转发给这些(递归的)名称服务器(IP:端口组合数组),如果对域不具有权威性的话。这默认为/etc/surv.conf中列出的服务器。

但事实并非如此!为了解决这个问题,应该将dns addon复制控制器配置文件(集群/加载项/dns/skydns-rc.yaml.in)更改为包含名称服务器配置。我改变了天空容器部分如下,它的工作就像一个魅力。

代码语言:javascript
运行
复制
  - name: skydns
    image: gcr.io/google_containers/skydns:2015-10-13-8c72f8c
    resources:
      # keep request = limit to keep this container in guaranteed class
      limits:
        cpu: 100m
        memory: 50Mi
      requests:
        cpu: 100m
        memory: 50Mi
    args:
    # command = "/skydns"
    - -machines=http://127.0.0.1:4001
    - -addr=0.0.0.0:53
    - -nameservers=8.8.8.8:53
    - -ns-rotate=false
    - -domain={{ pillar['dns_domain'] }}.
    ports:
    - containerPort: 53
      name: dns
      protocol: UDP
    - containerPort: 53
      name: dns-tcp
      protocol: TCP
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        scheme: HTTP
      initialDelaySeconds: 30
      timeoutSeconds: 5
    readinessProbe:
      httpGet:
        path: /healthz
        port: 8080
        scheme: HTTP
      initialDelaySeconds: 1
      timeoutSeconds: 5
票数 0
EN

Stack Overflow用户

发布于 2016-09-27 06:11:54

我可以回答你的ping clusterIP问题。我遇到了同样的问题,想要从Pod中平分服务的集群IP。

解析似乎不能点击集群IP,但是端点可以使用带端口的curl访问。

我只是四处寻找有关ping虚拟IP的详细信息。

票数 12
EN

Stack Overflow用户

发布于 2018-12-06 15:13:26

处理DNS相同问题的另一种方法是在configMap中设置上游服务器:

代码语言:javascript
运行
复制
apiVersion: v1
    kind: ConfigMap
    metadata:
      name: kube-dns
      namespace: kube-system
    data:
        upstreamNameservers: |
        ["8.8.8.8", "8.8.4.4"]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35742070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档