Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >kubernetes学习记录(5)——服务发现机制与Cluster DNS的安装(无CA认证版)

kubernetes学习记录(5)——服务发现机制与Cluster DNS的安装(无CA认证版)

作者头像
胡了了
发布于 2017-12-28 09:22:43
发布于 2017-12-28 09:22:43
1.8K00
代码可运行
举报
运行总次数:0
代码可运行

服务发现机制

Kubernetes提供了两种发现Service的方法:

1.环境变量

当Pod运行的时候,Kubernetes会将之前存在的Service的信息通过环境变量写到Pod中。

这种方法要求Pod必须要在Service之后启动。

在Service之前启动的Pod就不会有该Service的环境变量。

采用DNS的方式就没有这个限制。

2.DNS

当有新的Service创建时,就会自动生成一条DNS记录。

使用这种方法,需要安装Cluster DNS。

Kubernetes1.2.7版本下Cluster DNS的安装

阅读github上官方源码发现: Cluster DNS自Kubernetes1.3版本开始,结构发生了变化。这里先以1.2.7版本作为研究。

1.2.7版本中,Cluster DNS主要包含如下几项: 1)SkyDNS 提供DNS解析服务。 2)Etcd 用于DNS的存储。 3)Kube2sky 监听Kubernetes,当有新的Service创建时,将其注册到etcd上。 4)healthz 提供对skydns服务的健康检查功能。

安装过程参考官方github文档。

在Master服务器上下载Kubernetes发布包

Cluster DNS在Kubernetes发布包的cluster/addons/dns目录下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum -y install wget
wget https://codeload.github.com/kubernetes/kubernetes/tar.gz/v1.2.7
tar zxvf v1.2.7
cd kubernetes-1.2.7/cluster/addons/dns

需要注意,skydns服务使用的clusterIP需要我们指定一个固定的IP地址,每个Node的kubelet进程都将使用这个IP地址,不能通过Kuberneters自动给skydns分配。

通过环境变量,配置参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
export DNS_SERVER_IP="10.254.10.2"
export DNS_DOMAIN="cluster.local"
export DNS_REPLICAS=1

设置 Cluster DNS Service的IP为 10.254.10.2(不能和已分配的IP重复),Cluster DNS的本地域为 cluster.local。

修改每台Node上的kubelet启动参数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim /etc/kubernetes/kubelet

在KUBELET_ARGS里增加:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--cluster_dns=10.254.10.2 
--cluster_domain=cluster.local

cluster_dns为DNS服务的ClusterIP地址 cluster_domain为DNS服务中设置的域名

重启kubelet服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
systemctl restart kubelet

生成dns-rc.yaml和dns-svc.yaml

kubernetes-1.2.7/cluster/addons/dns目录下。

skydns-rc.yaml.in和skydns-svc.yaml.in是两个模板文件,通过设置的环境变量修改其中的相应属性值,可以生成Replication Controller和Service的定义文件。

生成Replication Controller的定义文件dns-rc.yaml创建RC

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sed -e "s/{{ pillar\['dns_replicas'\] }}/${DNS_REPLICAS}/g;s/{{ pillar\['dns_domain'\] }}/${DNS_DOMAIN}/g" \skydns-rc.yaml.in > dns-rc.yaml

需要注意kube2sky需要ServiceAccount来调用Kubernetes API。 而ServiceAccount的使用需要对Kubernetes集群进行安全认证,否则可能会导致RC无法自动创建Pod等错误

这里有两种解决办法:

(1)选择禁用ServiceAccount。编辑/etc/kubernetes/apiserver。 去除 KUBE_ADMISSION_CONTROL中的SecurityContextDeny,ServiceAccount,并重启kube-apiserver.service服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#vim /etc/kubernetes/apiserver
KUBE_ADMISSION_CONTROL="--admission_control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"
#systemctl restart kube-apiserver.service

而关闭ServiceAccount,需要在kube2sky显示指定Kubernetes API的URL (2)对集群进行安全认证,参考kubernetes学习记录(9)——集群基于CA签名的安全设置 ,不需要对kube2sky显示指定Kubernetes API的URL

修改生成的dns-rc.yaml,设置Kube2sky的启动参数如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
args:
  - --domain=cluster.local
  #如果已经进行CA认证,则可以不指定kube_master_url
  - --kube-master-url=http://192.168.121.143:8080

这里特别注意: 在设置Kube2sky的启动参数时 《Kubernetes实战》和某些技术博客中 将“- –domain”和“- –kube-master-url”错误地写成了“- -domain”和“ - -kube-master-url”,均少了一个“-” 导致,Kube2sky的pod在启动过程中,报CrashLoopBackOff的错误。

