16-CoreDNS附加组件及实战

一、CoreDNS附加组件

1.coreDNS概述

​ coreDNS的作用就是将svc的名称解析为ClusterIP。还可以实现Pod的负载均衡。

​ 早期使用的skyDNS组件,需要单独部署,在k8s 1.9版本中,我们就可以直接使用kubeadm方式安装CoreDNS组件。

​ 从k8s 1.12开始,CoreDNS就成为kubernetes默认的DNS服务器,但是kubeadm支持coreDNS的时间会更早。

​ 推荐阅读:
https://github.com/kubernetes/kubernetes/tree/master/cluster/addons/dns/coredns

2.coreDNS的IP地址

vim  /var/lib/kubelet/config.yaml 
...
clusterDNS:
- 10.200.0.10
clusterDomain: oldboyedu.com

3.coreDNS的A记录

	k8s的A记录格式:
<service name>[.<namespace name>.svc.cluster.local]

	参考案例:
kube-dns.kube-system.svc.cluster.local
oldboyedu-mysql.default.svc.cluster.local

温馨提示

  • (1)如果部署时直接写svc的名称,不写名称空间,则默认的名称空间为其引用资源的名称空间;
  • (2)kubeadm部署时,无需手动配置CoreDNS组件(默认在kube-system已创建),二进制部署时,需要手动安装该组件;

4.测试coreDNS组件

4.1 方式一:进入容器内部ping测试

​ 直接使用alpine取ping您想测试的SVC名称即可,观察能否解析成对应的VIP即可。

[root@master231 metallb]# kubectl get svc -A
…………
kube-system        kube-dns                          ClusterIP      10.200.0.10      <none>        53/UDP,53/TCP,9153/TCP   2d4h
…………
metallb-system     metallb-webhook-service           ClusterIP      10.200.27.157    <none>        443/TCP                  164m
………………

#一次性启动一个Pod,在这个容器内部ping K8s集群的任意一个svc名
[root@master231 metallb]# kubectl run test-dns-01 --rm -it --image=registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 -- sh
/ # ping metallb-webhook-service.metallb-system
PING metallb-webhook-service.metallb-system (10.200.27.157): 56 data bytes
64 bytes from 10.200.27.157: seq=0 ttl=64 time=0.172 ms
^C

4.2 方式二:使用dig命令测试

只能使用全称

[root@master231 metallb]# apt -y install bind-utils
[root@master231 metallb]# kubectl get svc -A
………………
kube-system        kube-dns                          ClusterIP      10.200.0.10      <none>        53/UDP,53/TCP,9153/TCP   2d3h
………………

#使用 dig 工具查询 metallb-webhook-service.metallb-system.svc.oldboyedu.com 的 DNS 解析结果,其中 10.200.0.10 是指定的 DNS 服务器地址
[root@master231 metallb]# dig @10.200.0.10  metallb-webhook-service.metallb-system.svc.oldboyedu.com +short 

4.3 方式三:使用host

[root@master231 metallb]# host  calico-api.calico-apiserver.svc.oldboyedu.com 10.200.0.10
Using domain server:
Name: 10.200.0.10
Address: 10.200.0.10#53
Aliases: 

calico-api.calico-apiserver.svc.oldboyedu.com has address 10.200.87.86

5.kubeadm默认安装了DNS服务器

#集群中 kube-system 命名空间下与 kube-dns 相关的资源信息
[root@master231 metallb]# kubectl get deploy,rs,svc,pods -n kube-system  -l k8s-app=kube-dns -o wide
NAME                      READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES                                                   SELECTOR
deployment.apps/coredns   2/2     2            2           2d3h   coredns      registry.aliyuncs.com/google_containers/coredns:v1.8.6   k8s-app=kube-dns

NAME                                DESIRED   CURRENT   READY   AGE    CONTAINERS   IMAGES                                                   SELECTOR
replicaset.apps/coredns-6d8c4cb4d   2         2         2       2d3h   coredns      registry.aliyuncs.com/google_containers/coredns:v1.8.6   k8s-app=kube-dns,pod-template-hash=6d8c4cb4d

