K8S入门详细地教程
Kubernetes详细教程#
1. Kubernetes介绍#
1.1 应用部署方式演变#
在部署应用程序的方式上,主要经历了三个时代:
- 传统部署:互联网早期,会直接将应用程序部署在物理机上
优点:简单,不需要其它技术的参与
缺点:不能为应用程序定义资源使用边界,很难合理地分配计算资源,而且程序之间容易产生影响 - 虚拟化部署:可以在一台物理机上运行多个虚拟机,每个虚拟机都是独立的一个环境
优点:程序环境不会相互产生影响,提供了一定程度的安全性
缺点:增加了操作系统,浪费了部分资源 - 容器化部署:与虚拟化类似,但是共享了操作系统
优点:
可以保证每个容器拥有自己的文件系统、CPU、内存、进程空间等
运行应用程序所需要的资源都被容器包装,并和底层基础架构解耦
容器化的应用程序可以跨云服务商、跨Linux操作系统发行版进行部署
容器化部署方式给带来很多的便利,但是也会出现一些问题,比如说:
- 一个容器故障停机了,怎么样让另外一个容器立刻启动去替补停机的容器
- 当并发访问量变大的时候,怎么样做到横向扩展容器数量
这些容器管理的问题统称为容器编排问题,为了解决这些容器编排问题,就产生了一些容器编排的软件:
- Swarm:Docker自己的容器编排工具
- Mesos:Apache的一个资源统一管控的工具,需要和Marathon结合使用
- Kubernetes:Google开源的的容器编排工具
1.2 kubernetes简介#
kubernetes,是一个全新的基于容器技术的分布式架构领先方案,是谷歌严格保密十几年的秘密武器----Borg系统的一个开源版本,于2014年9月发布第一个版本,2015年7月发布第一个正式版本。
kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理。目的是实现资源管理的自动化,主要提供了如下的主要功能:
- 自我修复:一旦某一个容器崩溃,能够在1秒中左右迅速启动新的容器
- 弹性伸缩:可以根据需要,自动对集群中正在运行的容器数量进行调整
- 服务发现:服务可以通过自动发现的形式找到它所依赖的服务
- 负载均衡:如果一个服务起动了多个容器,能够自动实现请求的负载均衡
- 版本回退:如果发现新发布的程序版本有问题,可以立即回退到原来的版本
- 存储编排:可以根据容器自身的需求自动创建存储卷
1.3 kubernetes组件#
一个kubernetes集群主要是由控制节点(master)、工作节点(node)构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策 ( 管理 )
ApiServer : 资源操作的唯一入口,接收用户输入的命令,提供认证、授权、API注册和发现等机制
Scheduler : 负责集群资源调度,按照预定的调度策略将Pod调度到相应的node节点上
ControllerManager : 负责维护集群的状态,比如程序部署安排、故障检测、自动扩展、滚动更新等
Etcd :负责存储集群中各种资源对象的信息
node:集群的数据平面,负责为容器提供运行环境 ( 干活 )
Kubelet : 负责维护容器的生命周期,即通过控制docker,来创建、更新、销毁容器
KubeProxy : 负责提供集群内部的服务发现和负载均衡
Docker : 负责节点上容器的各种操作
下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:
首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中
-
一个nginx服务的安装请求会首先被发送到master节点的apiServer组件
-
apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上
-
在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer
-
apiServer调用controller-manager去调度Node节点安装nginx服务
-
kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod
*pod是kubernetes的最小操作单元,容器必须跑在pod中。*
- 一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理
这样,外界用户就可以访问集群中的nginx服务了
1.4 kubernetes概念#
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
Pod:kubernetes的最小控制单元,容器都是运行在pod中的,一个pod中可以有1个或者多个容器
Controller:控制器,通过它来实现对pod的管理,比如启动pod、停止pod、伸缩pod的数量等等
Service:pod对外服务的统一入口,下面可以维护者同一类的多个pod
Label:标签,用于对pod进行分类,同一类pod会拥有相同的标签
NameSpace:命名空间,用来隔离pod的运行环境
2. kubernetes集群环境搭建#
2.1 前置知识点#
目前生产部署Kubernetes 集群主要有两种方式:
1. kubeadm
Kubeadm 是一个K8s 部署工具,提供kubeadm init 和kubeadm join,用于快速部署Kubernetes 集群。
官方地址:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
2. 二进制包
从github 下载发行版的二进制包,手动部署每个组件,组成Kubernetes 集群。
Kubeadm 降低部署门槛,但屏蔽了很多细节,遇到问题很难排查。如果想更容易可控,推荐使用二进制包部署Kubernetes 集群,虽然手动部署麻烦点,期间可以学习很多工作原理,也利于后期维护。
2.2 kubeadm 部署方式介绍#
kubeadm 是官方社区推出的一个用于快速部署kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes 集群的部署:
- 创建一个Master 节点kubeadm init
- 将Node 节点加入到当前集群中$ kubeadm join <Master 节点的IP 和端口>
2.3 安装要求#
在开始之前,部署Kubernetes 集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统CentOS7.x-86_x64
- 硬件配置:2GB 或更多RAM,2 个CPU 或更多CPU,硬盘30GB 或更多
- 集群中所有机器之间网络互通
- 可以访问外网,需要拉取镜像
- 禁止swap 分区
2.4 最终目标#
- 在所有节点上安装Docker 和kubeadm
- 部署Kubernetes Master
- 部署容器网络插件
- 部署Kubernetes Node,将节点加入Kubernetes 集群中
- 部署Dashboard Web 页面,可视化查看Kubernetes 资源
2.5 准备环境#
角色 | IP地址 | 组件 | 网络 |
---|---|---|---|
k8s-master01 | 192.168.66.10 | docker,kubectl,kubeadm,kubelet | 仅主机模式 |
k8s-node01 | 192.168.66.20 | docker,kubectl,kubeadm,kubelet | 仅主机模式 |
k8s-node02 | 192.168.66.30 | docker,kubectl,kubeadm,kubelet | 仅主机模式 |
harbor仓库 | 192.168.66.100 | docker | 仅主机模式 |
koolshare | 192.168.5.5 | 软路由,负责内部上网 | 仅主机模式 和nat 模式 |
koolshare 作为软路由,负责内部网络上网 仅主机和nat模式,需要2个网卡 |
2.6 环境初始化#
2.6.1 检查操作系统的版本
# 此方式下安装kubernetes集群要求Centos版本要在7.5或之上 [root@master ~]# cat /etc/redhat-release Centos Linux 7.5.1804 (Core)
2.6.2 主机名解析
- 设置主机名
hostnamectl set-hostname k8s-master01 hostnamectl set-hostname k8s-node01 hostnamectl set-hostname k8s-node02 hostnamectl set-hostname harbor
为了方便集群节点间的直接调用,在这个配置一下主机名解析,企业中推荐使用内部DNS服务器
- 主机名解析
编辑三台服务器的/etc/hosts文件,添加下面内容
echo "192.168.88.10 k8s-master01" >> /etc/hosts echo "192.168.88.20 k8s-node01" >> /etc/hosts echo "192.168.88.30 k8s-node02" >> /etc/hosts echo "192.168.88.100 harbor" >> /etc/hosts echo "192.168.88.100 hub.atguigu.com" >> /etc/hosts echo "120.55.105.209 registry.aliyuncs.com" >> /etc/host echo "185.199.108.133 raw.githubusercontent.com" >> /etc/host
2.6.3 时间同步
kubernetes要求集群中的节点时间必须精确一直,这里使用chronyd服务从网络同步时间
企业中建议配置内部的会见同步服务器
# 启动chronyd服务 [root@master ~]# systemctl start chronyd [root@master ~]# systemctl enable chronyd [root@master ~]# date # 设置系统时区为 中国/上海 timedatectl set-timezone Asia/Shanghai # 将当前的 UTC 时间写入硬件时钟 timedatectl set-local-rtc 0 # 重启依赖于系统时间的服务 systemctl restart rsyslog systemctl restart crond
2.6.4 禁用iptable和firewalld服务
kubernetes和docker 在运行的中会产生大量的iptables规则,为了不让系统规则跟它们混淆,直接关闭系统的规则
# 1 关闭firewalld服务 [root@master ~]# systemctl stop firewalld [root@master ~]# systemctl disable firewalld # 2 关闭iptables服务 [root@master ~]# systemctl stop iptables [root@master ~]# systemctl disable iptables
2.6.5 禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
# 编辑 /etc/selinux/config 文件,修改SELINUX的值为disable # 注意修改完毕之后需要重启linux服务 SELINUX=disabled # 或者 setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
2.6.6 禁用swap分区
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 编辑分区配置文件/etc/fstab,注释掉swap分区一行 # 注意修改完毕之后需要重启linux服务 vim /etc/fstab 注释掉 /dev/mapper/centos-swap swap # /dev/mapper/centos-swap swap 或者: swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2.6.7 禁用非必要服务
关闭非必要的服务,提供能系统性能。
systemctl stop postfix && systemctl disable postfix
2.6.8 安装相关工具包
#设置centos镜像 cd /etc/yum.repos.d/ mv * bak/ # 下载镜像 curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 安装工具包 yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat vim wget libseccomp net-tools git lrzsz
2.6.9 修改linux的内核参数
# 修改linux的内核采纳数,添加网桥过滤和地址转发功能 # 编辑/etc/sysctl.d/kubernetes.conf文件,添加如下配置: cd ~ cat > kubernetes.conf <<EOF net.bridge.bridge-nf-call-iptables=1 net.bridge.bridge-nf-call-ip6tables=1 net.ipv4.ip_forward=1 net.ipv4.tcp_tw_recycle=0 vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它 vm.overcommit_memory=1 # 不检查物理内存是否够用 vm.panic_on_oom=0 # 开启 OOM fs.inotify.max_user_instances=8192 fs.inotify.max_user_watches=1048576 fs.file-max=52706963 fs.nr_open=52706963 net.ipv6.conf.all.disable_ipv6=1 net.netfilter.nf_conntrack_max=2310720 EOF # 复制配置文件到 /etc/下 [root@k8s-master01 ~]# cp kubernetes.conf /etc/sysctl.d/kubernetes.conf # 重新加载配置 [root@k8s-master01 ~]# sysctl -p /etc/sysctl.d/kubernetes.conf # 加载网桥过滤模块 [root@master ~]# modprobe br_netfilter # 查看网桥过滤模块是否加载成功 [root@master ~]# lsmod | grep br_netfilter
2.6.10 设置 rsyslogd 和 systemd journald
mkdir /var/log/journal # 持久化保存日志的目录 mkdir /etc/systemd/journald.conf.d cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF [Journal] # 持久化保存到磁盘Storage=persistent # 压缩历史日志 Compress=yes SyncIntervalSec=5m RateLimitInterval=30s RateLimitBurst=1000 # 最大占用空间 10G SystemMaxUse=10G # 单日志文件最大 200M SystemMaxFileSize=200M # 日志保存时间 2 周 MaxRetentionSec=2week #不将日志转发到syslog ForwardToSyslog=no EOF systemctl restart systemd-journald
2.6.11 升级系统内核
CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm # 安装完成后检查 /boot/grub2/grub.cfg 中对应内核 menuentry 中是否包含 initrd16 配置,如果没有,再安装一次! yum --enablerepo=elrepo-kernel install -y kernel-lt # 设置开机从新内核启动 grub2-set-default 'CentOS Linux (5.4.188-1.el7.elrepo.x86_64) 7 (Core)'
2.6.12 配置ipvs功能
# 1.安装ipset和ipvsadm [root@master ~]# yum install ipset ipvsadmin -y # 2.添加需要加载的模块写入脚本文件 [root@master ~]# cat <<EOF> /etc/sysconfig/modules/ipvs.modules #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF # 3.为脚本添加执行权限 [root@master ~]# chmod +x /etc/sysconfig/modules/ipvs.modules # 4.执行脚本文件 [root@master ~]# /bin/bash /etc/sysconfig/modules/ipvs.modules # 5.查看对应的模块是否加载成功 [root@master ~]# lsmod | grep -e ip_vs -e nf_conntrack_ipv4
2.6.13 安装docke
# 1. 切换镜像源 # wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d.docker-ce.repo curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 2. 安装docker依赖的工具和持久化包 yum install -y yum-utils device-mapper-persistent-data lvm2 # 3. 查看所有的可用版本 yum list docker-ce --showduplicates | sort -r # 4.安装特定版本的docker-ce yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io # 5. 添加一个配置文件 #Docker 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs # 6. 创建 /etc/docker 目录 mkdir /etc/docker # 7. 配置 daemon. cat > /etc/docker/daemon.json <<EOF { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "insecure-registries": ["http://192.168.88.100"] } EOF # 8. 设置服务 mkdir -p /etc/systemd/system/docker.service.d # 9. 启动dokcer systemctl daemon-reload && systemctl restart docker && systemctl enable docker
2.6.14 安装Kubernetes组件
# 1. 由于kubernetes的镜像在国外,速度比较慢,这里切换成国内的镜像源 # 2. 编辑/etc/yum.repos.d/kubernetes.repo,添加下面的配置 cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF # 3.安装kubeadm、kubelet和kubectl yum install -y kubelet-1.21.5 kubeadm-1.21.5 kubectl-1.21.5 --disableexcludes=kubernetes # 4. 配置kubelet的cgroup (配置ivps,后面也可以配置) #编辑/etc/sysconfig/kubelet, 添加下面的配置 KUBELET_CGROUP_ARGS="--cgroup-driver=systemd" KUBE_PROXY_MODE="ipvs" # 5. 启动 kubelet 服务 systemctl enable kubelet.service && systemctl restart kubelet.service
2.6.15 准备集群镜像#
在安装kubernetes集群之前,必须要提前准备好集群需要的镜像,所需镜像可以通过下面命令查看
[root@k8s-master01 ~]# kubeadm config images list
下载镜像
此镜像kubernetes的仓库中,由于网络原因,无法连接,下面提供了一种替换方案
vim load-images.sh
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in ${images[@]};do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
集群初始化
第一种
下面的操作只需要在master节点上执行即可
创建集群
[root@master ~]# kubeadm init
--apiserver-advertise-address=192.168.88.100
--image-repository registry.aliyuncs.com/google_containers
--kubernetes-version=v1.21.5
--service-cidr=10.96.0.0/12
--pod-network-cidr=10.244.0.0/16
第二种: 手动修改kubeadm-config.yaml 文件
kubeadm config print init-defaults > kubeadm-config.yaml
vim kubeadm-config.yaml
advertiseAddress: 192.168.88.10 # 配置主机IP
imageRepository: registry.aliyuncs.com/google_containers # 修改镜像下载地址
kubernetesVersion: 1.21.5 #设置版本
networking:
dnsDomain: cluster.local
podSubnet: "10.244.0.0/16" # 设置pod 网络
serviceSubnet: 10.96.0.0/12
查看所需的镜像文件
[root@k8s-master01 ~]# kubeadm config images list --config kubeadm-config.yaml
registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.5
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.5
registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.5
registry.aliyuncs.com/google_containers/kube-proxy:v1.21.5
registry.aliyuncs.com/google_containers/pause:3.4.1
registry.aliyuncs.com/google_containers/etcd:3.4.13-0
registry.aliyuncs.com/google_containers/coredns:v1.8.0
[root@k8s-master01 ~]#
拉去所需要的镜像
因网络问题,无法拉取,需要配置地址:echo "120.55.105.209 registry.aliyuncs.com" >> /etc/host
[root@k8s-master01 ~]# kubeadm config images pull --config kubeadm-config.yaml
如果是内网,可以将包先下载好,然后导入,导入方式请看2.6.11 的load-images.sh 脚本
初始化操作
[root@k8s-master01 ~]# kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.log
安装完成后会生成
将node机器加入到集群中的命令.分别再集群node 中执行,将node加入急群众
kubeadm join 192.168.88.10:6443 --token abcdef.0123456789abcdef
--discovery-token-ca-cert-hash sha256:cdc49b48bf9de52eabef39cee3c2b41ad744f4cc9d9133d11318e4d0f45a5f6f
安装失败重置
kubeadm reset 重置 主节点执行
kubeadm reset -f #清理加入信息 节点执行
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a && kubeadm reset && systemctl daemon-reload && systemctl restart kubelet && iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
查看token
kubeadm token list
重新生产永久token (token 过期,可用来生成)
kubeadm token create --ttl 0 --print-join-command
创建必要文件
[root@master ~]# mkdir -p $HOME/.kube
[root@master ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
[root@master ~]# sudo chown $(id -u)😒(id -g) $HOME/.kube/config
查看启动接口 kube-apiserve
[root@k8s-master01 ~]# netstat -pnlt | grep 6443
查看版本
[root@k8s-master01 ~]# kubeadm version
[root@k8s-master01 ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.5", GitCommit:"aea7bbadd2fc0cd689de94a54e5b7b758869d691", GitTreeState:"clean", BuildDate:"2021-09-15T21:09:27Z", GoVersion:"go1.16.8", Compiler:"gc", Platform:"linux/amd64"}
下面的操作只需要在node节点上执行即可
kubeadm join 192.168.0.100:6443 --token awk15p.t6bamck54w69u4s8
--discovery-token-ca-cert-hash sha256:a94fa09562466d32d29523ab6cff122186f1127599fa4dcd5fa0152694f17117
在master上查看节点信息
[root@master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 6m v1.17.4
node1 NotReady
node2 NotReady
2.6.13 安装网络插件flanneld,只在master节点操作即可
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
由于外网不好访问,如果出现无法访问的情况,可以直接用下面的 记得文件名是kube-flannel.yml,位置:/root/kube-flannel.yml内容
https://github.com/flannel-io/flannel/tree/master/Documentation/kube-flannel.yml
2.6.14 使用kubeadm reset重置集群
在master节点之外的节点进行操作
kubeadm reset
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
重启kubelet#
systemctl restart kubelet
重启docker#
systemctl restart docker
2.6.15 重启kubelet和docker
重启kubelet
systemctl restart kubelet
重启docker
systemctl restart docker
使用配置文件启动fannel
kubectl apply -f kube-flannel.yml
2.6.16 kubeadm中的命令
生成 新的token
[root@master ~]# kubeadm token create --print-join-command
手动安装网络插件flanneld
1、准备2个文件,kube-flannel.yml文件的镜像的路径必须跟flanneld-v0.19.1-amd64.docker的版本一致
flanneld-v0.19.1-amd64.docker
kube-flannel.yml
2、导入flanneld docker (每个节点都要执行,否则各节点的flanneld拉取镜像失败。)
[root@k8s-master01 ~]# docker load -i flanneld-v0.19.1-amd64.docker
3、启动
kubectl apply -f kube-flannel.yml
删除
kubectl delete -f kube-flannel.yml
4、查看启动状态。
kubectl get pod -n kube-system
参数 -w 实时查看
发现kube-flannel-ds-x8g6k 的状态为running。
发现 kube-flannel-ds 相关的为runnning 后。
重新生产永久token (token 过期,可用来生成)
kubeadm token create --ttl 0 --print-join-command
然后再各node 执行,将node机器加入到集群中,通过 kubectl get pod -n kube-system -w 试试启动信息
命令:
1、查看 kube-system 空间下的pod 。
参数-n 指定
参数-w 实时监控
参数 -o wide 查看详细信息
kubectl get pod -n kube-system
kubectl get pod -n kube-system -o wide
kubectl get pod -n kube-system -o wide -w
2.7 集群测试#
2.7.1 创建一个nginx服务
kubectl create deployment nginx --image=nginx:1.14-alpine 2.7.2 暴露端口
kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
2.7.3 查看服务
kubectl get pod,svc 2.7.4 查看pod  2.7.5 浏览器测试结果:   
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了