K8S在開發測試環境落地問題處理以內網DNS解析

相信不少朋友都已經在測試或者生產環境中使用K8S來解決本身的業務問題,如下是咱們在測試環境落地的一些實踐。咱們把全部的Service、POD直接裸奔於開發以及測試人員(沒有使用Ingress、nodeport、LB,直接使用靜態路由+NAT),這樣咱們的測試以及開發人員可直接訪問SVC和POD,這個後期咱們單獨拿出來細講。因爲咱們是移動端原生開發居多,所以大部分都須要藉助WIFI+DNS服務器來完成咱們APP的測試。可是內網站點多,服務多,須要常常維護DNS服務器,可不能夠根據咱們的Service自動去維護咱們的DNS服務器呢。node

思路:
1.獲取K8S容器雲中全部namespace下的全部Service,而後制定規則如全部的web服務以完整的域名做爲服務名,好比咱們的api.abc.com那麼服務名就是api-abc-com,而後把kube-system過濾掉
2.根據上述獲取到的namespace、域名、ClusterIP寫入到對應文件夾下的DNS配置文件,若是存在則刪除再增長,若是不存在則自動添加
3.將各個命名空間的DNS配置文件進行加載web

#!/bin/bash
ns=$(kubectl get ns|awk 'NR!=1 && !/kube/ && !/istio/ && !/cattle-system/ && !/default/ && !/efk/ {print $1}')
for namespace in $ns
do
        [ -d $namespace ] || mkdir -p ${namespace}
        [ -f ${namespace}/dns ] || touch ${namespace}/dns
        svc=$(kubectl get svc -n$namespace|awk '/-/ && NR!=1 {print $1,$3}'|sed 's#-#.#g')
        echo "$svc"|while read line
        do
                domain=`echo $line|awk '{print $1}'`
                dns_record=`echo $line|awk '{print $1"="$2}'`
                [ `grep ${dns_record} ${namespace}/dns|wc -l` ] && sed -i "/${domain}/d" ${namespace}/dns && echo ${dns_record}>>${namespace}/dns
        done
        names=`cat ${namespace}/dns | grep -v '^#|^//' | tr '\n' ','|sed 's/,$//g'`
        sed "s#{namespace}#${namespace}#g" ~/yaml/dns/deploy.yaml | sed "s#{names}#${names}#g"|kubectl apply -f -
done

查看DNS的deploy-svc.yamlapi

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: dns
  namespace: {namespace}
spec:
  selector:
    matchLabels:
      name: dns
  replicas: 1
  template:
    metadata:
      labels:
        name: dns
    spec:
      containers:
      - name: bind
        image: cytopia/bind
        ports:
        - containerPort: 53
          protocol: TCP
          name: dnstcp
        - containerPort: 53
          protocol: UDP
          name: dnsudp
        env:
        - name: EXTRA_HOSTS
          value: "{names}"
        - name: DNS_FORWARDER
          value: "114.114.114.144,8.8.4.4"   #此處爲外網的DNS服務器
---

apiVersion: v1
kind: Service
metadata:
  name: dns
  namespace: {namespace}
  labels:
    name: dns
spec:
  ports:
  - protocol: TCP
    port: 53
    targetPort: 53
    name: dnstcp
  - protocol: UDP
    port: 53
    targetPort: 53
    name: dnsudp
  selector:
    name: dns
相關文章
相關標籤/搜索