NAME               TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                  AGE    SELECTOR
service/kube-dns   ClusterIP   10.200.0.10   <none>        53/UDP,53/TCP,9153/TCP   2d3h   k8s-app=kube-dns

NAME                          READY   STATUS    RESTARTS       AGE    IP               NODE        NOMINATED NODE   READINESS GATES
pod/coredns-6d8c4cb4d-bknzr   1/1     Running   1 (2d2h ago)   2d3h   10.100.160.135   master231   <none>           <none>
pod/coredns-6d8c4cb4d-cvp9w   1/1     Running   1 (2d2h ago)   2d3h   10.100.160.133   master231   <none>           <none>


#查看详细信息
[root@master231 metallb]# kubectl -n kube-system describe svc kube-dns 
Name:              kube-dns
Namespace:         kube-system
Labels:            k8s-app=kube-dns
                   kubernetes.io/cluster-service=true
                   kubernetes.io/name=CoreDNS
Annotations:       prometheus.io/port: 9153
                   prometheus.io/scrape: true
Selector:          k8s-app=kube-dns
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                10.200.0.10
IPs:               10.200.0.10
Port:              dns  53/UDP
TargetPort:        53/UDP
Endpoints:         10.100.160.133:53,10.100.160.135:53
Port:              dns-tcp  53/TCP
TargetPort:        53/TCP
Endpoints:         10.100.160.133:53,10.100.160.135:53
Port:              metrics  9153/TCP
TargetPort:        9153/TCP
Endpoints:         10.100.160.133:9153,10.100.160.135:9153
Session Affinity:  None
Events:            <none>

二、CoreDns组件优化WordPress实战

1.准备镜像

[root@worker232 ~]# docker tag mysql:8.0.36-oracle harbor250.oldboyedu.com/oldboyedu-wp/mysql:8.0.36-oracle
[root@worker232 ~]# docker push harbor250.oldboyedu.com/oldboyedu-wp/mysql:8.0.36-oracle

[root@worker233 ~]# docker tag wordpress:6.7.1-php8.1-apache harbor250.oldboyedu.com/oldboyedu-wp/wordpress:6.7.1-php8.1-apache 
[root@worker233 ~]# docker push harbor250.oldboyedu.com/oldboyedu-wp/wordpress:6.7.1-php8.1-apache

2.编写资源清单在相同的名称空间下测试

2.1 编写资源清单

[root@master231 deployments]# cat 03-deploy-wordpress.yaml
#使用deploy控制器在集群运行mysql服务,并设置相关参数,匹配的标签为apps: db
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-db
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: db
  template:
    metadata:
      labels:
        apps: db
    spec:
      containers:
      - image: harbor250.oldboyedu.com/oldboyedu-wp/mysql:8.0.36-oracle
        name: db
        env:
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_ALLOW_EMPTY_PASSWORD
          value: "yes"
        - name: MYSQL_USER
          value: admin
        - name: MYSQL_PASSWORD
          value: yinzhengjie
        args:
        - --character-set-server=utf8 
        - --collation-server=utf8_bin
        - --default-authentication-plugin=mysql_native_password
   

---
#配置svc服务发现,提供网络访问能力,匹配的标签为apps: db,匹配到上一部分的mysql服务,指定访问的端口为3306
apiVersion: v1
kind: Service
metadata:
  name: svc-db
spec:
  ports:
  - port: 3306
  selector:
    apps: db


---

#再次使用deploy控制器,创建Pod运行WordPress服务,指定标签为apps: wp
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-wp
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: wp
  template:
    metadata:
      labels:
        apps: wp
    spec:
      containers:
      - image: harbor250.oldboyedu.com/oldboyedu-wp/wordpress:6.7.1-php8.1-apache 
        name: wp
        env:
        - name: WORDPRESS_DB_HOST
          value: svc-db
        - name: WORDPRESS_DB_NAME
          value: wordpress
        - name: WORDPRESS_DB_USER
          value: admin
        - name: WORDPRESS_DB_PASSWORD
          value: yinzhengjie
    
---

#使用了svc的LoadBalancer类型,使得WordPress得以暴露,供外部访问
apiVersion: v1
kind: Service
metadata:
  name: svc-wp-lb
spec:
  type: LoadBalancer
  ports:
  - port: 80
    nodePort: 30130
  selector:
    apps: wp

