返回顶部
首页 > 资讯 > 前端开发 > VUE >如何理解Kubernetns容器与VM的编排
  • 917
分享到

如何理解Kubernetns容器与VM的编排

2024-04-02 19:04:59 917人浏览 薄情痞子
摘要

这篇文章主要讲解了“如何理解Kubernetns容器与VM的编排”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Kubernetns容器与VM的编排”

这篇文章主要讲解了“如何理解Kubernetns容器与VM的编排”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Kubernetns容器与VM的编排”吧!

开始之前

我在开发集群中使用ubuntu 20.04和两个裸机服务器。尽管我在“第1步”中对如何创建类似的开发集群进行了解释,但是如果您已经选择了其他kubernetes或OpenShift环境,则可以安全地跳过它。

要求:

至少一台具有2个CPU,4GB Ram和20GB存储空间的主机

kubectl命令行实用程序

ssh客户端

KubeVirt安装与管理

步骤1:建立集群

在开始创建集群之前,让我们对主机进行初始化配置以适合Kubernetes。查看这个官方的教程(https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/)并准备您的主机。

让我们创建一个Kubernetes集群

sudo kubeadm init --pod-network-cidr=192.168.0.0/16

执行以下命令来配置kubectl:

mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config

移除master上的污点,以便您可以在其上调度pod。

kubectl taint nodes --all node-role.kubernetes.io/master-

它应该返回以下内容:

node/<your-hostname> untainted

步骤2:安装Calico

使用清单安装Calico

kubectl apply -f Https://docs.projectcalico.org/manifests/calico.yaml

步骤3:安装KubeVirt

使用namespace,我们可以将资源隔离到逻辑模块中,并且可以更轻松地管理它们。

kubectl create namespace kubevirt

建议使用支持硬件虚拟化的主机,以确保您的主机能够使用virt-host-validate二进制文件。

virt-host-validate qemu QEMU: Checking for hardware virtualization               :PASS

如果主机缺少此命令,则可以使用发行版软件包管理器进行安装,也可以使用来检查kvm文件夹是否可用 ls /dev/kvm。

默认情况下,KubeVirt尝试利用硬件仿真。但是,此功能并非在所有环境中都可用,在这种情况下,您可以使用以下方式启用软件仿真:

kubectl create configmap -n kubevirt kubevirt-config \ --from-literal debug.useEmulation=true

应用这些清单并运行KubeVirt operator以自动安装所有必需的资源。

kubectl apply -f https://GitHub.com/kubevirt/kubevirt/releases/download/v0.38.1/kubevirt-operator.yaml kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/v0.38.1/kubevirt-cr.yaml

启用迁移功能。(该功能依赖于存储)

kubectl create configmap -n kubevirt kubevirt-config --from-literal feature-gates="LiveMigration"

启用VNC代理功能组件。

kubectl apply -f kubevirt/vnc.yaml

您可以使用此命令检查KubeVirt的安装进度。

kubectl -n kubevirt wait kv kubevirt --for condition=Available

步骤4:创建一个简单的VM

首先,我们创建一个namespace来隔离此演示的资源。

kubectl create namespace kv-policy-demo

现在,使用虚拟机实例(VMI)定制资源,我们可以创建与Kubernetes完全集成的VM。

kubectl create -f - <<EOF apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachineInstance metadata:   name: vmi-cirros   namespace: kv-policy-demo   labels:     special: l-vmi-cirros spec:   domain:     devices:       disks:       - disk:           bus: virtio         name: containerdisk     resources:       requests:         memory: 64M   volumes:   - name: containerdisk     containerDisk:       image: kubevirt/cirros-reGIStry-disk-demo:latest EOF

请注意,如果您使用的是软件仿真,则启动虚拟机可能会非常慢,并且完成IP地址分配可能需要5到6分钟的时间。

kubectl create -f - <<EOF apiVersion: v1 kind: Service metadata:   name: vmi-cirros-ssh-svc   namespace: kv-policy-demo spec:   ports:   - name: crriOS-ssh-svc     nodePort: 30000     port: 27017     protocol: tcp     targetPort: 22   selector:     special: l-vmi-cirros   type: NodePort EOF

通过使用您节点的IP地址通过服务节点端口进行访问,确认我们可以使用SSH访问VM 。默认密码是Gocubsgo。

ssh cirros@10.1.2.3 -p 30000

通过从新的虚拟机ping google来确认虚拟机可以访问外界。

ping www.google.com -c 5

步骤5:添加网络安全性