建议将dns-rc.yaml里镜像的下载地址gcr.io改成index.tenxcloud.com,能够加速下载。

最终的dns-rc.yaml如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: ReplicationController
metadata:
  name: kube-dns-v11
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    version: v11
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 1
  selector:
    k8s-app: kube-dns
    version: v11
  template:
    metadata:
      labels:
        k8s-app: kube-dns
        version: v11
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
      - name: etcd
        image: index.tenxcloud.com/google_containers/etcd-amd64:2.2.1
        resources:
          # TODO: Set memory limits when we've profiled the container for large
          # clusters, then set request = limit to keep this container in
          # guaranteed class. Currently, this container falls into the
          # "burstable" category so the kubelet doesn't backoff from restarting it.
          limits:
            cpu: 100m
            memory: 500Mi
          requests:
            cpu: 100m
            memory: 50Mi
        command:
        - /usr/local/bin/etcd
        - -data-dir
        - /var/etcd/data
        - -listen-client-urls
        - http://127.0.0.1:2379,http://127.0.0.1:4001
        - -advertise-client-urls
        - http://127.0.0.1:2379,http://127.0.0.1:4001
        - -initial-cluster-token
        - skydns-etcd
        volumeMounts:
        - name: etcd-storage
          mountPath: /var/etcd/data
      - name: kube2sky
        image: index.tenxcloud.com/google_containers/kube2sky:1.14
        resources:
          # TODO: Set memory limits when we've profiled the container for large
          # clusters, then set request = limit to keep this container in
          # guaranteed class. Currently, this container falls into the
          # "burstable" category so the kubelet doesn't backoff from restarting it.
          limits:
            cpu: 100m
            # Kube2sky watches all pods.
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 50Mi
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
        readinessProbe:
          httpGet:
            path: /readiness
            port: 8081
            scheme: HTTP
          # we poll on pod startup for the Kubernetes master service and
          # only setup the /readiness HTTP server once that's available.
          initialDelaySeconds: 30
          timeoutSeconds: 5
        args:
        # command = "/kube2sky"
        #特别注意
        #- -domain=cluster.local是错误的写法
        #- -kube-master-url=http://192.168.121.143:8080是错误的设置
        #会导致CrashLoopBackOff的错误
        #如果已经进行CA认证,则可以不指定kube-master-url
        - --domain=cluster.local
        - --kube-master-url=http://192.168.121.143:8080
      - name: skydns
        image: index.tenxcloud.com/google_containers/skydns:2015-10-13-8c72f8c
        resources:
          # TODO: Set memory limits when we've profiled the container for large
          # clusters, then set request = limit to keep this container in
          # guaranteed class. Currently, this container falls into the
          # "burstable" category so the kubelet doesn't backoff from restarting it.
          limits:
            cpu: 100m
            memory: 200Mi
          requests:
            cpu: 100m
            memory: 50Mi
        args:
        # command = "/skydns"
        - -machines=http://127.0.0.1:4001
        - -addr=0.0.0.0:53
        - -ns-rotate=false
        - -domain=cluster.local.
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
      - name: healthz
        image: index.tenxcloud.com/google_containers/exechealthz:1.0
        resources:
          # keep request = limit to keep this container in guaranteed class
          limits:
            cpu: 10m
            memory: 20Mi
          requests:
            cpu: 10m
            memory: 20Mi
        args:
        - -cmd=nslookup kubernetes.default.svc.cluster.local 127.0.0.1 >/dev/null
        - -port=8080
        ports:
        - containerPort: 8080
          protocol: TCP
      volumes:
      - name: etcd-storage
        emptyDir: {}
      dnsPolicy: Default  # Don't use cluster DNS.

通过定义文件dns-rc.yaml创建Cluster DNS Replication Controller

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl create -f dns-rc.yaml

验证Cluster DNS Pod是否创建运行成功:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl get pod --namespace=kube-system -o wide

生成Service的定义文件dns-svc.yaml创建Service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sed -e "s/{{ pillar\['dns_server'\] }}/${DNS_SERVER_IP}/g" \skydns-svc.yaml.in > dns-svc.yaml
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "KubeDNS"
spec:
  selector:
    k8s-app: kube-dns
  clusterIP: 10.254.10.2
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

根据dns-svc.yaml创建Cluster DNS Service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl create -f dns-svc.yaml

查询验证Cluster DNS Service

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl get svc --namespace=kube-system -o wide

创建Pod验证Cluster DNS

使用一个带有nslookup的工具来验证DNS是否能够正常工作: busybox.yaml

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: index.tenxcloud.com/google_containers/busybox
    command:
      - sleep
      - "3600"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#kubectl create -f busybox.yaml
#kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local

发现报错

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Error from server: error dialing backend: dial tcp 192.168.121.144:10250: getsockopt: connection refused

