Kubernetes addons 之 coredns部署

2019.06.04 18:04:35字数 1045阅读 121

DNS 是 Kubernetes 的核心功能之一,通过 kube-dns 或 CoreDNS 作为集群的必备扩展来提供命名服务。

Kubernetes基于DNS的服务发现

在Kubernetes集群推荐使用Service Name作为服务的访问地址,因此需要一个Kubernetes集群范围的DNS服务实现从Service Name到Cluster Ip的解析,这就是Kubernetes基于DNS的服务发现功能。

Kubernetes DNS服务发展史

 
Kubernetes DNS服务发展史

从Kubernetes 1.11开始,可使用CoreDNS作为Kubernetes的DNS插件进入GA状态,Kubernetes推荐使用CoreDNS作为集群内的DNS服务。 CoreDNS从2017年初就成为了CNCF的的孵化项目,CoreDNS的特点就是十分灵活和可扩展的插件机制,各种插件实现不同的功能,如重定向、定制DNS记录、记录日志等等。下图描述了CoreDNS的整体架构:

 
coredns

DNS 格式

Service
A records
  • 普通(不是headless)service被分配了一个名为my-svc.my-namespace.svc.cluster.local形式的DNS A记录。 这解析为服务的群集IP。
  • Headless(without a cluster IP) Service 也为DNS A records绑定了一个my-svc.my-namespace.svc.cluster.local形式记录。 与普通service不同,这将解析为服务选择的pod的IP集合。 当客户端访问时,会轮询访问该IP集合
SRV records

SRV 记录的创建是根据普通(或 Headless Service )ports 名称创建的,对于每个端口的命名,SRV记录的格式为_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local..对于普通的service,my-svc.my-namespace.svc.cluster.local将解析为端口号和域名,对于
headless service,将解析成多条记录,对于service引用的每一个pod,auto-generated-name.my-svc.my-namespace.svc.cluster.local将解析成包含端口号和域名的记录
更多内容请参考 kubernetes dns 规范
)

CoreDNS ConfigMap选项

在Kubernetes中,我们安装的CoreDNS使用了以下默认的Corefile配置。

apiVersion: v1
kind: ConfigMap
metadata:
name: coredns
namespace: kube-system
labels:
addonmanager.kubernetes.io/mode: EnsureExists
data:
Corefile: |
.:53 {
errors
health
kubernetes cluster.local. in-addr.arpa ip6.arpa {
pods insecure
upstream
fallthrough in-addr.arpa ip6.arpa
}
prometheus :9153
proxy . /etc/resolv.conf
cache 30
loop
reload
loadbalance
}

Upstream 用于解析指向外部主机的服务(外部服务)。

  • prometheus:CoreDNS的度量标准可以在http//localhost:9153/Prometheus格式的指标中找到。
  • proxy:任何不在Kubernetes集群域内的查询都将转发到预定义的解析器(/etc/resolv.conf)。
  • cache:这将启用前端缓存。
  • loop:检测简单的转发循环,如果找到循环则停止CoreDNS进程。
  • reload:允许自动重新加载已更改的Corefile。编辑ConfigMap配置后,请等待两分钟以使更改生效。
  • loadbalance:这是一个循环DNS负载均衡器,可以在答案中随机化A,AAAA和MX记录的顺序。

Kubernetes配置使用CoreDNS

  1. 进入源码包,我们在部署Dashboard的时候已经解压缩了kubernetes-src.tar.gz,进入 kubernetes/cluster/addons/dns/coredns目录
[root@k8s coredns]# ls
coredns.yaml.base coredns.yaml.in coredns.yaml.sed Makefile transforms2salt.sed transforms2sed.sed
#查看transforms2sed.sed的内容:
[root@k8s coredns]# cat transforms2sed.sed
s/__PILLAR__DNS__SERVER__/$DNS_SERVER_IP/g
s/__PILLAR__DNS__DOMAIN__/$DNS_DOMAIN/g
s/__PILLAR__CLUSTER_CIDR__/$SERVICE_CLUSTER_IP_RANGE/g
s/__MACHINE_GENERATED_WARNING__/Warning: This is a file generated from the base underscore template file: __SOURCE_FILENAME__/g
  1. $DNS_SERVER_IP$DNS_DOMAIN替换成kubelet配置的内容。
