目录贴:Kubernetes学习系列

  在之前几篇文章的基础,(Centos7部署Kubernetes集群基于kubernetes集群部署DashBoard为Kubernetes集群部署本地镜像仓库),本文继续搭建Kubernete中的服务注册发现机制——SkyDNS.

1、部署Cluster DNS

1.1 原理

  通过前面对Kubernetes的讨论(Kubernetes核心概念总结).我们已经知道,每个Kubernetes service都绑定了一个虚拟IP 地址(ClusterIP),而且Kubernetes最初使用向pod中注入环境变量的方式实现服务发现,但这会带来环境变量泛滥等问题。故需要增加集群DNS服务为每个service映射一个域名。到Kubernetes v1.2版本时,DNS作为一个系统可选插件集成到Kubernetes集群中。Kubernetes默认使用SkyDNS 作为集群的DNS服务器,

  kubernetes可以为pod提供dns(skyDNS)内部域名解析服务。其主要作用是为pod提供可以直接通过service的名字解析为对应service的ip的功能。启用了集群DNS选项,需要创建一个运行SkyDNS域名服务器的pod和一个对外提供集群service域名解析服务的SkyDNS service,并且还会为该service绑定一个稳定的静态IP地址作为入口IP地址。然后,Kubelet被配置成向每个Docker容器传人SkyDNS service的IP地址。作为它们其中一个DNS服务器。每个在Kubernetes集群中定义的service包括DNS服务器本身对应的service都会被映射到一个DNS域名,该域名一般由两个部分组成:service所在namespace和service名。默认情况下,一个客户端pod的DNS搜索列表一般包含pod自身的namespace和集群的默认域名集。SkyDNS service的域名搜索顺序大致如下。

    搜索客户端pod所在namespace中所有的service域名记录;

    搜索目标域名namespace中所有的service域名记录;

    从当前Kubernetes集群中,搜索所有的service域名记录。

  skyDNS由三部分组成:kube2sky、etcd、skydns。

    kube2sky的功能是监测api-server中的service的变化,当service创建、删除、修改时,获取对应的service信息,将其保存在etcd的中;

    Etcd的功能是存储kube2sky保存过来的数据;

    Skydns。在kubelet创建pod时,会使用为kubelet配置的“KUBELET_ARGS="--cluster-dns=10.254.10.2 --cluster-domain=sky --allow-privileged=true"” 在创建的pod中从而使用对应的dns服务器。而这一dns解析服务,实际是由Skydns提供的。

1.2 配置etcd中关于skyDNS的key

[root@k8s-master ~]# etcdctl mk /skydns/config '{"dns-addr":"10.254.10.2:53","ttl":3600,"domain":"sky."}'
{"dns-addr":"10.254.10.2:53","ttl":,"domain":"sky."}

1.3 配置kubelet中相关信息

  在每个node中更改kubelet的配置文件如下红色部分,更改完成之后重启服务。

[root@K8s-node- ~]# vim /etc/kubernetes/kubelet

###
# kubernetes kubelet (minion) config # The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=0.0.0.0" # 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=127.0.0.1"
KUBELET_HOSTNAME="--hostname-override=k8s-node-1" # location of the api-server
KUBELET_API_SERVER="--api-servers=http://k8s-master: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=sky --allow-privileged=true" [root@k8s-node- ~]# systemctl restart kubelet.service

