zoukankan      html  css  js  c++  java
  • Kubernetes集群部署DNS插件

    kube-dns 官方的 yaml 文件其实在我们先前下载的 kubernetes server 软件包内,具体路径为:/srv/kubernetes/cluster/addons/dns

    我是把 kuberntes 解压到了 /srv/ 目录下

    准备 kube-dns 相关镜像

    kube-dns 插件直接使用 kubernetes 部署,官方的配置文件中包含以下镜像:

    [[email protected] dns]# cat kube-dns.yaml.base | grep image
          image: gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.8
          image: gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.8
          image: gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.8
    [[email protected] dns]# pwd
    /srv/kubernetes/cluster/addons/dns
    

    因为墙的原因,这些镜像我们需要翻墙下载,很是不方便,我下载了所需要的镜像,并上传到了时速云镜像仓库欢迎大家下载使用:

    index.tenxcloud.com/yeaheo/k8s-dns-dnsmasq-nanny-amd64:1.14.8
    index.tenxcloud.com/yeaheo/k8s-dns-kube-dns-amd64:1.14.8
    index.tenxcloud.com/yeaheo/k8s-dns-sidecar-amd64:1.14.8
    

    我们 pull 下来相关镜像后建议上传到私有仓库中,这样下载速度会更快,更方便,私有仓库部署参见 harbor私有镜像仓库部署

    准备 kube-dns 相关 yaml 文件

    默认情况下 kube-dns 插件的 yaml 文件在对应目录下已经存在,我们只需复制一份到指定目录下即可:

    [[email protected] dns]# pwd
    /srv/kubernetes/cluster/addons/dns   
    [[email protected] dns]# cp kube-dns.yaml.base /opt/k8s-addons/dns/kube-dns.yaml
    

    然后需要我们修改相关 yaml 文件。

    这里我们用源文件 kube-dns.yaml.base 做修改,修改后的 kube-dns.yaml 与源文件的区别如下所示,而这些正式我们需要修改的:

    [[email protected] dns]# diff kube-dns.yaml kube-dns.yaml.base 
    33c33
    <   clusterIP: 10.254.0.2
    ---
    >   clusterIP: __PILLAR__DNS__SERVER__
    97c97
    <         image: 192.168.8.69/library/k8s-dns-kube-dns-amd64:1.14.8
    ---
    >         image: gcr.io/google_containers/k8s-dns-kube-dns-amd64:1.14.8
    127c127
    <         - --domain=cluster.local.
    ---
    >         - --domain=__PILLAR__DNS__DOMAIN__.
    148c148
    <         image: 192.168.8.69/library/k8s-dns-dnsmasq-nanny-amd64:1.14.8
    ---
    >         image: gcr.io/google_containers/k8s-dns-dnsmasq-nanny-amd64:1.14.8
    168c168
    <         - --server=/cluster.local./127.0.0.1#10053
    ---
    >         - --server=/__PILLAR__DNS__DOMAIN__/127.0.0.1#10053
    187c187
    <         image: 192.168.8.69/library/k8s-dns-sidecar-amd64:1.14.8
    ---
    >         image: gcr.io/google_containers/k8s-dns-sidecar-amd64:1.14.8
    200,201c200,201
    <         - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.cluster.local.,5,SRV
    <         - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.cluster.local.,5,SRV
    ---
    >         - --probe=kubedns,127.0.0.1:10053,kubernetes.default.svc.__PILLAR__DNS__DOMAIN__,5,SRV
    >         - --probe=dnsmasq,127.0.0.1:53,kubernetes.default.svc.__PILLAR__DNS__DOMAIN__,5,SRV
    

    yaml 配置文件中使用的是私有镜像仓库中的镜像。这些文件都是统一成为一个文件,当然也可以做分离,这样更直观些。

    修改好的 kube-dns 相关 yaml 文件参见 kube-dns.yaml

    系统预定义的 RoleBinding

    预定义的 RoleBinding system:kube-dnskube-system 命名空间的 kube-dns ServiceAccountystem:kube-dns Role 绑定, 该 Role 具有访问 kube-apiserver DNS 相关 API 的权限;

    [[email protected] ~]# kubectl get clusterrolebindings system:kube-dns -o yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      annotations:
        rbac.authorization.kubernetes.io/autoupdate: "true"
      creationTimestamp: 2018-04-06T09:06:30Z
      labels:
        kubernetes.io/bootstrapping: rbac-defaults
      name: system:kube-dns
      resourceVersion: "87"
      selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/system%3Akube-dns
      uid: cbda2173-3979-11e8-8d8b-525400472b24
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:kube-dns
    subjects:
    - kind: ServiceAccount
      name: kube-dns
      namespace: kube-system
    

    kube-dns.yaml 里定义的 pods 时使用了 kube-dnsServiceAccount 所以具有访问 kube-apiserver DNS 相关 API 的权限。其他不用配置,例如 kube-dnsServiceAccount 我们默认就好。

    配置 kube-dns 相关服务

    之前我们在修改 kube-dns.yaml 文件的时候,有如下一处修改:

    33c33
    <   clusterIP: 10.254.0.2
    ---
    >   clusterIP: __PILLAR__DNS__SERVER__
    

    spec.clusterIP = 10.254.0.2,明确指定了 kube-dns Service IP,这个 IP 需要和 kubelet 的 --cluster-dns 参数值一致,否则启动 kube-dns 的时候会报错;

    执行 kube-dns 定义文件:

    大专栏  Kubernetes集群部署DNS插件"language-bash">[[email protected] ~]# cd /opt/k8s-addons/dns/
    [[email protected] dns]# ll
    total 8
    -rw-r--r-- 1 root root 6051 Apr 26 10:47 kube-dns.yaml
    [[email protected] dns]# kubectl create -f kube-dns.yaml
    

    验证 kube-dns 相关服务

    [[email protected] dns]# kubectl get pods -n kube-system | grep dns
    kube-dns-559bc869fb-tzc2b               3/3       Running   0          15d
    
    [[email protected] dns]# kubectl get svc -n kube-system | grep dns
    kube-dns               ClusterIP   10.254.0.2       <none>        53/UDP,53/TCP    15d
    

    可以看出, kube-dns 插件已经安装完成,相关 sevicepod 都在正常工作。

    检查 kube-dns 功能

    kube-dns 插件安装完成后我们需要验证一下 kube-dns 的相关功能。

    新建一个 deployment 验证 kube-dns 功能:

    [[email protected] nginx]# cat my-nginx.yaml 
    
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: my-nginx
    spec:
      replicas: 2
      template:
        metadata:
          labels:
            run: my-nginx
        spec:
          containers:
          - name: my-nginx
            image: 192.168.8.69/library/nginx:1.11.2
            ports:
            - containerPort: 80
    

    export 该 deployment, 生成 my-nginx 服务:

    # kubectl create -f my-nginx.yaml 
    deployment "my-nginx" created
    # kubectl expose deploy my-nginx
    service "my-nginx" exposed
    # kubectl get services --all-namespaces |grep my-nginx
    default       my-nginx               ClusterIP   10.254.196.99    <none>        80/TCP           6s
    

    创建另一个 pod,查看 /etc/resolv.conf 是否包含 kubelet 配置的 --cluster-dns--cluster-domain,是否能够将服务 my-nginx 解析到 Cluster IP 10.254.196.99

    $ kubectl create -f nginx-pod.yaml
    $ kubectl exec  nginx -i -t -- /bin/bash
    [email protected]:/# cat /etc/resolv.conf
    nameserver 10.254.0.2
    search default.svc.cluster.local. svc.cluster.local. cluster.local. jimmysong.io
    options ndots:5
    
    [email protected]:/# ping my-nginx
    PING my-nginx.default.svc.cluster.local (10.254.196.99): 56 data bytes
    76 bytes from 119.147.223.109: Destination Net Unreachable
    ^C--- my-nginx.default.svc.cluster.local ping statistics ---
    
    [email protected]:/# ping kubernetes
    PING kubernetes.default.svc.cluster.local (10.254.0.1): 56 data bytes
    ^C--- kubernetes.default.svc.cluster.local ping statistics ---
    11 packets transmitted, 0 packets received, 100% packet loss
    
    [email protected]:/# ping kube-dns.kube-system.svc.cluster.local
    PING kube-dns.kube-system.svc.cluster.local (10.254.0.2): 56 data bytes
    ^C--- kube-dns.kube-system.svc.cluster.local ping statistics ---
    6 packets transmitted, 0 packets received, 100% packet loss
    

    从结果来看,service 名称可以正常解析, 说明 kube-dns 可以正常工作。

    直接 ping ClusterIPping 不通的,ClusterIP 是根据 iptables 路由到服务的 endpoint上,只有结合 ClusterIP加端口才能访问到对应的服务。

    真诚赞赏,手留余香

    使用微信扫描二维码完成支付


    comments powered by Disqus
  • 相关阅读:
    获取系统信息
    Spring下获取项目根路径--good
    Java 获取webapp,Root,classpath,项目等路径工具类
    并发与并行的区别
    享元模式的简单使用
    mysql 分库分表(水平切割和垂直切割)
    sql随机筛选几条记录
    创建表
    sql字段组合唯一
    Jobject 使用
  • 原文地址:https://www.cnblogs.com/lijianming180/p/12239705.html
Copyright © 2011-2022 走看看