调试解决该问题的过程: 1)在192.168.121.144上执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ip addr

发现没有flanneld网桥。 《kubernetes学习记录(4)——创建kubernetes覆盖网络》忘记设置flanneld开机自启了,博客中已修改。 重启flanneld网桥,仍报错。 (所以这里flanneld是否需要开机自启还不确定) 2)在Master上执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#curl 192.168.121.144:10250
curl: (7) Failed connect to 192.168.121.144:10250; Connection refused

端口无法连接。 10250是kubelet的端口。 在Node上检查/etc/kubernetes/kubelet。 经过多方对比和测试发现。 KUBELET_ADDRESS需要修改为node ip。 最终的/etc/kubernetes/kubelet内容(未经过CA验证版)如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
KUBELET_ADDRESS="--address=192.168.121.145"
# The port for the info server to serve on
# KUBELET_PORT="--port=10250"
# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override=192.168.121.145"
# location of the api-server
KUBELET_API_SERVER="--api-servers=http://192.168.121.143:8080"
# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
# Add your own!
KUBELET_ARGS="--cluster_dns=10.254.10.2 --cluster_domain=cluster.local"

重启kubelet。 最后重新执行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubectl exec busybox -- nslookup kubernetes.default.svc.cluster.local

总结

网上的各种安装教程和配置教程多多少少都存在一些问题,不能完全相信书籍和教程,我的博客里估计也有很多的坑。慢慢学习中。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
附011.Kubernetes-DNS及搭建
作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,因此需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析。
木二
2019/12/10
8790
附011.Kubernetes-DNS及搭建
Kubernetes-kube-dns 和服务发现
kubernetes 提供了 service 的概念可以通过 VIP 访问 pod 提供的服务,但是在使用的时候还有一个问题:怎么知道某个应用的 VIP?比如我们有两个应用,一个 app,一个 是 db,每个应用使用 rc 进行管理,并通过 service 暴露出端口提供服务。app 需要连接到 db 应用,我们只知道 db 应用的名称,但是并不知道它的 VIP 地址。
菲宇
2019/06/12
1.1K0
Kubernetes-kube-dns 和服务发现
SkyDNS
k8s最基础的调度单位是pod;当一个pod异常退出的时候会重新创建另一个pod,但是这个时候pod的ip就改变了,所以我们不能直接使用pod-ip来访问其他的pod。
丁D
2022/08/17
8280
SkyDNS
Kubernetes集群配置DNS服务
本文将在前文的基础上介绍在kubernetes集群环境中配置dns服务,在k8s集群中,pod的生命周期是短暂的,pod重启后ip地址会产生变化,对于应用程序来说这是不可接受的,为解决这个问题,K8S集群巧妙的引入的dns服务来实现服务的发现,在k8s集群中dns总共需要使用4个组件,各组件分工如下: etcd:DNS存储 kube2sky:将Kubernetes Master中的service(服务)注册到etcd。 skyDNS:提供DNS域名解析服务。 healthz:提供对skydns服务的健康检查。
星哥玩云
2022/07/13
1.4K0
Kubernetes集群配置DNS服务
k8s之DNS服务器搭建
在使用k8s部署springboot+redis简单应用这篇文章中,spring boot连接redis是直接使用的IP连接,那么可不可以直接使用服务名称进行连接呢?答案是可以的,这就是k8s集群范围内的DNS服务来完成服务名到ClusterIP的解析,接下来就一起看一下如何搭建DNS服务器。
Liusy
2020/11/03
6670
K8s集群部署篇–Kube-DNS(三)
1、部署Cluster DNS 1.1 原理:(看看吧,摘抄网上的↓) 通过前面对Kubernetes的讨论(Kubernetes核心概念总结).我们已经知道,每个Kubernetes service都绑定了一个虚拟IP 地址(ClusterIP),而且Kubernetes最初使用向pod中注入环境变量的方式实现服务发现,但这会带来环境变量泛滥等问题。故需要增加集群DNS服务为每个service映射一个域名。到Kubernetes v1.2版本时,DNS作为一个系统可选插件集成到Kubernetes集群中。
老七Linux
2018/05/31
2.3K0
Kubernetes(k8s)安装dns附件组件以及使用
答:Kubernetes中有一个很重要的特性,服务子发现。一旦一个service被创建,该service的service ip和service port等信息都可以被注入到pod中供它们使用。kubernetes主要支持两种service发现机制,第一种是环境变量,第二种是DNS。没有dns服务的时候,kubernetes会采用环境变量的形式,一个有很多service,环境变量会变得很复杂,为了解决这个问题,我们使用DNS服务。
别先生
2020/06/23
1.3K0
Kubernetes(k8s)安装dns附件组件以及使用
kubernetes学习记录(6)——Guestbook Demo
胡了了
2017/12/28
1.2K0
kubernetes学习记录(6)——Guestbook Demo
k8s集群之kubernetes-dashboard和kube-dns组件部署安装
k8s集群之kubernetes-dashboard和kube-dns组件部署安装
三杯水Plus
2018/11/14
1.7K0
基于Kubernetes集群部署skyDNS服务
在之前几篇文章的基础,(Centos7部署Kubernetes集群、基于kubernetes集群部署DashBoard、为Kubernetes集群部署本地镜像仓库),本文继续搭建Kubernete中的服务注册发现机制——SkyDNS.
用户1263954
2019/05/24
8940
Kubernetes DNS Service技术研究
本文主要是对kubernetes 1.2和1.3的DNS Service的内部实现分别进行研究,得出其内部实现框架和交互逻辑,并对它们的实现进行了比较。 Kubernetes 1.2 DNS Serv
Walton
2018/04/13
1.1K0
Kubernetes DNS Service技术研究
09-部署配置kubedns插件
安装和配置 kubedns 插件 官方的yaml文件在:kubernetes/cluster/addons/dns。 该插件直接使用kubernetes部署,官方的配置文件中包含以下镜像: gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.1 gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.1 gcr.io/google_containers/k8s-dns-sidecar-amd64
程序员同行者
2018/07/03
8100
第9课 Kubernetes之服务发现和域名解析过程分析
作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,这就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析。
辉哥
2021/11/24
1.9K0
第9课 Kubernetes之服务发现和域名解析过程分析
Kubernetes集群常见操作完整指南
云云众生s
2024/03/28
3190
中秋之 Kubernetes 网络入门
Service 是 k8s 网络部分的核心概念,在 k8s 中,Service 主要担任了四层负载均衡的职责。本文从负载均衡、外网访问、DNS 服务的搭建及 Ingress 七层路由机制等方面,讲解 k8s 的网络相关原理。
CS实验室
2021/03/22
8090
中秋之 Kubernetes 网络入门
使用 NodeLocal DNSCache 提升 DNS 性能和可靠性
之前在解决 CoreDNS 的5秒超时问题的时候,除了通过 dnsConfig 去强制使用 tcp 方式解析之外,我们提到过使用 NodeLocalDNSCache 来解决这个问题。NodeLocalDNSCache 通过在集群节点上运行一个 DaemonSet 来提高 clusterDNS 性能和可靠性。处于 ClusterFirst 的 DNS 模式下的 Pod 可以连接到 kube-dns 的 serviceIP 进行 DNS 查询。通过 kube-proxy 组件添加的 iptables 规则将其转换为 CoreDNS 端点。通过在每个集群节点上运行 DNS 缓存,NodeLocal DNSCache 可以缩短 DNS 查找的延迟时间、使 DNS 查找时间更加一致,以及减少发送到 kube-dns 的 DNS 查询次数。
我是阳明
2020/06/15
2.6K3
k8s实践(11) --服务发现CoreDNS和Kubernetes内部域名解析
从Kubernetes 1.11开始,可使用CoreDNS作为Kubernetes的DNS插件进入GA状态,Kubernetes推荐使用CoreDNS作为集群内的DNS服务。 我们先看一下Kubernetes DNS服务的发展历程。
黄规速
2022/04/14
4.3K0
k8s实践(11) --服务发现CoreDNS和Kubernetes内部域名解析
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
K8s基础原理 k8s中文社区:https://www.kubernetes.org.cn/ 简介 Kubernetes与较早的集群管理系统Mesos和YARN相比,对容器尤其是 Docker的支持更加原生,同时提供了更强大的机制实现资源调度,自动 管理容器生命周期,负载均衡,高可用等底层功能,使开发者可以专注于开发应用。 Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用
863987322
2018/03/29
5.1K0
Docker集群编排工具之Kubernetes(K8s)介绍、安装及使用
Centos7使用yum方式部署Kubernetes1.5集群
yum安装的etcd默认配置文件在/etc/etcd/etcd.conf。编辑配置文件,更改以下带颜色部分信息:
菲宇
2019/06/12
7500
Centos7使用yum方式部署Kubernetes1.5集群
docker+k8s+flannel+ansible
192.168.144.128 安装有ansible用来管理节点 注意:由于两个master没有做haproxy和keeplive所以在kubeconfig中server目前直接写成 192.168.144.128 注意:目录有的要手动创建 看看roles对应 网盘文件:k8s+ansible笔记 roles编写参考:https://github.com/easzlab/kubeasz
丁D
2022/08/12
3490
相关推荐
附011.Kubernetes-DNS及搭建
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验