[root@k8s cfg]# cat kubelet.config
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
address: 10.0.52.14
port: 10250
readOnlyPort: 10255
cgroupDriver: cgroupfs
clusterDNS:
- "10.0.0.2"
clusterDomain: cluster.local.
failSwapOn: false
authentication:
anonymous:
enabled: true

这里将$DNS_SERVER_IP替换成10.0.0.2,将$DNS_DOMAIN替换成cluster.local.

  1. 执行下面的命令,生成部署coreDNS所需的coredns.yaml文件:
sed -f transforms2sed.sed coredns.yaml.base > coredns.yaml
  1. 替换镜像,将k8s.gcr.io/coredns:1.2.6替换成coredns/coredns:1.2.6

     
    coredns.yaml
  2. 部署dns
kubectl apply -f coredns.yaml
#查看coredns的Pod,确认所有Pod都处于Running状态:
[root@k8s coredns]# kubectl get pods -n kube-system -l k8s-app=kube-dns
NAME READY STATUS RESTARTS AGE
coredns-dc8bbbcf9-k28h8 1/1 Running 0 18s
  1. 测试DNS
    6.1 部署nginx,部署文件如下:
[root@k8s ~]# cat nginx.yaml
apiVersion: apps/v1beta2
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.10
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
labels:
run: nginx
name: nginx
namespace: default
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx [root@k8s ~]# kubectl create -f nginx.yaml
deployment.apps/nginx-deployment created
service/nginx created
[root@k8s ~]# kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-7544fc9954-d274k 1/1 Running 0 18s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 3d2h
service/nginx NodePort 10.0.0.86 <none> 80:45498/TCP 18s

6.2 部署busybox,测试DNS功能

[root@k8s ~]# kubectl run -it --image=busybox:1.28.4 --rm --restart=Never sh
If you don't see a command prompt, try pressing enter.
/ # nslookup kubernetes
Server: 10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local Name: kubernetes
Address 1: 10.0.0.1 kubernetes.default.svc.cluster.local
/ # nslookup nginx
Server: 10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local Name: nginx
Address 1: 10.0.0.86 nginx.default.svc.cluster.local
/ # nslookup nginx.default.svc.cluster.local
Server: 10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local Name: nginx.default.svc.cluster.local
Address 1: 10.0.0.86 nginx.default.svc.cluster.local
/ # cat /etc/resolv.conf
nameserver 10.0.0.2
search default.svc.cluster.local. svc.cluster.local. cluster.local.
options ndots:5

DNS服务是Kubernetes赖以实现服务发现的核心组件之一,默认情况下只会创建一个DNS Pod,在生产环境中我们需要对coredns进行扩容。 有两种方式:

  • 手动扩容 kubectl scale deploy/coredns --replicas=<num_you_want> -n kube-system
[root@k8s ~]# kubectl scale deploy/coredns --replicas=2 -n kube-system
deployment.extensions/coredns scaled
[root@k8s ~]# kubectl get deploy -n kube-system
NAME READY UP-TO-DATE AVAILABLE AGE
coredns 2/2 2 2 13m
[root@k8s ~]#
  1. 查看dns规则

如图所示,nginx service的cluster IP:port为10.0.0.86:80,对应的pod的ip为:172.12.9.4,172.12.95.3,172.12.9.5

 
nginx组件

通过ipvsadm 命令查看,显示各个ip和端口的转发规则,如果所示10.0.0.86:80是通过rr(Round-Robin)默认调度算法来实现到172.12.9.4:80,172.12.95.3:80,172.12.9.5:80的pod中的转发和负载。

 