应用以下策略在其namespace中隔离VM。这将仅将允许入向为SSH的协议,并且阻止所有出现的流量VM。(取决于您的VM,您将需要其他策略,但是此简单策略对本教程很有用。)

kubectl create -f - <<EOF apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata:  name: only-allow-ingress-ssh-to-vm  namespace: kv-policy-demo spec:  podSelector:    matchLabels:      special: l-vmi-cirros  policyTypes:  - Ingress  - Egress  ingress:  - from:    ports:    - port: 22 EOF

SSH进入虚拟机,然后尝试再次ping google。

您将无法执行此操作,因为该策略将阻止所有从Pod发起的与外界的通信。这非常强大&ndash;您可以使用与保护Pod相同的范例来保护VM!

步骤6:访问虚拟机

现在我们已经为基于Kubernetes的VM管理设置了Kubevirt,现在让我们访问我们的VM。

  • 使用NodePort服务和弱密码在外部公开VM时要小心

  • 串行控制台仅可通过kubectl virt插件使用

  • SSH以root用户身份登录

通过virt:

  • SSH访问:

kubectl virt expose vmi test-vm --port=22 --name=test-vm-ssh --type=NodePort
  • 串行控制台:

virtctl console test-vm

不通过virt:

apiVersion: v1 kind: Service metadata:   name: test-vm-ssh   namespace: default spec:   ports:   - name: test-vm-ssh     protocol: TCP     port: 22     targetPort: 22   selector:     kubevirt.io/name: test-vm   type: NodePort

使用VNC:

  • 如果尚未启用VNC

kubectl apply -f kubevirt/vnc/vnc.yaml
  • 查找VNC服务节点端口

  • 在以下位置访问VM

http://NODE_IP:NODEPORT/?namespace=VM_NAMESPACE

  • 仅显示namespace VM_NAMESPACE下的VM。选择所需虚拟机所在的namespace。

步骤7:测试CDI

  • 在应用之前,请确保填写DataVolume/VM清单中的所有变量以适合您的环境

  • 尝试创建一个DataVolume

kubectl apply -f datavolume/datavolume-cirros.yaml kubectl apply -f datavolume/datavolume-ubuntu.yaml kubectl get datavolumes
  • 在VM清单中即时使用DataVolume

kubectl apply -f vm/CDI-PVC.yaml

步骤8:清理

要清除本指南中使用的namespace和VM,可以运行以下命令

kubectl delete namespace kv-policy-demo

其他:故障排除

  • 确保Kubernetes有足够的备用CPU/RAM来部署您请求的VM

  • 确保硬件虚拟化受支持并且可用,或者ConfigMap中存在软件虚拟化标志

  • 更改标志需要重新启动部署

  • 确保服务选择器正确定位到VM Pod

  • 检查Docker MTU和CNI插件MTU是否适合您的网络

  • 使用kubectl virt console $VM_NAME_HERE以确保虚拟机已启动

从内部监控KubeVirt VM

部署Prometheus Operator

一旦准备好了k8s集群,就是部署prometheus Operator。原因是KubeVirt CR安装在群集上时将检测ServiceMonitor CR是否已存在。如果是这样,那么它将创建ServiceMonitors,这些ServiceMonitors被配置为可立即监控所有KubeVirt组件(virt-controller,virt-api和virt-handler)。

尽管本文中没有介绍监控KubeVirt本身,但是还是在部署KubeVirt之前先部署Prometheus Operator。

要部署Prometheus Operator,您需要首先创建其namespace,例如monitoring:

kubectl create ns monitoring

然后在新的namespace中部署operator:

helm fetch stable/prometheus-operator tar xzf prometheus-operator*.tgz cd prometheus-operator/ && helm install -n monitoring -f values.yaml kubevirt-prometheus stable/prometheus-operator

部署完所有内容后,您可以删除helm下载的所有内容:

cd .. rm -rf prometheus-operator*

要记住的一件事是我们在此处添加的版本名称:kubevirt-prometheus。ServiceMonitor稍后声明我们时将使用版本名称。

部署具有持久性存储的VirtualMachine

现在,我们已经准备好所需要的一切。下面让我们配置虚拟机。