1.4 yaml文件

  编辑skydns_dpm.yaml文件,更改以下红色部分(拷贝到机器上之后,最好把中文注释去掉):

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kube-dns
namespace: kube-system
spec:
replicas:
template:
metadata:
labels:
name: kube-dns
tier: platform
subsystem: unconfirmed
k8s-app: kube-dns
version: v9
partition: "no"
kubernetes.io/cluster-service: "true"
spec:
containers:
- name: kube2sky
#填写你自己的镜像名称
image: gcr.io/google_containers/kube2sky:1.11
resources:
limits:
cpu: 100m
memory: 50Mi
args:
# 同etcd中配置的/skydns/config中的domain名
- -domain=sky
# master地址
- --kube_master_url=http://10.0.251.148:8080
# etcd地址
- -etcd-server=http://10.0.251.148:2379
- name: skydns
#你的镜像名称
image: gcr.io/google_containers/skydns:---8c72f8c
resources:
limits:
cpu: 100m
memory: 50Mi
args:
# command = "/skydns"
# etcd地址
- -machines=http://10.0.251.148:2379
- -addr=0.0.0.0:
- -ns-rotate=false
#同etcd中配置的/skydns/config中的domain名,最后有‘点’
- -domain=sky.
ports:
- containerPort:
name: dns
protocol: UDP
- containerPort:
name: dns-tcp
protocol: TCP
dnsPolicy: Default # Don't use cluster DNS.

  编辑skydns-svc.yaml文件,更改以下红色部分:

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:
protocol: UDP
- name: dns-tcp
port:
protocol: TCP

1.5 启动

  在master执行如下命令:

kubectl create -f skydns_dpm.yaml
kubectl create -f skydns-svc.yaml

  之后,dns搭建完成。

[root@k8s-master yaml]# kubectl get deployment --all-namespaces
NAMESPACE NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
kube-system kube-dns 2m
kube-system kubernetes-dashboard-latest 1d
[root@k8s-master yaml]# kubectl get pod -o wide --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
kube-system kube-dns--1luff / Running 2m 10.0.28.2 k8s-node-
kube-system kubernetes-dashboard-latest--pxrpk / Running 1d 10.0.62.2 k8s-node-

1.6 DNS功能验证

1.6.1 创建测试service

[root@k8s-master yaml]# cat test_svc.yml
apiVersion: v1
kind: Service
metadata:
labels:
name: mysql
role: service
name: mysql-service
spec:
ports:
- port:
targetPort:
type: NodePort
selector:
name: mysql [root@k8s-master yaml]# kubectl create -f test_svc.yml
service "mysql-service" created
[root@k8s-master yaml]# kubectl get service
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> /TCP 1d
mysql-service 10.254.61.203 <nodes> /TCP 6s

1.6.2 创建测试pod

[root@k8s-master yaml]# cat busybox.yml
apiVersion: v1
kind: Pod
metadata:
labels:
name: busybox
role: master
name: busybox
spec:
containers:
- name: busybox
image: docker.io/busybox
command:
- sleep
- "" [root@k8s-master yaml]# kubectl create -f busybox.yml
pod "busybox" created
[root@k8s-master yaml]# kubectl get pod -o wide --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
default busybox / Running 18s 10.0.62.3 k8s-node-
kube-system kube-dns--1luff / Running 33m 10.0.28.2 k8s-node-
kube-system kubernetes-dashboard-latest--pxrpk / Running 1d 10.0.62.2 k8s-node-

1.6.3 进入pod验证服务解析

[root@k8s-master yaml]# kubectl exec -i -t busybox sh
/ # cat /etc/resolv.conf
search default.svc.sky svc.sky sky openstacklocal
nameserver 10.254.10.2
nameserver 10.0.251.90
nameserver 192.168.5.225
nameserver 192.168.5.226
options ndots:
/ #
/ # ping mysql-service
PING mysql-service (10.254.61.203): data bytes