Kubernetes addons 之 coredns部署的更多相关文章

  1. K8S从入门到放弃系列-(12)Kubernetes集群Coredns部署

    摘要: 集群其他组件全部完成后我们应当部署集群 DNS 使 service 等能够正常解析,1.11版本coredns已经取代kube-dns成为集群默认dns. 1)下载yaml配置清单 [root ...

  2. linux运维、架构之路-Kubernetes离线集群部署-无坑

    一.部署环境介绍 1.服务器规划 系统 IP地址 主机名 CPU 内存 CentOS  7.5 192.168.56.11 k8s-node1 2C 2G CentOS  7.5 192.168.56 ...

  3. Kubernetes系列之Coredns and Dashboard介绍篇

    本次系列使用的所需部署包版本都使用的目前最新的或最新稳定版,安装包地址请到公众号内回复[K8s实战]获取 介绍 项目地址:https://github.com/coredns/coredns Core ...

  4. Kubernetes集群的部署方式及详细步骤

    一.部署环境架构以及方式 第一种部署方式 1.针对于master节点 将API Server.etcd.controller-manager.scheduler各组件进行yum install.编译安 ...

  5. Kubernetes V1.15 二进制部署集群

    1. 架构篇 1.1 kubernetes 架构说明              1.2 Flannel网络架构图 1.3 Kubernetes工作流程             2. 组件介绍 2.1 ...

  6. K8S CoreDNS部署失败,发现的一个问题

    K8S CoreDNS部署失败,查看错误日志,提示如下 root >> kubectl get all --all-namespaces -o wide root >> kub ...

  7. 基于Kubernetes在AWS上部署Kafka时遇到的一些问题

    作者:Jack47 转载请保留作者和原文出处 欢迎关注我的微信公众账号程序员杰克,两边的文章会同步,也可以添加我的RSS订阅源. 交代一下背景:我们的后台系统是一套使用Kafka消息队列的数据处理管线 ...

  8. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...

  9. kubernetes nginx ingress controller部署

    Kubernetes nginx ingress controller部署 1.下载kubernetes nginx的yaml文件 Wget https://raw.githubusercontent ...

随机推荐

  1. obj + mtl 格式说明

    OBJ(或 .OBJ)是一种开放的几何定义文件格式,最初由Wavefront Technologies公司开发,用以描述其Advanced Visualizer动画包.该格式已被其他3D图形应用供应商 ...

  2. 克隆Linux系统的网卡设置

    虚拟机里创建新主机使用克隆的办法,可以大大节省主机反复安装消耗的时间精力.但克隆出来的主机网卡及配置文件会发生改变,给我们在进行网卡设置时的很多麻烦.题主本文将从Linux里CentOS6发行版克隆的 ...

  3. [ike][ipsec] child sa rekey机制的细节分析

    子标题:ipsec rekey是否会导致丢包 author: classic_tong 前言 什么叫rekey. rekey是指ipsec的通信两端定期更换加密信道秘钥的机制. 为了安全性考虑,随着秘 ...

  4. python协程详解,gevent asyncio

    python协程详解,gevent asyncio 新建模板小书匠 #协程的概念 #模块操作协程 # gevent 扩展模块 # asyncio 内置模块 # 基础的语法 1.生成器实现切换 [1] ...

  5. Jmeter 中正则表达式提取器Regular Expression Extractor

    正则表达式提取器点击后置处理器中Post Processors 中的正则表达式提取器 Regular Expression Extractor Appy to: 表示作用于哪一个请求Main samp ...

  6. mysql 用户创建,授权

    关于mysql的用户管理,笔记 1.创建新用户 通过root用户登录之后创建 >> grant all privileges on *.* to testuser@localhost id ...

  7. docer安装之pure-ftp

    https://hub.docker.com/r/stilliard/pure-ftpd Docker Pure-ftpd Server https://hub.docker.com/r/stilli ...

  8. Redis 缓存雪崩、穿透、击穿

    缓存雪崩 定义: 同一时间所有 key 大面积失效,比如网站首页的数据基本上都是同一批次去缓存的. 解决方法: ① 存的时候设定随机的失效时间. ② 服务做熔断处理(异常或着慢查询 Hystrix 限 ...

  9. Oracle字符串中包含数字、特殊符号的排序

    问题描述: 某小区,需要按照小区.楼栋.单元号.房间号进行排序,但是按照地址描述排序时,因为字符串中包含数字,所以造成了如下的结果, 1号楼之后应该是2号楼,但是查询结果却是10号楼 . 尝试解决 使 ...

  10. laravel5.8 编译laravel mix

    如果第一次无需执行(如果编译的时候出错再次执行才需要) 1:rm -rf node_modules 更改镜像为淘宝镜像 2:yarn config set registry https://regis ...