我们将从CDI的DataVolume(https://github.com/kubevirt/containerized-data-importer/blob/master/doc/datavolumes.md)资源PersistenVolume开始。由于我没有动态存储提供程序,因此我将创建2个PV,引用将声明它们的PVC。注意每个PV的claimRef。

apiVersion: v1 kind: PersistentVolume metadata:   name: example-volume spec:   storageClassName: ""   claimRef:     namespace: default     name: cirros-dv   acceSSModes:     - ReadWriteOnce   capacity:     storage: 2Gi   hostPath:     path: /data/example-volume/ --- apiVersion: v1 kind: PersistentVolume metadata:   name: example-volume-scratch spec:   storageClassName: ""   claimRef:     namespace: default     name: cirros-dv-scratch   accessModes:     - ReadWriteOnce   capacity:     storage: 2Gi   hostPath:     path: /data/example-volume-scratch/

有了永久性存储后,我们可以使用以下清单创建虚拟机:

apiVersion: kubevirt.io/v1alpha3 kind: VirtualMachine metadata:   name: monitorable-vm spec:   running: true   template:     metadata:       name: monitorable-vm       labels:         prometheus.kubevirt.io: "node-exporter"     spec:       domain:         resources:           requests:             memory: 1024Mi         devices:           disks:           - disk:               bus: virtio             name: my-data-volume       volumes:       - dataVolume:           name: cirros-dv         name: my-data-volume   dataVolumeTemplates:   - metadata:       name: "cirros-dv"     spec:       source:           http:              url: "https://download.cirros-cloud.net/0.4.0/cirros-0.4.0-x86_64-disk.img"       pvc:         storageClassName: ""         accessModes:           - ReadWriteOnce         resources:           requests:             storage: "2Gi"

注意,KubeVirt的VirtualMachine资源有一个VirtualMachine模板和一个dataVolumeTemplate。在VirtualMachine模板上,重要的是要注意我们已将VM命名为VM monitorable-vm,以后将使用该名称连接到其控制台virtctl。我们添加的标签prometheus.kubevirt.io: "node-exporter"也很重要,因为在VM内部安装与配置node-exporter时将会使用到它。

在dataVolumeTemplate上,需要注意的是,我们将PVC命名为cirros-dv,DataVolume资源将用它创建2个PVC,cirros-dv和cirros-dv-scratch。注意,cirros-dv和cirros-dv-scratch是PersistentVolume清单上引用的名称。名称必须匹配才能工作。

在VM内安装node-exporter

一旦VirtualMachineInstance运行,我们就可以使用virtctl console monitorable vm连接到它的控制台。如果需要用户和密码,请提供相应的凭据。如果您使用的是本指南中的同一磁盘映像,则用户和密码分别为cirros和gocubsgo

以下脚本将安装node-exporter并将虚拟机配置为在启动时候自启:

curl -LO -k https://github.com/prometheus/node_exporter/releases/download/v1.0.1/node_exporter-1.0.1.linux-amd64.tar.gz gunzip -c node_exporter-1.0.1.linux-amd64.tar.gz | tar xopf - ./node_exporter-1.0.1.linux-amd64/node_exporter &  sudo /bin/sh -c 'cat > /etc/rc.local <<EOF #!/bin/sh echo "Starting up node_exporter at :9100!"  /home/cirros/node_exporter-1.0.1.linux-amd64/node_exporter 2>&1 > /dev/null & EOF' sudo chmod +x /etc/rc.local

PS:如果您使用其他基础映像,请配置node-exporter以在启动时相应地启动

配置Prometheus抓取VM的node-exporter

配置Prometheus来抓取node-exporter非常简单。我们需要做的就是创建一个新的Service和一个ServiceMonitor:

apiVersion: v1 kind: Service metadata:   name: monitorable-vm-node-exporter   labels:     prometheus.kubevirt.io: "node-exporter" spec:   ports:   - name: metrics     port: 9100     targetPort: 9100     protocol: TCP   selector:     prometheus.kubevirt.io: "node-exporter" --- apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata:   name: kubevirt-node-exporters-servicemonitor   namespace: monitoring   labels:     prometheus.kubevirt.io: "node-exporter"     release: monitoring spec:   namespaceSelector:     any: true   selector:     matchLabels:       prometheus.kubevirt.io: "node-exporter"   endpoints:   - port: metrics     interval: 15s

让我们分解一下,以确保我们正确设置了所有内容。从Service开始:

spec:   ports:   - name: metrics     port: 9100     targetPort: 9100     protocol: TCP   selector:     prometheus.kubevirt.io: "node-exporter"

在规范中,我们正在创建一个名为metrics的新端口,该端口将重定向到每个标记为prometheus.kubevirt.io: "node-exporter",此处为端口9100,这是node_exporter的默认端口号。

apiVersion: v1 kind: Service metadata:   name: monitorable-vm-node-exporter   labels:     prometheus.kubevirt.io: "node-exporter"

我们还在为服务本身贴上标签prometheus.kubevirt.io: "node-exporter",将由ServiceMonitor对象使用。现在让我们看看我们的ServiceMonitor规范:

spec:   namespaceSelector:     any: true   selector:     matchLabels:       prometheus.kubevirt.io: "node-exporter"   endpoints:   - port: metrics     interval: 15s

由于我们的ServiceMonitor将部署在monitoring namespace中,而我们的服务则在default namespace中,因此我们需要设置namespaceSelector.any=true。

我们还告诉ServiceMonitor,Prometheus需要从标记为prometheus.kubevirt.io: "node-exporter"以及哪些端口被命名为metrics。幸运的是,我们的service就是这么做的!

最后一件要注意的事。Prometheus配置可以设置为监视多个ServiceMonitors。我们可以通过以下命令查看prometheus正在监视的服务:

# Look for Service Monitor Selector kubectl describe -n monitoring prometheuses.monitoring.coreos.com monitoring-prometheus-oper-prometheus

确保我们的ServiceMonitor具有Prometheus的Service Monitor Selector的所有标签。一个常见的选择器是我们在部署helm的prometheus时设置的版本名称!

测试

您可以通过端口转发Prometheus WEB UI并执行一些ProMQL来进行快速测试:

kubectl port-forward -n monitoring prometheus-monitoring-prometheus-oper-prometheus-0 9090:9090

为确保一切正常,请访问localhost:9090/graph并执行PromQL up{pod=~"virt-launcher.*"}。Prometheus应该返回从monitorable-vm的node-exporter收集的数据。

您可以试用virtctl,停止和启动VM,以查看指标的行为。您会注意到,使用停止VM时virtctl stop monitorable-vm,VirtualMachineInstance被杀死,因此它也是Pod。这将导致我们的服务无法找到pod的端点,然后将其从Prometheus的目标中删除。

由于这种行为,下面的告警规则将无法正常工作,因为我们的目标实际上已经消失了,而不是降级了。

- alert: KubeVirtVMDown     expr: up{pod=~"virt-launcher.*"} == 0     for: 1m     labels:       severity: warning     annotations:       summary: KubeVirt VM {{ $labels.pod }} is down.

但是,如果VM在不停止的情况下连续崩溃,则pod不会被杀死,并且仍将监视目标。node-exporter永远不会启动或将与VM一起不断关闭,因此这样的警报可能会起作用:

- alert: KubeVirtVMCrashing     expr: up{pod=~"virt-launcher.*"} == 0     for: 5m     labels:       severity: critical     annotations:       summary: KubeVirt VM {{ $labels.pod }} is constantly crashing before node-exporter starts at boot.

感谢各位的阅读,以上就是“如何理解Kubernetns容器与VM的编排”的内容了,经过本文的学习后,相信大家对如何理解Kubernetns容器与VM的编排这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 如何理解Kubernetns容器与VM的编排

本文链接: https://lsjlt.com/news/83140.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何理解Kubernetns容器与VM的编排
    这篇文章主要讲解了“如何理解Kubernetns容器与VM的编排”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解Kubernetns容器与VM的编排”...
    99+
    2024-04-02
  • 使用C++进行云容器化:容器编排与管理
    在云中使用 c++++ 容器化应用程序的最佳实践涉及容器编排和管理。容器编排工具包括 kubernetes、docker swarm 和 apache mesos,可管理和协调容器。容器...
    99+
    2024-05-11
    容器编排 云容器 docker apache c++ 容器化应用
  • 怎么理解Kubernetes容器编排的构建块
    本篇内容主要讲解“怎么理解Kubernetes容器编排的构建块”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解Kubernetes容器编排的构建块”吧!容...
    99+
    2024-04-02
  • 操作系统容器编排与云计算:如何将容器编排技术应用到云端,发挥更强大的威力
    容器编排技术已经成为云计算中的一项重要技术,它可以帮助用户管理和调度多个容器,使它们能够以一种协同的方式运行。容器编排技术也有助于提高容器的安全性、可靠性和可用性。 将容器编排技术应用到云端,可以带来许多好处。首先,可以提高容器的安全性...
    99+
    2024-02-12
    容器编排 云计算 Docker K8s Swarm
  • 用服务器容器编排工具轻松管理您的容器
    容器编排工具是用于管理和协调容器化应用程序的软件工具,容器编排工具允许您轻松地管理和协调容器化的应用程序,提高应用程序的可用性和可靠性。它可以为您提供以下好处: 提高应用程序的可用性: 容器编排工具可以自动重启失败的容器,并确保容器在...
    99+
    2024-02-09
    容器编排工具 Docker Swarm Kubernetes Mesos Marathon
  • Kubernetes 与 ASP.NET Core 的共舞:探索容器编排的艺术
    Kubernetes 作为当今容器编排的领导者,与 ASP.NET Core 的结合,为构建现代化、可扩展且易于管理的分布式系统提供了强大的解决方案。在这篇实战指南中,我们将带领您从零开始,深入探索 Kubernetes 与 ASP.NE...
    99+
    2024-02-21
    Keywords: Kubernetes, ASP.NET Core, Docker, Containerization, Distributed Systems
  • 了解服务器容器编排工具的最新趋势
    容器编排工具的最新趋势 服务网格的兴起 服务网格是一种用于管理和保护微服务的网络基础设施层。它可以提供诸如负载均衡、服务发现、故障转移和安全等功能。 演示代码: apiVersion: networking.istio.io/v1be...
    99+
    2024-02-09
    容器编排工具 Kubernetes Docker Swarm Mesos Nomad
  • 如何理解Elasticsearch倒排索引与分词
    本篇内容主要讲解“如何理解Elasticsearch倒排索引与分词”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Elasticsearch倒排索引与分词...
    99+
    2024-04-02
  • 如何理解StatefulSet中应用编排工具Deployment
    这篇文章给大家介绍如何理解StatefulSet中应用编排工具Deployment,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、“有状态”需求我们之前讲到过 Deployment 作为一个应用编排管理工具,它为我们...
    99+
    2023-06-04
  • 如何使用服务器容器编排工具实现高可用性
    服务器容器编排工具是一种管理和协调多个服务器容器的软件工具。它可以帮助您实现应用程序的高可用性、可扩展性和灵活性。 1. Kubernetes Kubernetes 是一个开源的服务器容器编排工具,由 Google 开发。它是最流行的服...
    99+
    2024-02-09
    文章 服务器容器编排工具 Kubernetes Docker Swarm 高可用性
  • 揭秘容器编排工具的秘密:如何选择适合您的工具
    容器编排工具的目的是通过自动化容器的部署、扩展和管理来实现应用程序的可扩展性和可靠性。容器编排工具通常提供以下功能: 容器编排:管理容器的调度、放置和生命周期,以确保应用程序的可用性和性能。 服务发现:帮助容器相互发现并进行通信,提供负...
    99+
    2024-02-09
    容器编排工具, Kubernetes, Docker Swarm, Mesos, Nomad, Hashicorp Consul, etcd, Istio, Prometheus, Grafana
  • 如何在Fedora系统上安装和配置容器编排工具
    在Fedora系统上安装和配置容器编排工具可以采用以下步骤: 安装Docker: 首先,需要安装Docker引擎。在终端中执行以下...
    99+
    2024-04-02
  • 如何理解Java 容器中并发容器的源码分析
    这期内容当中小编将会给大家带来有关如何理解Java 容器中并发容器的源码分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。如果没有特别说明,以下源码分析基于 JDK 1.8。CopyOnWriteArra...
    99+
    2023-06-05
  • C++11如何管理容器的容量
    本篇内容介绍了“C++11如何管理容器的容量”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!capacity和size理解capacity和s...
    99+
    2023-06-19
  • Python如何实现将内容转为base64编码与解码
    今天小编给大家分享一下Python如何实现将内容转为base64编码与解码的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、...
    99+
    2023-07-05
  • ASP 容器是如何与 Laravel 框架兼容的?
    随着PHP在Web开发中的广泛应用,PHP框架的使用也越来越普遍。Laravel框架是一个流行的PHP框架,它提供了许多有用的功能和工具,使开发者能够快速构建高质量的Web应用程序。然而,在一些特定的情况下,我们可能需要将Laravel应...
    99+
    2023-09-30
    容器 关键字 laravel
  • 如何了解用于Linux和 Windows容器的Docker容器主机与容器操作系统
    如何了解用于Linux和 Windows容器的Docker容器主机与容器操作系统,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。让我们来探讨一下容器主机和容器操作系统之间的关...
    99+
    2023-06-16
  • 如何理解C++编译器编译功能
    如何理解C++编译器编译功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。下面深度讲解C++中的大规模C++编译器,C++编译器具有很强的复杂性,并且源程序的行数也是非常多...
    99+
    2023-06-17
  • 如何理解Java容器中的设计模式
    如何理解Java容器中的设计模式,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、迭代器模式Collection 继承了 Iterable 接口,其中的 iterator(...
    99+
    2023-06-05
  • 如何理解Spring的Registrar倒排思想
    这篇文章主要介绍“如何理解Spring的Registrar倒排思想”,在日常操作中,相信很多人在如何理解Spring的Registrar倒排思想问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作