k8s的dns服務-coredns
1 k8s dns簡介
在kubernetes中每一個service都會被分配一個虛擬IP,每一個Service在正常情況下都會長時間不會改變,這個相對於pod的不定IP,對於集群中APP的使用相對是穩定的。但是Service的信息注入到pod目前使用的是環境變量的方式,並且十分依賴於pod(rc)和service的創建順序,這使得這個集群看起來又不那么完美,於是kubernetes以插件的方式引入了DNS系統,利用DNS對Service進行一個映射,這樣我們在APP中直接使用域名進行引用,避免了之前的變量泛濫問題,也避免了創建順序的尷尬局面。
Dns解析的實際是svc的虛擬負載IP,調用的域名也就是設置的service名稱
2 K8s dns安裝配置
Yum安裝的k8s需要手動配置dns服務
配置方法https://www.cnblogs.com/dribs/p/9120573.html
kubeadm安裝的k8s,在部署的時候默認安裝了,部署的是coredns
[root@k8s-master k8s]# kubectl get pods -n kube-system |grep dns coredns-5c98db65d4-7rqxc 1/1 Running 0 25h coredns-5c98db65d4-8w45r 1/1 Running 0 25h [root@k8s-master k8s]# [root@k8s-master k8s]# kubectl get pods NAME READY STATUS RESTARTS AGE nginx-deployment-84cddf955f-4r2mx 1/1 Running 0 10m nginx-deployment-84cddf955f-q6xc5 1/1 Running 0 10m [root@k8s-master k8s]# kubectl exec -it nginx-deployment-84cddf955f-4r2mx /bin/bash root@nginx-deployment-84cddf955f-4r2mx:/# cat /etc/resolv.conf nameserver 10.96.0.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5 root@nginx-deployment-84cddf955f-4r2mx:/#
3 一個簡單樣例tomcat+mysql解析
我們之前yum安裝的k8s,部署了web應用tomcat+mysql。pod的DNS不能解析,只能寫死MySQL的IP地址
https://www.cnblogs.com/wangxu01/articles/11411113.html
現在有了kubeamd部署的k8s環境,我們重新來測試一下
3.1 下載官方的測試鏡像和MySQL
其實無所謂,服務也會自動下載的,我這里沒有配置本地倉庫
3.2 部署mysql 服務
未持久化,這里只驗證dns
3.2.1 創建一個mysql-deployment文件
apiVersion: extensions/v1beta1 kind: Deployment #副本控制器Deployment metadata: name: mysql #Deployment的名稱,全局唯一 spec: replicas: 1 #Pod副本的期待數量 template: #根據此模版創建Pod的副本(實例) metadata: labels: app: mysql #Pod副本擁有的標簽,對應Deployment的selector spec: containers: #Pod內,定義容器 - name: mysql #容器名稱 image: mysql:5.7 #Docker image ports: - containerPort: 3306 #容器應用監聽的端口 env: #注入容器內的環境變量 - name: MYSQL_ROOT_PASSWORD #這里設置root初始密碼 value: "123456"
3.2.2 創建mysql-deployment
kubectl create -f mysql-deploy.yamlcat
3.2.3 驗證mysql-deployment
[root@k8s-master tomcatapp+mysql]# kubectl get deployment NAME READY UP-TO-DATE AVAILABLE AGE mysql 1/1 1 1 3m9s nginx-deployment 2/2 2 2 20h [root@k8s-master tomcatapp+mysql]# kubectl get pod NAME READY STATUS RESTARTS AGE mysql-94f6bbcfd-4f4fr 1/1 Running 0 3m19s nginx-deployment-84cddf955f-4r2mx 1/1 Running 0 30m nginx-deployment-84cddf955f-q6xc5 1/1 Running 0 30m [root@k8s-master tomcatapp+mysql]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES mysql-94f6bbcfd-4f4fr 1/1 Running 0 4m33s 10.254.2.37 k8s-node-2 <none> <none> nginx-deployment-84cddf955f-4r2mx 1/1 Running 0 31m 10.254.1.39 k8s-node-1 <none> <none> nginx-deployment-84cddf955f-q6xc5 1/1 Running 0 31m 10.254.2.34 k8s-node-2 <none> <none> [root@k8s-master tomcatapp+mysql]#
3.2.4 創建MySQL service文件
#DNS根據標簽搜索 apiVersion: v1 kind: Service metadata: name: tomcat-mysql #DNS根據標簽搜索nslook和dig也根據這個解析 spec: ports: - port: 3306 selector: app: timcat-mysql
3.2.5 創建MySQL service
kubectl apply -f mysql-svc.yaml
3.2.6 連接MySQL測試
[root@k8s-master tomcatapp+mysql]# mysql -uroot -p123456 -h10.254.2.37 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.27 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.01 sec) MySQL [(none)]>
3.3 部署web服務
3.3.1 創建一個tomcat-app-deployment文件
iVersion: extensions/v1beta1 kind: Deployment metadata: name: tomcat-app spec: replicas: 3 template: metadata: labels: app: tomcat-app spec: containers: - name: tomcat-app image: kubeguide/tomcat-app:v1 ports: - containerPort: 8080 env: - name: MYSQL_SERVICE_HOST value: 'tomcat-mysql' #MySQL service標簽 - name: MYSQL_SERVICE_PORT value: '3306'
3.3.2 創建tomcatAPP服務
kubectl create -f tomcat-app-deployment.yaml
3.3.3 驗證tomcat-app-deployment
[root@k8s-master tomcatapp+mysql]# kubectl get deployment | grep tomcattomcat-app 3/3 3 3 88s [root@k8s-master tomcatapp+mysql]# kubectl get pod -o wide| grep tomcattomcat-app-8489b8fdbf-9hsdn 1/1 Running 0 92s 10.254.2.38 k8s-node-2 <none> <none> tomcat-app-8489b8fdbf-cl8kw 1/1 Running 0 92s 10.254.1.43 k8s-node-1 <none> <none>tomcat-app-8489b8fdbf-twj9h 1/1 Running 0 92s 10.254.1.42 k8s-node-1 <none> <none> [root@k8s-master tomcatapp+mysql]#
3.3.4 測試tomcat-app-deployment服務
[root@k8s-master tomcatapp+mysql]# curl -I 10.254.1.43:8080 HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=UTF-8 Transfer-Encoding: chunked Date: Fri, 30 Aug 2019 03:13:13 GMT [root@k8s-master tomcatapp+mysql]# curl -I 10.254.1.43:8080/demo/ HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=6E07DBC15C31CE815EF57A5031F0F42B; Path=/demo/; HttpOnly Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Date: Fri, 30 Aug 2019 03:13:27 GMT [root@k8s-master tomcatapp+mysql]#
3.3.5 創建tomcat-app service文件
apiVersion: v1 kind: Service metadata: name: tomcat-app spec: type: NodePort ports: - port: 8080 name: myweb-svc nodePort: 30020 selector: app: tomcat-app
3.3.6 創建tomcat-app service
kubectl create -f tomcatapp-svc.yaml
3.3.7 測試tomcat
1.1.1 測試tomcat [root@k8s-master tomcatapp+mysql]# curl -I 10.6.76.24:30020/demo/ HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=E7DEB006D12FA0896D8E92E0EA62D337; Path=/demo/; HttpOnly Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Date: Fri, 30 Aug 2019 03:17:00 GMT [root@k8s-master tomcatapp+mysql]# curl -I 10.6.76.23:30020/demo/ HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Set-Cookie: JSESSIONID=96B1298BB30F5C2BC57CFFF1228122D9; Path=/demo/; HttpOnly Content-Type: text/html;charset=utf-8 Transfer-Encoding: chunked Date: Fri, 30 Aug 2019 03:17:05 GMT [root@k8s-master tomcatapp+mysql]#
3.4 dig和nslookup測試DNS
# cat dig.yaml apiVersion: v1 kind: Pod metadata: name: dig namespace: default spec: containers: - name: dig image: docker.io/azukiapp/dig command: - sleep - "3600" imagePullPolicy: IfNotPresent restartPolicy: Always
[root@k8s-master tomcatapp+mysql]# kubectl apply -f dig.yaml pod/dig unchanged [root@k8s-master tomcatapp+mysql]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 27h nginx NodePort 10.105.15.44 <none> 80:30023/TCP 21h t-mysql ClusterIP 10.108.97.7 <none> 3306/TCP 9m50s test-tomcat-app NodePort 10.101.38.207 <none> 8080:30020/TCP 7m6s [root@k8s-master tomcatapp+mysql]# [root@k8s-master tomcatapp+mysql]# kubectl exec -it dig /bin/bash bash-4.3# nslookup test-tomcat-app Server: 10.96.0.10 Address: 10.96.0.10#53 Name: test-tomcat-app.default.svc.cluster.local Address: 10.101.38.207 bash-4.3# nslookup nginx Server: 10.96.0.10 Address: 10.96.0.10#53 Name: nginx.default.svc.cluster.local Address: 10.105.15.44 bash-4.3# dig nginx ; <<>> DiG 9.10.3-P3 <<>> nginx ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 42115 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;nginx. IN A ;; AUTHORITY SECTION: . 30 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2019082901 1800 900 604800 86400 ;; Query time: 84 msec ;; SERVER: 10.96.0.10#53(10.96.0.10) ;; WHEN: Fri Aug 30 04:23:05 UTC 2019 ;; MSG SIZE rcvd: 109 bash-4.3#