k8sdns是Kubernetes的一部分,它提供了在kubernetes集群內部的DNS解析服務。它通過將所有Kubernetes服務命名為DNS記錄,使得容器中服務的查找變得非常簡單。
一、部署
在Kubernetes集群中啟用k8sdns與其他插件一樣簡單。有兩種方式可以在Kubernetes中啟用k8sdns:
方式一:使用kube-up.sh腳本,它將所有必需的組件(包括Docker、Etcd、Kubelet等)都安裝在集群上:
kube-up.sh
在腳本中,在kube-up.sh腳本文件所在目錄中運行命令,將創建1個Master節點和2個Minion節點。最後,k8sdns將啟動在Master節點上。
方式二:使用kubectl命令行工具手動安裝k8sdns。
kubectl create -f kubedns.yaml
kubedns.yaml文件的內容如下所示:
apiVersion: v1
kind: Namespace
metadata:
name: kube-system
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kube-dns
namespace: kube-system
labels:
k8s-app: kube-dns
kubernetes.io/cluster-service: "true"
spec:
replicas: 1
selector:
matchLabels:
k8s-app: kube-dns
template:
metadata:
labels:
k8s-app: kube-dns
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
spec:
containers:
- name: etcd
image: gcr.io/google_containers/etcd-amd64:2.2.1
command:
- /usr/local/bin/etcd
- -name
- k8s
- -data-dir
- /var/etcd/data
- -advertise-client-urls
- http://$POD_IP:2379
- -listen-client-urls
- http://0.0.0.0:2379
resources:
limits:
cpu: 100m
memory: 50Mi
requests:
cpu: 100m
memory: 50Mi
volumeMounts:
- name: etcd-storage
mountPath: /var/etcd/data
- name: kube2sky
image: gcr.io/google_containers/kube2sky-amd64:1.14
args:
- -domain=cluster.local
- -kubeconfig=/srv/kubernetes/kubeconfig.yaml
- -kube-master-url=http://127.0.0.1:8080
resources:
limits:
cpu: 100m
memory: 50Mi
requests:
cpu: 100m
memory: 50Mi
- name: skydns
image: gcr.io/google_containers/skydns-amd64:1.0
args:
- -machines=http://localhost:4001
- -addr=0.0.0.0:53
- -dns-bind-address=0.0.0.0:53
- -domain=cluster.local.
resources:
limits:
cpu: 100m
memory: 50Mi
requests:
cpu: 100m
memory: 50Mi
volumes:
- name: etcd-storage
emptyDir: {}
dnsPolicy: Default
kubedns.yaml文件中定義了一個Deployment類型,其中包含三個容器:etcd、kube2sky和skydns。其中kube2sky包含用於從etcd中檢索服務信息並處於DNS格式的skydns。
二、核心概念
1. DNS命名約定
在Kubernetes中,每個服務都由一個DNS名稱(默認情況下包括兩部分,service和namespace)標識。DNS名稱使用的模式是service.namespace.svc.cluster.local。其中,namespace部分包含服務的命名空間,service部分包含服務名稱。Kubernetes可以提供一些默認的屬性(例如,默認情況下,namespace為default)。
2. DNS解析服務
k8s DNS是一個基於CoreDNS實現的DNS解析服務,主要是在Kubernetes 集群內用於服務發現,支持多種服務發現方法,為Kubernetes中所有對象(包括服務、Pod等)提供了DNS別名。
3. DNS名字解析
在Kubernetes中,可以通過DNS名字解析來訪問服務。在Kubernetes節點上運行的每個Pod都自動配置為使用Kubernetes DNS插件進行域名解析。與Pod共存的Kubelet容器獨立地在DNS服務器的反向解析表中為Kubernetes節點管理的所有Pod分配 nameserver IP。這些IP充當DNS服務器的遞歸名稱服務地址,這使管理更加簡單。
4. DNS解析操作
在Kubernetes中,所有的DNS解析請求都將發送到Kubernetes的「kube-dns」服務。DNS請求將被轉發並解析為服務器端點。服務端點基於與服務關聯的Pod標籤,創建DNS記錄,以便在服務名稱被從DNS中解析時,返回所有同名Pod的地址集合。
三、應用場景
1. 創建服務發現
Kubernetes中的DNS解析服務可以幫助用戶輕鬆創建服務發現。用戶可以將服務名稱解析為其對應的IP地址,這些IP地址中提供了應用程序所需的各種服務。這為應用程序部署提供了新的機遇,尤其是在需要將服務與其他應用程序的集成時。
2. 實現troubleshooting
k8s用於DNS解析的CoreDNS提供了具有多種功能的各種插件。例如kubernetes插件,這個插件允許CoreDNS查詢Kubernetes API相關的內容(如service和endpoints)來解析服務名稱。在三次握手等連接失敗時,管理員可以使用此插件進行 troubleshooting。
3. 創建訪問規則
Kubernetes DNS提供了一種簡單的方式來配置服務的訪問規則。通過為每個服務創建一個DNS名稱,管理員可以指定訪問每個服務所需的任何規則。管理員也可以使用特定的DNS名稱來提高網絡和應用程序的安全性。
四、總結
k8sdns是Kubernetes中必不可少的一部分,能夠輕鬆地為我們提供服務發現並實現DNS別名。k8sdns能夠使得整個Kubernetes集群具有更高的可用性和安全性。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/162643.html
微信掃一掃
支付寶掃一掃