基于Kubernetes集群部署skyDNS服务的更多相关文章

  1. 基于kubernetes集群部署DashBoard

    目录贴:Kubernetes学习系列 在之前一篇文章:Centos7部署Kubernetes集群,中已经搭建了基本的K8s集群,本文将在此基础之上继续搭建K8s DashBoard. 1.yaml文件 ...

  2. 基于Kubernetess集群部署完整示例——Guestbook

    目录贴:Kubernetes学习系列 本文依赖环境:Centos7部署Kubernetes集群.基于Kubernetes集群部署skyDNS服务 该示例中,我们将创建一个redis-master.两个 ...

  3. 为Kubernetes集群部署本地镜像仓库

    目录贴:Kubernetes学习系列 经过之前两篇文章:Centos7部署Kubernetes集群.基于kubernetes集群部署DashBoard,我们基本上已经能够在k8s的集群上部署一个应用了 ...

  4. 基于kubernetes集群的Vitess最佳实践

    概要 本文主要说明基于kubernetes集群部署并使用Vitess; 本文假定用户已经具备了kubernetes集群使用环境,如果不具备请先参阅基于minikube的kubernetes集群搭建, ...

  5. 部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0)

    部署Bookinfo示例程序详细过程和步骤(基于Kubernetes集群+Istio v1.0) 部署Bookinfo示例程序   在下载的Istio安装包的samples目录中包含了示例应用程序. ...

  6. kubernetes集群部署

    鉴于Docker如此火爆,Google推出kubernetes管理docker集群,不少人估计会进行尝试.kubernetes得到了很多大公司的支持,kubernetes集群部署工具也集成了gce,c ...

  7. Kubernetes集群部署关键知识总结

    Kubernetes集群部署需要安装的组件东西很多,过程复杂,对服务器环境要求很苛刻,最好是能连外网的环境下安装,有些组件还需要连google服务器下载,这一点一般很难满足,因此最好是能提前下载好准备 ...

  8. linux运维、架构之路-Kubernetes集群部署

    一.kubernetes介绍        Kubernetes简称K8s,它是一个全新的基于容器技术的分布式架构领先方案.Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部 ...

  9. Gitlab CI 集成 Kubernetes 集群部署 Spring Boot 项目

    在上一篇博客中,我们成功将 Gitlab CI 部署到了 Docker 中去,成功创建了 Gitlab CI Pipline 来执行 CI/CD 任务.那么这篇文章我们更进一步,将它集成到 K8s 集 ...

随机推荐

  1. Docker 导出 & 导入

    Docker 容器因为它的快速部署被深受喜爱.本文记录 Docker 容器的导出与导入,分别用到 Docker 的 export 和 import 命令. 1.查看正在运行的容器: [root@loc ...

  2. 前端 ----jQuery的介绍

    01-jQuery的介绍   1.为什么要使用jQuery 在用js写代码时,会遇到一些问题: window.onload 事件有事件覆盖的问题,因此只能写一个事件. 代码容错性差. 浏览器兼容性问题 ...

  3. JS调用摄像头并上传图片到服务器

    本功能只能把图片转成base64码上传,如何上传图片还没有修改出来,有兴趣的朋友弄出来了,请给我留下言,谢谢了! 直接上代码,需要的朋友直接复制就可以使用了. <!DOCTYPE html> ...

  4. Confluence 6 配置快捷链接

    快捷链接提供了提供了一个在 Confluence 中访问从常用资源的快速方法.当你创建一个快捷链接的时候,你需要为你的快捷链接 URL 指派一个 Key,用户可以在 Confluence 中只输入这个 ...

  5. LeetCode(118):杨辉三角

    Easy! 题目描述: 给定一个非负整数 numRows,生成杨辉三角的前 numRows 行. 在杨辉三角中,每个数是它左上方和右上方的数的和. 示例: 输入: 5 输出: [ [1], [1,1] ...

  6. python(7):sympy模块

    sympy主要用于符号计算 1,基本操作 from sympy import* #from sympy import pprint #x=Symbol('x')#也可以这么单个定义 #y=Symbol ...

  7. hdu4370 dijkstra矩阵转单向边最短路矩阵+自环闭环

    /* 矩阵太神奇了Orz,网上的题解大多是spfa,不过我发想dijkstra也能做 把n*n的矩阵看成是单向边距离矩阵就行 */ #include<iostream> #include& ...

  8. java反射机制实例

    1.通过数据库字段反射给对象实例赋值 convertClass.java /** * 通过反射构造对象 * @param obj * @param rs * @return */ public Obj ...

  9. windows下使用Play框架

         play类似于Spring这里的web框架.特点:MVC.函数编程. 版本:play 2.1.3 一.play命令 #play ~compile 功能:持续编译.在cmd中运行这个命令,只要 ...

  10. JAVA之复制数组

    //复制数组 //Arrays.copyOf(arr, 5) //arr:要复制的对象,5为新数组的长度 import java.util.Arrays; public class Cope { pu ...