Kubernetes CoreDNS

news2024/11/15 8:24:45

Kubernetes CoreDNS

1、DNS服务概述

coredns github 地址:

https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base

service 发现是 k8s 中的一个重要机制,其基本功能为:在集群内通过服务名对服务进行访问,即需要完成从服

务名到 ClusterIP 的解析。

k8s 主要有两种 service 发现机制:环境变量和 DNS。没有 DNS 服务的时候,k8s 会采用环境变量的形式,但一

旦有多个 service,环境变量会变复杂,为解决该问题,我们使用 DNS 服务。

DNS 服务在 kubernetes 中经历了三个阶段 ( SkyDNS -> KubeDNS -> CoreDNS ):

  • 第一阶段:在 kubernetes 1.2 版本时,dns 服务使用的是由 SkyDNS 提供的,由4个容器组成:

    kube2sky、skydns、etcd 和 healthz。etcd 存储 dns 记录;kube2sky 监控 service 变化,生成 dns 记录;

    skydns 读取服务,提供查询服务;healthz 提供健康检查。

  • 第二阶段:在 kubernetes 1.4 版本开始使用 KubeDNS,有3个容器组成:kubedns、dnsmasq 和

    sidecar。kubedns 监控 service 变化,并记录到内存(存到内存提高性能)中;dnsmasq 获取 dns 记录,提供

    dns 缓存,提供 dns 查询服务;sidecar 提供健康检查。

  • 第三阶段:从 kubernetes >=1.11 版本开始,dns 服务有 CoreDNS 提供,coredns 支持自定义 dns 记录及配

    置 upstream dns server,可以统一管理内部 dns 和物理 dns,coredns 只有一个 coredns 容器。下面是

    coredns 的架构。

在这里插入图片描述

2、CoreDNS配置解析

下面是 coredns 的配置模板:

apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: namespace-test
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local  10.200.0.0/16 {
          pods insecure
          upstream 114.114.114.114
          fallthrough in-addr.arpa ip6.arpa
          namespaces namespace-test
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
    }

下面是我本机 k8s 环境下的 coredns 配置:

[root@master ~]# kubectl get cm coredns -n kube-system -o yaml
apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health {
           lameduck 5s
        }
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
           pods insecure
           fallthrough in-addr.arpa ip6.arpa
           ttl 30
        }
        prometheus :9153
        forward . /etc/resolv.conf {
           max_concurrent 1000
        }
        cache 30
        loop
        reload
        loadbalance
    }
kind: ConfigMap
metadata:
  creationTimestamp: "2023-06-23T07:38:37Z"
  name: coredns
  namespace: kube-system
  resourceVersion: "220"
  uid: 73ad2161-f676-4695-8a49-94d1de362a16

CoreDNS 的主要功能是通过插件系统实现的。它实现了一种链式插件的结构,将 dns 的逻辑抽象成了一个个插

件。

常见的插件如下:

  • loadbalance:提供基于 dns 的负载均衡功能

  • loop:检测在 dns 解析过程中出现的简单循环问题

  • cache:提供前端缓存功能

  • health:对 Endpoint 进行健康检查

  • kubernetes:从 kubernetes 中读取 zone 数据

  • etcd:从 etcd 读取 zone 数据,可以用于自定义域名记录

  • file:从文件中读取 zone 数据

  • hosts:使用 /etc/hosts 文件或者其他文件读取 zone 数据,可以用于自定义域名记录

  • auto:从磁盘中自动加载区域文件

  • reload:定时自动重新加载 Corefile 配置文件的内容

  • forward:转发域名查询到上游 dns 服务器

  • proxy:转发特定的域名查询到多个其他 dns 服务器,同时提供到多个 dns 服务器的负载均衡功能

  • prometheus:为 prometheus 系统提供采集性能指标数据的 URL

  • pprof:在URL路径 /debug/pprof 下提供运行是的西能数据

  • log:对 dns 查询进行日志记录

  • errors:对错误信息镜像日志记录

