k8s无脑系列(二)-DNS服务搭建和访问

k8s无脑系列(二)-DNS服务搭建和访问

概述

上一个文章讲到了,采用NodePort。NodePort绑定了IP,所以对于未来的扩容、部署不友好。所以我们需要进一步学习下去。
外部访问LoadBalance和Ingress。无论哪种,都避不开一个点,就是集群内部采用DNS查询服务

  1. 不要怕,很简单,照着做一定行!
  2. 容易犯的错误,下面会有说明
  3. 因为使用了DNS服务,Node节点的服务启动有顺序要求了!

1. 创建DNS服务

所需要的Yaml

  1. kubedns-rc.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
spec:
  strategy:
    rollingUpdate:
      maxSurge: 10%
      maxUnavailable: 0
  selector:
    matchLabels:
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        k8s-app: kube-dns
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
        scheduler.alpha.kubernetes.io/tolerations: '[{"key":"CriticalAddonsOnly", "operator":"Exists"}]'
    spec:
      containers:
      - name: kubedns
        image: registry.cn-hangzhou.aliyuncs.com/google-containers/kubedns-amd64:1.9
        args:
        - --domain=cluster.local.
        - --dns-port=10053
        - --config-map=kube-dns
        - --v=2
        - --kube-master-url=http://192.168.56.4:8080 # 这个地址参见《kubernetes最小集群搭建》
        env:
        - name: PROMETHEUS_PORT
          value: "10055"
        ports:
        - containerPort: 10053
          name: dns-local
          protocol: UDP
        - containerPort: 10053
          name: dns-tcp-local
          protocol: TCP
        - containerPort: 10055
          name: metrics
          protocol: TCP
      - name: dnsmasq
        image: registry.cn-hangzhou.aliyuncs.com/google-containers/kube-dnsmasq-amd64:1.4
        args:
        - --cache-size=1000
        - --no-resolv
        - --server=127.0.0.1#10053
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
  1. kubedns-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.10  # 重点,重点,重点!!!地址可以随便设置,但!!!!这个IP一定要与flannel设置在etcd的网段保持一致。参见:《kubernetes最小集群搭建》 4.3保持一致
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

2. 修改配置(没有特殊说明,节点都要做如下检查和操作)

  1. 修改配置
  • 修改文件

    vim /etc/kubernetes/kubelet
    KUBELET_ARGS="--cluster_dns=10.254.10.10 --cluster_domain=cluster.local"
  • --cluster_dns=10.254.10.10
    IP地址与kubedns-svc.yaml中的选项保持一致

  • --cluster_domain
    与kubedns-rc.yaml 中的domain保持一致!

  1. Node节点重新启动
systemctl stop kubelet docker kube-proxy flanneld 
systemctl start flanneld docker kubelet kube-proxy
  1. Master节点重新启动
systemctl stop etcd flanneld kube-proxy kube-apiserver kube-controller-manager kube-scheduler
systemctl start etcd flanneld kube-proxy kube-apiserver kube-controller-manager kube-scheduler
  1. 创建DNS服务
  $kubectl create -f kubedns-rc.yaml
  $kubectl create -f kubedns-svc.yaml

2.1 检查DNS服务创建情况

  1. 执行命令

    $kubectl get svc,ep,pod --all-namespace
    NAMESPACE     NAME             CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
    default       svc/kubernetes   10.254.0.1      <none>        443/TCP         3d
    kube-system   svc/kube-dns     10.254.10.10    <none>        53/UDP,53/TCP   1h
    
    NAMESPACE     NAME                         ENDPOINTS                     AGE
    default       ep/kubernetes                192.168.1.114:6443            3d
    kube-system   ep/kube-dns                  10.254.1.2:53,10.254.1.2:53   1h
    
    NAMESPACE     NAME                           READY     STATUS    RESTARTS   AGE
    kube-system   po/kube-dns-2768888805-978hl   2/2       Running   0          1h
  2. 可以观察到svc/kube-dns 10.254.10.10 ,并且,EndPoint也对上了!成功

  3. 执行nslookup www.baidu.com 10.254.10.10 发现正常解析。再次确认成功

2.3 实际服务注册并获取DNS查询

  1. 修改mysql-svc.yaml,去掉NodePort相关,

    由于NodePort在运行中无法修改,需要删掉原有的mysql服务

  2. 删除旧服务

     $kubectl delete -f mysql-svc.yaml
  3. 编辑资源描述文件

    vim mysql-svc.yaml
    apiVersion: v1
    kind: Service
    metadata:
      name: mysql-svc
      labels:
        name: mysql-svc
    spec:
      ports:
      - port: 3306
        protocol: TCP
        targetPort: 3306
        name: mysql
      selector:
        app: mysql-pod
  4. 重新创建服务

    $kubectl create -f mysql-svc.yaml
    等待创建完毕
    
    $nslookup mysql-svc.default.svc.cluster.local 10.254.10.10
    Server:     10.254.10.10
    Address:    10.254.10.10#53
    
    Name:   mysql-svc.default.svc.cluster.local
    Address: 10.254.57.197
  5. 完全达成!

3. 遇到的问题

3.1 Node之间访问Pod不通的问题(没有特殊说明,节点都要做如下检查和操作)

  1. 双网卡,第一块网卡是外网网卡,导致无法访问(参见《kubernetes最小集群搭建》,虚拟机两块网卡的设定

在kubelet配置文件修改,为flanneld启动增加参数

vim /etc/sysconfig/flanneld
FLANNEL_OPTIONS="-iface enp0s8" # 这个网卡请参考实际虚拟机的名字
  1. 两个Node被分配到了一个网段的问题!

    启动顺序以及缓存导致的问题

  2. 正确的Node启动顺序

    一定要先启动flanneld!!!!

    systemctl stop kubelet docker kube-proxy flanneld 
    systemctl start flanneld docker kubelet kube-proxy
  3. 正确的Master启动顺序

    systemctl start etcd flanneld kube-proxy kube-apiserver kube-controller-manager kube-scheduler

3.2 犯的最傻X问题

  1. Master主机没有启动kube-proxy导致 无法验证DNS成功。《kubernetes最小集群搭建》也做了修改

猜你喜欢

转载自www.cnblogs.com/smokelee/p/12444946.html