K8s附加组件DNS服务
Kubernetes中有一个很重要的特性,服务自发现。一旦一个service被创建,该service的service IP和service port等信息都可以被注入到pod中供它们使用。Kubernetes主要支持两种service发现 机制:环境变量和DNS。没有dns服务的时候,kubernetes会采用环境变量的形式,一旦有很多个service,环境变量会变得很复杂,为了解决这个问题,k8s通过Add-On增值包的方式引入了DNS系统,把服务名作为DNS域名,这样程序就可以直接使用服务名来创建通信连接。
作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,这就需要一个集群范围的DNS服务来完成服务名到Cluster IP的解析。
1. k8s提供的虚拟DNS服务名为skydns,主要由4个组件组成。
1)etcd:DNS存储
2)kube2sky:将k8s master中的service服务注册到etcd
3)kubeDNS:提供DNS域名解析服务
4)healthz:提供对skydns服务的健康检查功能
2. 下载skydns资料包
[root@kub_master k8s]# wget https://www.qstack.com.cn/skydns.zip --2020-09-26 17:54:34-- https://www.qstack.com.cn/skydns.zip Resolving www.qstack.com.cn (www.qstack.com.cn)... 36.159.114.145, 111.62.73.19, 36.159.114.146, ... Connecting to www.qstack.com.cn (www.qstack.com.cn)|36.159.114.145|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 3411 (3.3K) [application/zip] Saving to: ‘skydns.zip’ 100%[===============================================================================================>] 3,411 --.-K/s in 0s 2020-09-26 17:54:35 (267 MB/s) - ‘skydns.zip’ saved [3411/3411]
[root@kub_master k8s]# unzip skydns.zip Archive: skydns.zip creating: skydns/ inflating: skydns/skydns-rc.yaml inflating: skydns/skydns-svc.yaml inflating: skydns/test_dns_pod.yaml
3. skydns服务由一个RC和一个Service的定义组成,分别由配置文件skydns-rc.yaml 和skydns-svc.yaml定义。
[root@kub_master skydns]# vim skydns-rc.yaml [root@kub_master skydns]# cat skydns-rc.yaml |grep master # we poll on pod startup for the Kubernetes master service and - --kube-master-url=http://192.168.0.212:8080 #master所在物理主机的IP地址和端口号
[root@kub_master skydns]# kubectl create -f skydns-rc.yaml deployment "kube-dns" created [root@kub_master skydns]# kubectl get pods --namespace=kube-system NAME READY STATUS RESTARTS AGE kube-dns-4072910292-4qb6c 4/4 Running 0 2m [root@kub_master skydns]# kubectl get deployment --namespace=kube-system NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE kube-dns 1 1 1 1 2m
[root@kub_master skydns]# vim skydns-svc.yaml [root@kub_master skydns]# cat skydns-svc.yaml |grep -i clusterip clusterIP: 192.168.230.254
skydns服务使用的cluster ip需要指定一个固定的ip地址,每个node的kubelet进程都将使用这个ip地址,不能通过k8s自动分配。
另外这个ip地址需要在kube-apiserver启动参数--service-cluster-ip-range指定的ip地址范围内。
[root@kub_master skydns]# kubectl create -f skydns-svc.yaml service "kube-dns" created [root@kub_master skydns]# kubectl get svc --namespace=kube-system NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kube-dns 192.168.230.254 <none> 53/UDP,53/TCP 14s
4. 查看在kube-system命名空间内的所有资源
[root@kub_master skydns]# kubectl get all --namespace=kube-system NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/kube-dns 1 1 1 1 10m NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kube-dns 192.168.230.254 <none> 53/UDP,53/TCP 1m NAME DESIRED CURRENT READY AGE rs/kube-dns-4072910292 1 1 1 10m NAME READY STATUS RESTARTS AGE po/kube-dns-4072910292-4qb6c 4/4 Running 0 10m
5. 在创建skydns容器之前,先修改每个node上kubelet的启动参数。
[root@kub_node1 ~]# vim /etc/kubernetes/kubelet [root@kub_node1 ~]# cat /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=192.168.0.184" # location of the api-server KUBELET_API_SERVER="--api-servers=http://192.168.0.212:8080" # pod infrastructure container KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=192.168.0.212:5000/pod-infrastructure:latest" # Add your own! KUBELET_ARGS="--cluster_dns=192.168.230.254 --cluster_domain=cluster.local" [root@kub_node1 ~]# systemctl restart kubelet
6.检验dns是否生效
#创建测试pod
[root@kub_master skydns]# vim test_dns_pod.yaml [root@kub_master skydns]# cat test_dns_pod.yaml apiVersion: v1 kind: Pod metadata: labels: name: busybox role: master name: busybox2 spec: containers: - name: busybox image: docker.io/busybox:latest imagePullPolicy: IfNotPresent command: - sleep - "3600" [root@kub_master skydns]# kubectl create -f test_dns_pod.yaml pod "busybox2" created [root@kub_master skydns]# kubectl get pods NAME READY STATUS RESTARTS AGE busybox2 1/1 Running 0 19s mysql-wp-3651026459-v31gc 1/1 Running 0 1h mysql-x6ql5 1/1 Running 0 2h myweb-03lkh 1/1 Running 0 2h myweb-d5h4z 1/1 Running 0 2h wp-deployment-3182043070-2jmkb 1/1 Running 0 59m wp-deployment-3182043070-r7bmq 1/1 Running 0 59m
#进入pod测试
[root@kub_master ~]# kubectl get svc NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes 192.168.0.1 <none> 443/TCP 5d mysql 192.168.41.34 <none> 3306/TCP 2h mysql-wp 192.168.6.183 <none> 3306/TCP 44m myweb 192.168.7.143 <nodes> 8080:30001/TCP 2h wp 192.168.191.107 <nodes> 80:30002/TCP 43m
[root@kub_master skydns]# kubectl exec -it busybox2 bash rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:235: starting container process caused "exec: \"bash\": executable file not found in $PATH" [root@kub_master skydns]# kubectl exec -it busybox2 sh / # nslookup wp Server: 192.168.230.254 Address: 192.168.230.254:53 Name: wp.default.svc.cluster.local Address: 192.168.191.107
7. 有DNS服务后,创建不同服务之间不需要使用cluster ip地址,直接用服务名即可连接
#删除tomcat下的全部资源
[root@kub_master tomcat_demo]# cd tomcat_demo [root@kub_master tomcat_demo]# ll total 16 -rw-r--r-- 1 root root 420 Sep 26 16:34 mysql-rc.yaml -rw-r--r-- 1 root root 145 Sep 26 16:34 mysql-svc.yaml -rw-r--r-- 1 root root 495 Sep 26 17:02 tomcat-rc.yaml -rw-r--r-- 1 root root 162 Sep 26 17:03 tomcat-svc.yaml [root@kub_master tomcat_demo]# kubectl delete -f . replicationcontroller "mysql" deleted service "mysql" deleted replicationcontroller "myweb" deleted service "myweb" deleted [root@kub_master tomcat_demo]# kubectl get pods NAME READY STATUS RESTARTS AGE busybox2 1/1 Running 0 11m mysql-wp-3651026459-v31gc 1/1 Running 0 1h wp-deployment-3182043070-2jmkb 1/1 Running 0 1h wp-deployment-3182043070-r7bmq 1/1 Running 0 1h
#修改rc文件
[root@kub_master tomcat_demo]# vim tomcat-rc.yaml [root@kub_master tomcat_demo]# cat tomcat-rc.yaml apiVersion: v1 kind: ReplicationController metadata: name: myweb spec: replicas: 2 selector: app: myweb template: metadata: labels: app: myweb spec: containers: - name: myweb image: 192.168.0.212:5000/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: 'mysql' #修改成service 服务名 - name: MYSQL_SERVICE_PORT value: '3306'
#批量创建
[root@kub_master tomcat_demo]# kubectl create -f . replicationcontroller "mysql" created service "mysql" created replicationcontroller "myweb" created service "myweb" created [root@kub_master tomcat_demo]# kubectl get all NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE deploy/mysql-wp 1 1 1 1 1h deploy/wp-deployment 2 2 2 2 1h NAME DESIRED CURRENT READY AGE rc/mysql 1 1 1 11s rc/myweb 2 2 2 11s NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc/kubernetes 192.168.0.1 <none> 443/TCP 5d svc/mysql 192.168.185.140 <none> 3306/TCP 11s svc/mysql-wp 192.168.6.183 <none> 3306/TCP 1h svc/myweb 192.168.183.179 <nodes> 8080:30001/TCP 11s svc/wp 192.168.191.107 <nodes> 80:30002/TCP 1h NAME DESIRED CURRENT READY AGE rs/mysql-wp-3651026459 1 1 1 1h rs/wp-deployment-3182043070 2 2 2 1h NAME READY STATUS RESTARTS AGE po/busybox2 1/1 Running 0 14m po/mysql-ms870 1/1 Running 0 11s po/mysql-wp-3651026459-v31gc 1/1 Running 0 1h po/myweb-5zpl5 1/1 Running 0 11s po/myweb-g09wf 1/1 Running 0 11s po/wp-deployment-3182043070-2jmkb 1/1 Running 0 1h po/wp-deployment-3182043070-r7bmq 1/1 Running 0 1h
测试访问
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