在这里插入图片描述

3、Pod的DNS策略

3.1 Pod DNS策略

  • Default: 继承 Pod 所在宿主机的 DNS 设置。

  • ClusterFirst:优先使用 kubernetes 环境的 dns 服务,将无法解析的域名转发到从宿主机继承的 dns 服

    务器。

  • ClusterFirstWithHostNet:和 ClusterFirst 相同,对于以 hostNetwork 模式运行的 Pod 应明确知道使用

    该策略。

  • None: 忽略 kubernetes 环境的 dns 配置,通过 spec.dnsConfig 自定义 DNS 配置。

自定义 Dns 配置,可以通过 spec.dnsConfig 字段进行设置,可以设置如下信息:

  • nameservers:一组 dns 服务器的列表,最多可设置3个

  • searchs:一组用于域名搜索的 dns 域名后缀,最多6个

  • options:配置其他可选参数,例如 ndots、timeout等

spec:
  dnsPolicy: "None"
  dnsConfig:
    nameservers:
      - 1.2.3.4
    searchs:
      - xx.ns1.svc.cluster.local
      - xx.daemon.com
    options:
      - name: ndots
        values: "2"

pod 被创建后,容器内的 /etc/resolv.conf 会根据这个信息进行配置。

3.2 测试解析结果

之前安装 k8s 集群的时候就已经安装过 CoreDNS,所以这里就不重复讲解安装了。

创建 nslookup 服务:

# cat >busybox.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always
EOF

验证:

[root@master coredns]# kubectl create -f busybox.yaml
pod/busybox created

[root@master coredns]# kubectl get pods busybox
NAME      READY   STATUS    RESTARTS   AGE
busybox   1/1     Running   0          5s

# 查看容器内resolv文件的配置
[root@master coredns]# kubectl exec busybox -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

ndots:5:如果查询的域名包含的点 . 不到 5 个,那么进行 DNS 查找,将使用非完全限定名称(或者叫绝对域

名),如果你查询的域名包含点数大于等于 5,那么 DNS 查询,默认会使用绝对域名进行查询。

kubernetes 域名的全称,必须是 service-name.namespace.svc.cluster.local 这种模式。

4、测试CoreDNS

4.1 pod验证

创建并测试解析 kubernetes.default:

[root@master coredns]# kubectl exec busybox -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

[root@master coredns]# kubectl exec -ti busybox -- nslookup kubernetes
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local


[root@master coredns]# kubectl exec -ti busybox -- nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local


[root@master coredns]# kubectl exec -ti busybox -- nslookup kubernetes.default.svc
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default.svc
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

[root@master coredns]# kubectl exec -ti busybox -- nslookup kubernetes.default.svc.cluster
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

nslookup: can't resolve 'kubernetes.default.svc.cluster'
command terminated with exit code 1

[root@master coredns]# kubectl exec -ti busybox -- nslookup kubernetes.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default.svc.cluster.local
Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local

4.2 创建Service和Deployment来验证

# cat >dns-Service-Deployment-test001.yaml<<EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc-old
  labels:
    app: nginx-svc
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-old
spec:
  replicas: 1
  selector:
    matchLabels:
     app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
EOF

创建:

[root@master coredns]# kubectl apply -f dns-Service-Deployment-test001.yaml
service/nginx-svc-old created
deployment.apps/nginx-old created

[root@master coredns]# kubectl get pod | grep nginx-old
nginx-old-7848d4b86f-bkz8z   1/1     Running   0          19s

[root@master coredns]# kubectl get svc nginx-svc-old
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
nginx-svc-old   ClusterIP   10.102.190.25   <none>        80/TCP    30s

直接在宿主机上验证:

[root@master coredns]# nslookup nginx-svc-old.default.svc
Server:         8.8.8.8
Address:        8.8.8.8#53

