前言

从k8s 1.11版本开始,k8s集群的dns服务由CoreDNS提供。之前已经使用二进制文件部署了一个三master三node的k8s集群,现在需要在集群内部部署DNS服务。

  • 环境信息
IP 说明
192.168.8.21 部署了maser和node
192.168.8.22 部署了master和node
192.168.8.23 部署了master和node
169.169.0.100 集群内虚拟IP,DNS地址

步骤

1. 修改node的kubelet启动参数

修改node上的kubelet启动参数,添加以下两个参数,添加完成后重启kubelet。

  • --cluster-dns=169.169.0.100,这是集群内DNS的服务地址
  • --cluster-domain=cluster.local,为在dns服务中设置的域名

2. 部署CoreDNS服务

  1. 创建ConfigMap。主要设置CoreDNS的主配置文件Corefile的内容,其中可以定义各种域名的解析方式和使用的插件。
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4. name: coredns
  5. namespace: kube-system
  6. labels:
  7. addonmanager.kubernetes.io/mode: EnsureExists
  8. data:
  9. Corefile: |
  10. cluster.local {
  11. errors
  12. health {
  13. lameduck 5s
  14. }
  15. ready
  16. kubernetes cluster.local 169.169.0.0/16 {
  17. fallthrough in-addr.arpa ip6.arpa
  18. }
  19. prometheus :9153
  20. forward . /etc/resolv.conf
  21. cache 30
  22. loop
  23. reload
  24. loadbalance
  25. }
  26. . {
  27. cache 30
  28. loadbalance
  29. forward . /etc/resolv.conf
  30. }
  1. 创建deployment。
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: coredns
  5. namespace: kube-system
  6. labels:
  7. k8s-app: kube-dns
  8. kubernetes.io/name: "CoreDNS"
  9. spec:
  10. replicas: 1
  11. strategy:
  12. type: RollingUpdate
  13. rollingUpdate:
  14. maxUnavailable: 1
  15. selector:
  16. matchLabels:
  17. k8s-app: kube-dns
  18. template:
  19. metadata:
  20. labels:
  21. k8s-app: kube-dns
  22. spec:
  23. priorityClassName: system-cluster-critical
  24. tolerations:
  25. - key: "CriticalAddonsOnly"
  26. operator: "Exists"
  27. nodeSelector:
  28. kubernetes.io/os: linux
  29. affinity:
  30. podAntiAffinity:
  31. preferredDuringSchedulingIgnoredDuringExecution:
  32. - weight: 100
  33. podAffinityTerm:
  34. labelSelector:
  35. matchExpressions:
  36. - key: k8s-app
  37. operator: In
  38. values: ["kube-dns"]
  39. topologyKey: kubernetes.io/hostname
  40. containers:
  41. - name: coredns
  42. image: coredns/coredns:1.10.1
  43. imagePullPolicy: IfNotPresent
  44. resources:
  45. limits:
  46. memory: 170Mi
  47. requests:
  48. cpu: 100m
  49. memory: 70Mi
  50. args: [ "-conf", "/etc/coredns/Corefile" ]
  51. volumeMounts:
  52. - name: config-volume
  53. mountPath: /etc/coredns
  54. readOnly: true
  55. ports:
  56. - containerPort: 53
  57. name: dns
  58. protocol: UDP
  59. - containerPort: 53
  60. name: dns-tcp
  61. protocol: TCP
  62. - containerPort: 9153
  63. name: metrics
  64. protocol: TCP
  65. securityContext:
  66. allowPrivilegeEscalation: false
  67. capabilities:
  68. add:
  69. - NET_BIND_SERVICE
  70. drop:
  71. - all
  72. readOnlyRootFilesystem: true
  73. livenessProbe:
  74. httpGet:
  75. path: /health
  76. port: 8080
  77. scheme: HTTP
  78. initialDelaySeconds: 60
  79. timeoutSeconds: 5
  80. successThreshold: 1
  81. failureThreshold: 5
  82. readinessProbe:
  83. httpGet:
  84. path: /ready
  85. port: 8181
  86. scheme: HTTP
  87. dnsPolicy: Default
  88. volumes:
  89. - name: config-volume
  90. configMap:
  91. name: coredns
  92. items:
  93. - key: Corefile
  94. path: Corefile
  1. 创建service
  1. apiVersion: v1
  2. kind: Service
  3. metadata:
  4. name: kube-dns
  5. namespace: kube-system
  6. annotations:
  7. prometheus.io/port: "9153"
  8. prometheus.io/scrape: "true"
  9. labels:
  10. k8s-app: kube-dns
  11. kubernetes.io/cluster-service: "true"
  12. kubernetes.io/name: "CoreDNS"
  13. spec:
  14. selector:
  15. k8s-app: kube-dns
  16. clusterIP: 169.169.0.100
  17. ports:
  18. - name: dns
  19. port: 53
  20. protocol: UDP
  21. - name: dns-tcp
  22. port: 53
  23. protocol: TCP
  24. - name: metrics
  25. port: 9153
  26. protocol: TCP