2.2 创建并测试查看

[root@master231 deployments]# kubectl apply -f 03-deploy-wordpress.yaml
deployment.apps/deploy-db created
service/svc-db created
deployment.apps/deploy-wp created
service/svc-wp-lb created

[root@master231 deployments]# kubectl get -f 03-deploy-wordpress.yaml
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-db   1/1     1            1           4s

NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/svc-db   ClusterIP   10.200.82.128   <none>        3306/TCP   4s

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-wp   1/1     1            1           4s

NAME                TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/svc-wp-lb   LoadBalancer   10.200.168.21   10.0.0.151    80:30130/TCP   4s

[root@master231 deployments]# kubectl get pods -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
deploy-db-c4c857cc8-wpnpj    1/1     Running   0          7s    10.100.203.167   worker232   <none>           <none>
deploy-wp-6b75764d48-lq4rp   1/1     Running   0          7s    10.100.140.124   worker233   <none>           <none>

3.在不同的名称空间测试

3.1 编写资源清单

[root@master231 deployments]# cat 04-deploy-wordpress-diff-ns.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-db
  #这里指定了名称空间
  namespace: oldboyedu
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: db
  template:
    metadata:
      labels:
        apps: db
    spec:
      containers:
      - image: harbor250.oldboyedu.com/oldboyedu-wp/mysql:8.0.36-oracle
        name: db
        env:
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_ALLOW_EMPTY_PASSWORD
          value: "yes"
        - name: MYSQL_USER
          value: admin
        - name: MYSQL_PASSWORD
          value: yinzhengjie
        args:
        - --character-set-server=utf8 
        - --collation-server=utf8_bin
        - --default-authentication-plugin=mysql_native_password
   

---

#使用了svc默认的ClusterIP类型,直供集群内部访问3306端口
apiVersion: v1
kind: Service
metadata:
  name: svc-db
  namespace: oldboyedu
spec:
  ports:
  - port: 3306
  selector:
    apps: db


---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-wp
  #指定的与上面两个不相同的名称空间
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      apps: wp
  template:
    metadata:
      labels:
        apps: wp
    spec:
      containers:
      - image: harbor250.oldboyedu.com/oldboyedu-wp/wordpress:6.7.1-php8.1-apache 
        name: wp
        env:
        - name: WORDPRESS_DB_HOST
          # 适合在同一个名称空间的简写形式
          # value: svc-db
          # 适合在不同名称空间的简写形式
          # value: svc-db.oldboyedu
  #这里指定了Mysql服务所在的命名空间,跨名称空间访问需要Mysql所在的名称空间的完整的DNS名称
          value: svc-db.oldboyedu.svc.oldboyedu.com
        - name: WORDPRESS_DB_NAME
          value: wordpress
        - name: WORDPRESS_DB_USER
          value: admin
        - name: WORDPRESS_DB_PASSWORD
          value: yinzhengjie
    
---

apiVersion: v1
kind: Service
metadata:
  name: svc-wp-lb
  namespace: default
spec:
  type: LoadBalancer
  ports:
  - port: 80
    nodePort: 30130
  selector:
    apps: wp

3.2 创建并测试查看

[root@master231 deployments]# kubectl get -f 04-deploy-wordpress-diff-ns.yaml
NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-db   1/1     1            1           5s

NAME             TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
service/svc-db   ClusterIP   10.200.86.142   <none>        3306/TCP   5s

NAME                        READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-wp   1/1     1            1           5s

NAME                TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/svc-wp-lb   LoadBalancer   10.200.229.158   10.0.0.151    80:30130/TCP   5s

#默认名称空间
[root@master231 deployments]# kubectl get pods -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
deploy-wp-67986c5c57-68m9w   1/1     Running   0          10s   10.100.140.127   worker233   <none>           <none>

#oldboyedu名称空间
[root@master231 deployments]# kubectl get pods -o wide -n oldboyedu -l apps=db
NAME                        READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
deploy-db-c4c857cc8-blpsc   1/1     Running   0          15s   10.100.203.169   worker232   <none>           <none>
posted @ 2025-04-09 21:34  丁志岩  阅读(46)  评论(0)    收藏  举报