** server can't find nginx-svc-old.default.svc: NXDOMAIN

发现直接在宿主机上是不能解析域名的,然后用以下 yaml 创建一个 busybox 作为调试工具:

# cat >dns-Deployment-test002.yaml<<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
     app: busybox
  template:
    metadata:
      labels:
        app: busybox
    spec:
      restartPolicy: Always
      containers:
      - name: busybox
        command:
        - sleep
        - "3600"
        image: busybox:1.28.4
EOF

创建好之后,exec 进入容器,执行测试命令。

[root@master coredns]# kubectl create -f dns-Deployment-test002.yaml
deployment.apps/busybox-deployment created
[root@master coredns]# kubectl get pod | grep busybox-deployment
busybox-deployment-dd5f964bb-6nlkb   1/1     Running   0          15s
[root@master coredns]# kubectl exec -ti busybox-deployment-dd5f964bb-6nlkb -- sh
/ # nslookup nginx-svc-old.default.svc
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      nginx-svc-old.default.svc
Address 1: 10.102.190.25 nginx-svc-old.default.svc.cluster.local
/ # nslookup nginx-svc-old.default.svc.cluster.local
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      nginx-svc-old.default.svc.cluster.local
Address 1: 10.102.190.25 nginx-svc-old.default.svc.cluster.local

根据 coredns 解析集群内域名原理可知:

服务 a 访问服务 b,对于同一个 Namespace下,可以直接在 pod 中,通过 curl b 来访问。对于跨 Namespace

的情况,服务名后边对应 Namespace 即可,比如 curl b.default。DNS 如何解析,依赖容器内 resolv 文件的配

置。

查看 busybox 容器内的 resolve.conf 文件:

/ # cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

这个文件中,配置的 DNS Server,一般就是 K8S 中,coredns 的 Service 的 ClusterIP,这个 IP 是虚拟 IP,无法

ping,但可以访问。

[root@master coredns]# kubectl get svc kube-dns -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   137m

10.96.0.10/etc/resolv.conf 文件中的 10.96.0.10 一样。

在容器内发请求时,会根据 /etc/resolv.conf 进行解析流程。选择 nameserver 10.96.0.10 进行解析,然后用

nginx-svc-old ,依次带入 /etc/resolve.conf 中的 search 域,进行DNS查找,分别是:

default.svc.cluster.local 
svc.cluster.local 
cluster.local
# 本例的查找
nginx-svc-old.default.svc.cluster.local
nginx-svc-old.svc.cluster.local
nginx-svc-old.cluster.local
/ # ping nginx-svc-old
PING nginx-svc-old (10.102.190.25): 56 data bytes
64 bytes from 10.102.190.25: seq=0 ttl=64 time=0.035 ms
64 bytes from 10.102.190.25: seq=1 ttl=64 time=0.138 ms
64 bytes from 10.102.190.25: seq=2 ttl=64 time=0.119 ms
64 bytes from 10.102.190.25: seq=3 ttl=64 time=0.217 ms
64 bytes from 10.102.190.25: seq=4 ttl=64 time=0.185 ms
64 bytes from 10.102.190.25: seq=5 ttl=64 time=0.140 ms
64 bytes from 10.102.190.25: seq=6 ttl=64 time=0.225 ms
^C
--- nginx-svc-old ping statistics ---
7 packets transmitted, 7 packets received, 0% packet loss
round-trip min/avg/max = 0.035/0.151/0.225 ms
/ # ping nginx-svc-old.default
PING nginx-svc-old.default (10.102.190.25): 56 data bytes
64 bytes from 10.102.190.25: seq=0 ttl=64 time=0.041 ms
64 bytes from 10.102.190.25: seq=1 ttl=64 time=0.182 ms
64 bytes from 10.102.190.25: seq=2 ttl=64 time=0.118 ms
64 bytes from 10.102.190.25: seq=3 ttl=64 time=0.117 ms
64 bytes from 10.102.190.25: seq=4 ttl=64 time=0.127 ms
64 bytes from 10.102.190.25: seq=5 ttl=64 time=0.111 ms
64 bytes from 10.102.190.25: seq=6 ttl=64 time=0.169 ms
64 bytes from 10.102.190.25: seq=7 ttl=64 time=0.221 ms
64 bytes from 10.102.190.25: seq=8 ttl=64 time=0.069 ms
64 bytes from 10.102.190.25: seq=9 ttl=64 time=0.158 ms
64 bytes from 10.102.190.25: seq=10 ttl=64 time=0.063 ms
64 bytes from 10.102.190.25: seq=11 ttl=64 time=0.115 ms
64 bytes from 10.102.190.25: seq=12 ttl=64 time=0.083 ms
64 bytes from 10.102.190.25: seq=13 ttl=64 time=0.057 ms
64 bytes from 10.102.190.25: seq=14 ttl=64 time=0.146 ms
64 bytes from 10.102.190.25: seq=15 ttl=64 time=0.118 ms
^C
--- nginx-svc-old.default ping statistics ---
16 packets transmitted, 16 packets received, 0% packet loss
round-trip min/avg/max = 0.041/0.118/0.221 ms