3. 验证

使用带有nslookup工具的pod来验证dns服务是否正常(《kubernetes权威指南》中用的busybox,但自己测试不行,所以改成了用ubuntu镜像,pod起来后在容器中安装nslookup。):

  1. # pod-ubuntu.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: ubuntu
  6. namespace: default
  7. spec:
  8. containers:
  9. - name: ubuntu
  10. image: ubuntu:22.04
  11. command:
  12. - sleep
  13. - "3600"
  1. 先创建pod
  1. kubectl create -f pod-ubuntu.yaml
  1. 容器启动后,执行命令测试
  1. apt update
  2. apt install -y dnsutils
  3. nslookup svc-nginx

Corefile配置说明

CoreDNS的主要功能是通过插件系统实现的。常用插件如下:

名称 说明
loadbalance 提供基于DNS的负载均衡功能
loop 检测在DNS解析过程中出现的简单循环问题
cache 提供前端缓存功能
health 对Endpoint进行健康检查
kubernetes 从k8s中读取zone数据
etcd 从etcd中读取数据,可用于自定义域名记录
file 从RFC1035格式文件中读取zone数据
hosts 使用/etc/hosts文件或者其他文件读取zone数据,可用于自定义域名记录
auto 从磁盘中自动加载区域文件
reload 定时自动重新加载Corefile配置文件的内容
forward 转发域名查询到上游DNS服务器上
prometheus 为Prometheus系统提供采集性能指标数据的URL
pprof 在URL路径/debug/pprof下提供运行时的性能数据
log 对DNS查询进行日志记录
error 对错误信息进行日志记录

参考

  • 《kubernetes权威指南》