通过一个一个进行查找直到找到为止。所以,我们执行 ping nginx-svc-old,或者执行 ping nginx-svc-

old.default,都可以完成 DNS 请求,这2个不同的操作,会分别进行不同的DNS查找步骤。

根据以上原理,查看到 busybox 内的域名 /etc/resolv.conf 没有问题,nameserver 指向正确的 kube-dns 的

service clusterIP。

4.3 宿主机上解析域名验证

nameserver 关键字,如果没指定 nameserver 就找不到 DNS 服务器,其它关键字是可选的。nameserver 表示

解析域名时使用该地址指定的主机为域名服务器。其中域名服务器是按照文件中出现的顺序来查询的,且只有当第

一个 nameserver 没有反应时才查询下面的 nameserver,一般不要指定超过3个服务器。

查看集群和本地的信息:

[root@master coredns]# kubectl get svc -n kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   167m

[root@master coredns]# kubectl get pod -n kube-system -o wide | grep dns
coredns-545d6fc579-42cxc                  1/1     Running   0          167m   10.244.0.3       master    <none>           <none>
coredns-545d6fc579-lzgbz                  1/1     Running   0          167m   10.244.0.2       master    <none>           <none>

[root@master coredns]# kubectl exec -ti busybox-deployment-dd5f964bb-6nlkb -- cat /etc/resolv.conf
nameserver 10.96.0.10
search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

[root@master coredns]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 8.8.8.8
nameserver 14.114.114.114
nameserver 2409:8903:2404:3b71::bf

在宿主上的 /etc/resolv.conf 文件中添加 nameserver :

nameserver 10.96.0.10
nameserver 10.244.0.3
nameserver 10.244.0.2
search default.svc.cluster.local svc.cluster.local cluster.local

最后宿主机上的文件 /etc/resolv.conf 的内容如下:

[root@master coredns]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 10.96.0.10
nameserver 10.244.0.3
nameserver 10.244.0.2
search default.svc.cluster.local svc.cluster.local cluster.local
nameserver 8.8.8.8
nameserver 14.114.114.114
nameserver 2409:8903:2404:3b71::bf

测试:

[root@master coredns]# nslookup nginx-svc-old
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   nginx-svc-old.default.svc.cluster.local
Address: 10.102.190.25
[root@master coredns]# nslookup baidu.com
Server:         10.96.0.10
Address:        10.96.0.10#53

Non-authoritative answer:
Name:   baidu.com
Address: 39.156.66.10
Name:   baidu.com
Address: 110.242.68.66

可以看到现在可以解析了,也不影响外网域名解析,但是最好还是不要指定超过3个服务器。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/732216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TL-ER2260T获取SSH密码并登录后台

TL-ER2260T获取SSH密码并登录后台 首先需要打开诊断模式 打开Ubuntu&#xff0c;通过如下指令计算SSH密码&#xff0c;XX-XX-XX-XX-XX-XX是MAC地址echo -n "XX-XX-XX-XX-XX-XX" | tr -d - | tr [a-z] [A-Z] | md5sum | cut -b 1-16SSH登录ssh -oKexAlgorithmsdiffie…

硬件打样和小批量生产

PCB 打样和小批量生产过程 包括PCB 定型、生产文件制作、元器件准备、装配图制作、贴片、全流程测试。 打样一般是 几块PCB 手工进行焊接。 其中生产文件根据加工厂 一般提供PCB或者Gerber。 元器件准备设计公司的物料管理&#xff0c;这里假设已经拿到了所需的物料。 装…

微信小程序开发22__在列表中 高亮选中某一项

思考一个问题: 在一个列表中&#xff0c;怎样实现高亮选中 某一项呢? 我们先看要实现的效果图 <!-- 这里data-index 用于点击时传递参数, 在js取时写法&#xff1a; e.target.dataset.index --> <view wx:for"{{info}}" class"{{indexnum?active:…

UTOPIA Automatic Generation of Fuzz Driver using Unit Tests

UTOPIA: Automatic Generation of Fuzz Driver using Unit Tests 这篇论文主要由三星研究院发表于2023 IEEE Symposium on Security and Privacy (SP)会议上 论文获取链接&#xff1a; https://gts3.org/assets/papers/2023/jeong:utopia.pdf 背景 模糊测试分为两种&#xf…

整理FTP协议相关知识,撰写FTP服务器文件列表展示、文件上传、文件下载等代码案例和实现步骤细节;

1、FTP简介&#xff1a; FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为“文传协议”。用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序&#xff08;Application&#xff09;。基于不同的操作…

Redis-Desktop-Manager连接时出现Can’t connect to redis-server

目录 1. Redis-Desktop-Manager连接需要四个参数 2.修改数据库配置文件 3.关闭防火墙 4.此时连接Redis-Desktop-Manager 1. Redis-Desktop-Manager连接需要四个参数 Name&#xff1a;自定义连接名 Host&#xff1a;redis服务器地址&#xff0c;在CentOS终端中使用命令&…

dubbo入门

Dubbo概述 官网&#xff1a; https://dubbo.apache.org Dubbo快速入门 1 安装zk 参考 https://blog.csdn.net/qq_34914039/article/details/131614771 2 实现步骤

人体扫描新技术:手机扫描生成3D人体模型

人体扫描是一种新兴的技术&#xff0c;它可以通过数字化的方式&#xff0c;再现人体的内部结构。这种模型的应用范围广泛&#xff0c;不仅可以应用于医学领域&#xff0c;还可以用于虚拟现实、游戏开发等各个领域。通过人体扫描生成模型&#xff0c;我们可以实时地观察人体内部…

【网络】TCP协议详解

目录 TCP协议格式 感性理解TCP报头 认识报头中的字段 序号和确认序号 4位首部长度 窗口大小 标记位 确认应答机制 超时重传机制 TCP协议格式 感性理解TCP报头 linux内核是用C语言写的&#xff0c;所以报头实际上就是一种结构化的数据对象&#xff0c;用伪代码可表示为…

23种设计模式总结

设计模式的本质是&#xff1a;“找到变化&#xff0c;封装变化” 设计模式的类型分为&#xff1a; 创建型&#xff1a;负责提供创建对象的机制 结构型&#xff1a;将对象或类组合成更大的结构&#xff0c;同时保持对外结构的不变&#xff0c;对内结构的灵活 行为型&#xff1a…

CTFHub XSS 过滤关键词 WriteUp