[kubernetes]集群中部署CoreDNS服务的更多相关文章

  1. 在 Kubernetes 集群中部署现代应用的通用模式

    在 Kubernetes 集群中部署现代应用的通用模式 摘要 我们正在经历现代应用交付领域的第二次浪潮,而 Kubernetes 和容器化则是这次浪潮的主要推动力量. 随着第二次浪潮的推进,我们在 N ...

  2. 在 kubernetes 集群中部署一套 web 网站(网页内容不限)

    环境准备 一台部署节点,一台master节点,还有两台节点node1,node2 完好的k8s集群环境 思路一: 在node1和node2节点上通过宿主机与容器之间目录映射和端口映射上线静态网站(或动 ...

  3. 在kubernetes集群中部署ElasticSearch集群--ECK

    Elastic Cloud on Kubernetes (ECK) ---ECK是这个说法哈. 基本于k8s operator的官方实现. URL: https://www.elastic.co/gu ...

  4. 如何使用Istio 1.6管理多集群中的微服务?

    假如你正在一家典型的企业里工作,需要与多个团队一起工作,并为客户提供一个独立的软件,组成一个应用程序.你的团队遵循微服务架构,并拥有由多个Kubernetes集群组成的广泛基础设施. 由于微服务分布在 ...

  5. 实操教程丨如何在K8S集群中部署Traefik Ingress Controller

    注:本文使用的Traefik为1.x的版本 在生产环境中,我们常常需要控制来自互联网的外部进入集群中,而这恰巧是Ingress的职责. Ingress的主要目的是将HTTP和HTTPS从集群外部暴露给 ...

  6. 终于解决 k8s 集群中部署 nodelocaldns 的问题

    自从开始在 kubernetes 集群中部署 nodelocaldns 以提高 dns 解析性能以来,一直被一个问题困扰,只要一部署 nodelocaldns ,在 coredns 中添加的 rewr ...

  7. ingress-nginx 的使用 =》 部署在 Kubernetes 集群中的应用暴露给外部的用户使用

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488189&idx=1&sn=8175f067 ...

  8. docker swarm英文文档学习-8-在集群中部署服务

    Deploy services to a swarm在集群中部署服务 集群服务使用声明式模型,这意味着你需要定义服务的所需状态,并依赖Docker来维护该状态.该状态包括以下信息(但不限于): 应该运 ...

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

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

  10. 在Kubernetes集群中使用calico做网络驱动的配置方法

    参考calico官网:http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/kubeadm ...

随机推荐

  1. 长文多图一步步讲清楚:DDD理论、建模与代码实现全流程

    欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析.实际应用.架构思维.职场分享.产品思考等等,同时欢迎大家加我个人微信「java_front」一起交流学习 1 六个问题 1.1 ...

  2. 2022-03-17:所有黑洞的中心点记录在holes数组里, 比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9), 并且所有黑洞的中心点都在左下角(0,0),右上角(

    2022-03-17:所有黑洞的中心点记录在holes数组里, 比如[[3,5] [6,9]]表示,第一个黑洞在(3,5),第二个黑洞在(6,9), 并且所有黑洞的中心点都在左下角(0,0),右上角( ...

  3. Django-Virtualenv虚拟环境安装、新建,激活和手动指定Python解释器、虚拟环境安装Django、创建Django项目、运行Django项目

    一.安装虚拟环境: 命令:pip3 install virtualenv 二.安装管理工具: 命令:pip3 install virtualenvwrapper 三.新建: 命令:python -m ...

  4. 这10个Lambda表达式必须掌握,简化你的代码,提高生产力

    Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名 ...

  5. T-SQL——批量刷新视图

    目录 0. 背景说明 1. 查询出所有使用了指定表的视图并生成刷新语句 2. 创建存储过程批量刷新 3. 刷新全部的视图 4. 参考 shanzm--2023年5月16日 0. 背景说明 为什么要刷新 ...

  6. rt下降40%?程序并行优化六步法

    1 背景 性能优化是我们日常工作中很重要的一部分,主要有以下原因: 降低服务器和带宽等硬件成本:用更少的资源处理更多的请求 提高现实世界的运行效率:人机处理效率存在数量级的偏差,同样机器世界的效率提升 ...

  7. 源代码管理工具——Git

    Git是一个开源的分布式版本控制系统,用于管理软件开发中的版本控制和协作.通过Git,开发人员可以记录文件的修改历史.协作开发,以及在多个分支上进行实验性开发.Git已成为现代软件开发中不可或缺的工具 ...

  8. web自动化01-环境搭建

    1.自动化测试是什么? 借助工具实现 借助代码编写脚本实现  2.自动化测试需要掌握那些? web自动化测试基础 移动端自动化基础 pytest自动化测试框架 po设计模式 数据驱动 日志模块使用 自 ...

  9. K2C V21.4.6.12刷breed教程

    K2C V21.4.6.12刷breed教程(刷机方法源自qiao99) 原贴地址:K2C V21.4.6.12刷breed记录 http://www.right.com.cn/forum/threa ...

  10. Kubernetes GoRoutineMap工具包代码详解

    1.概述 GoRoutineMap 定义了一种类型,可以运行具有名称的 goroutine 并跟踪它们的状态.它防止创建具有相同名称的多个goroutine,并且在上一个具有该名称的 goroutin ...