前文链接&#xff1a;DOM反射xss 这次直接浏览器输入payload&#xff0c;发现 script 被过滤掉了 </textarea>"><script srchttp://xsscom.com//cZ2vvZ></script>碰到这种情况不要慌&#xff0c;下面给出两种方法绕过过滤关键字。 双写绕过 <…

安装需要的第三方库时,命令行输入pip提示不是内部或外部命令

简介 在做Python开发时&#xff0c;安装需要的第三方库时&#xff0c;大多数人喜欢选择在命令行用pip进行安装。 然而有时敲入pip命令会提示‘pip’不是内部或外部命令。。如图&#xff1a; 解决办法 1、在python安装目录中找得到script文件夹&#xff0c;查看文件夹内部是否…

解锁开发成果的商业价值,云商店如何与开发者共赢未来?

从PC互联网时代到移动互联网时代&#xff0c;用户获取各种应用的方式越来越便捷&#xff0c;只需要动动手指就可以获得自己想要的各种应用&#xff1b;同样&#xff0c;任何一个开发者有好的创意&#xff0c;都可以开发出受欢迎的应用&#xff0c;并获得不菲的商业回报。 尽管…

1.Git使用技巧-基础原理

Git 使用技巧 文章目录 Git 使用技巧前言一、Git 安装二、搭建服务端仓库三、搭建客户端1. git 通信2. git支持的通信协议本地拉取代码3. 配置用户名和密码查看配置 查看git 帮助Git 工作流程总结参考 前言 Git 是一个开源的分布式代码版本控制系统&#xff0c;用于敏捷高效地…

sql分页查询

文章目录 前言一、mysql分页1. limit 102. limit 10,20 二、oracle分页1. ROWNUM2. OFFSET和FETCH 三、PostgreSQL1.LIMIT 42.LIMIT 3 OFFSET 2 总结 前言 分页查询作为数据库必不可少的功能&#xff0c;每家数据库厂商都有各自的标准&#xff0c;下面仅记录目前主流数据库。 …

E2. Rudolf and Snowflakes (hard version) codeforces1846E2

Problem - E2 - Codeforces 题目大意&#xff1a;在无向图中&#xff0c;初始有一个点&#xff0c;然后将k个点连接到1号点上&#xff0c;之后每次操作分别将k歌点连接到之前新加的点上&#xff0c;这样的操作至少有1次&#xff0c;t次询问&#xff0c;每次询问给出一个数n&am…

ubuntu系统自带的Text Editor编辑器不高亮解决办法

平时在写launch文件时&#xff0c;我喜欢用ubuntu系统自带的text编辑器&#xff0c;但发现使用text打开launch 文件时&#xff0c;没有高亮功能了&#xff0c;如下图所示&#xff1a; 解决办法非常简单&#xff0c;因为launch和xml文件语法规则类似&#xff0c;只需将text编辑…

Kotlin~Composite组合模式

概念 能够帮助实现树状结构的模式。 主要特点 递归组合树状结构统一处理所有对象 角色介绍 Component: 组合接口Leaf: 叶子节点&#xff0c;无子节点Composite&#xff1a;枝节点&#xff0c;用来存储子部件 UML 代码实现 interface Organ {fun personCount():Int } cla…

使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令

使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令 文章目录 使用 Rust 实现连接远程 Linux 服务器、发送文件、执行命令一、Rust 概述使用场景优点缺点 二、功能实现1、代码2、运行日志3、服务器文件 一、Rust 概述 Rust 已经听了无数遍&#xff0c;我很清楚它很强&am…

windows11终端窗口更换颜色布局

1.首先我们在windows商店下载powershell 2.访问ohmyposh下载字体https://ohmyposh.dev/docs/installation/fonts https://ohmyposh.dev/docs/installation/fonts 下载完成后解压-选择全部右键-显示更多选项-为所有用户进行安装 3.安装完成后打开power shell&#xff0c;选择设置…