Kubernetes 问世于 2015 年,从一开始秉持着松耦合和可扩展的设计理念,也因此带来了 Kubernetes 生态的蓬勃发展。但这些大部分先限制在单一集群内,然后由于种种原因和目的企业内部创建的集群越来越多,比如单集群故障、监管要求、异地多机房可用区容灾、出于敏捷、降本考虑的混合云、多云部署、单一集群的承载能力受限、多版本 Kubernetes 集群共存等。
多集群之后除了提升管理的难度外,首当其冲的就是多集群间的流量调度,这也是多集群部署的基础。没有跨集群的通信,多集群的收益也会大打折扣。
年初的时候我们曾在 [Flomesh 多集群流量调度] 一文中介绍过多集群流量调度的方案,这次我们对其进行了升级,将 FSM[1] 与我们 [服务网格产品] 集成实现流量在多个集群间的自由调度。
在这个方案中主要关注几个点:
目前的方案还是 beta 版本,预计会在下个月的版本中正式发布。
fsm-architecture
FSM 是 Flomesh 的另一款开源产品,用于 Kubernetes 南北向的流量管理。FSM 以可编程代理 Pipy 为核心,提供了 Ingress 管理器、Gateway API* 实现、负载均衡器以及跨集群的服务注册发现等功能。FSM 的使用,曾经在多篇文章中介绍过:
参与跨集群调度的集群,我们称之为集群联邦。一个集群要加入集群联邦,需要在 控制平面 所在的集群中 注册 该集群。
集群的注册是通过 CRD Cluster
来完成的。
Cluster
CRD在注册集群时,我们提供如下信息:
gatewayHost: cluster-A.host
)和端口 (gatewayPort: 80
)kubeconfig
,包含了 api-server 地址以及证书和秘钥等信息apiVersion: flomesh.io/v1alpha1
kind: Cluster
metadata:
name: cluster-A
spec:
gatewayHost: cluster-A.host
gatewayPort: 80
kubeconfig: |+
---
apiVersion: v1
clusters:
- cluster:
certificate-authority-data:
server: https://cluster-A.host:6443
name: cluster-A
contexts:
- context:
cluster: cluster-A
user: admin@cluster-A
name: cluster-A
current-context: cluster-A
kind: Config
preferences: {}
users:
- name: admin@cluster-A
user:
client-certificate-data:
client-key-data:
ServiceExport
和 ServiceImport
CRD在跨集群的服务注册方面,FSM 参考了 KEP-1645: Multi-Cluster Services API[2] 中的 ServiceExport
和 ServiceImport
提供了 ServiceExports.flomesh.io
和 ServiceImports.flomesh.io
两个 CRD。前者用于向控制平面注册服务,声明应用可以跨集群提供服务,而后者则用于引用其他集群的服务。而在服务网格 osm-edge 中,将 ServiceImports
导入的服务做服务提供者。
对于加入集群联邦的集群 cluser-A
和 cluster-B
来说,在集群 cluster-A
的命名空间 bar
下存在名为 foo
的 Service
,并在在同命名空间下创建同名的 ServiceExport``foo
。在集群 cluster-B
的命名空间 bar
(若不存在,会自动创建) 下会自动创建同名的 ServiceImport
资源。
// in cluster-A
apiVersion: v1
kind: Service
metadata:
name: foo
namespace: bar
spec:
ports:
- port: 80
selector:
app: foo
---
apiVersion: flomesh.io/v1alpha1
kind: ServiceExport
metadata:
name: foo
namespace: bar
---
// in cluster-B
apiVersion: flomesh.io/v1alpha1
kind: ServiceImport
metadata:
name: foo
namespace: bar
上面的 YAML 片段展示了如何向多集群的控制面注册 foo
服务。下面我们将通过稍微复杂的场景来介绍跨集群的服务注册和流量调度。
kubectx
:用于多个 kubeconfig context (集群)间进行切换k3d
:在本地使用容器创建多个 k3s 集群helm
:部署 fsmdocker
:容器中运行 k3s 需要Golang
:fsm 处于开发阶段,用来生成 helm chartarchitecture
这里我们需要创建 4 个集群,使用 k3d 在本地创建 4 个集群,分别是 control-plane
、cluster-1
、cluster-2
和 cluster-3
。
在创建时,将其 api-server 地址的监听改为上面拿到的主机 IP 地址,这样当从 control-plane
去访问其他集群的 api-server 时,可以通过主机 IP 地址进行访问。这还并不够,还需要为其指定个端口并映射到本地。
注:控制平面集群可以与任一应用集群合并,独立集群只是建议选择。
集群 | 对外访问地址 | api-server 对外端口 | LB 对外端口 | 描述 |
---|---|---|---|---|
control-plane | HOST_IP(192.168.1.110) | 6444 | N/A | 控制平面集群 |
cluster-1 | HOST_IP(192.168.1.110) | 6445 | 81 | 应用集群 |
cluster-2 | HOST_IP(192.168.1.110) | 6446 | 82 | 应用集群 |
cluster-3 | HOST_IP(192.168.1.110) | 6447 | 83 | 应用集群 |
创建一个 bridge
类型的网络 multi-clusters
,所有的容器都工作在这个网络中。
docker network create multi-clusters
获取主机 IP 地址备用,192.168.1.110
是我本机的地址。
export HOST_IP=192.168.1.110
使用 k3d 创建 4 个 集群。
API_PORT=6444 #6444 6445 6446 6447
PORT=80 #81 82 83
for CLUSTER_NAME in control-plane cluster-1 cluster-2 cluster-3
do
k3d cluster create ${CLUSTER_NAME} \
--image docker.io/rancher/k3s:v1.23.8-k3s2 \
--api-port "${HOST_IP}:${API_PORT}" \
--port "${API_PORT}:6443@server:0" \
--port "${PORT}:80@server:0" \
--servers-memory 4g \
--k3s-arg "--disable=traefik@server:0" \
--network multi-clusters \
--timeout 120s \
--wait
((API_PORT=API_PORT+1))
((PORT=PORT+1))
done
在四个集群中安装 FSM。
helm repo update
export FSM_NAMESPACE=flomesh
export FSM_VERSION=0.2.0-alpha.9
for CLUSTER_NAME in control-plane cluster-1 cluster-2 cluster-3
do
kubectx k3d-${CLUSTER_NAME}
sleep 1
helm install --namespace ${FSM_NAMESPACE} --create-namespace --version=${FSM_VERSION} --set fsm.logLevel=5 fsm fsm/fsm
sleep 1
kubectl wait --for=condition=ready pod --all -n $FSM_NAMESPACE
done
将集群 cluster-1
、cluster-2
和 cluster-3
纳入集群 control-plane
的管理。
export HOST_IP=192.168.1.110
kubectx k3d-control-plane
sleep 1
PORT=81
for CLUSTER_NAME in cluster-1 cluster-2 cluster-3
do
cat <<EOF
apiVersion: flomesh.io/v1alpha1
kind: Cluster
metadata:
name: ${CLUSTER_NAME}
spec:
gatewayHost: ${HOST_IP}
gatewayPort: ${PORT}
kubeconfig: |+
`k3d kubeconfig get ${CLUSTER_NAME} | sed 's|^| |g' | sed "s|0.0.0.0|$HOST_IP|g"`
EOF
((PORT=PORT+1))
done
下载 osm CLI
将服务网格 osm-edge 安装到集群 cluster-1
、cluster-2
和 cluster-3
。控制平面不处理应用流量,无需安装。
export OSM_NAMESPACE=osm-system
export OSM_MESH_NAME=osm
for CLUSTER_NAME in cluster-1 cluster-2 cluster-3
do
kubectx k3d-${CLUSTER_NAME}
DNS_SVC_IP="$(kubectl get svc -n kube-system -l k8s-app=kube-dns -o jsonpath='{.items[0].spec.clusterIP}')"
osm install \
--mesh-name "$OSM_MESH_NAME" \
--osm-namespace "$OSM_NAMESPACE" \
--set=osm.certificateProvider.kind=tresor \
--set=osm.image.pullPolicy=Always \
--set=osm.sidecarLogLevel=error \
--set=osm.controllerLogLevel=warn \
--timeout=900s \
--set=osm.localDNSProxy.enable=true \
--set=osm.localDNSProxy.primaryUpstreamDNSServerIPAddr="${DNS_SVC_IP}"
done
在集群 cluster-1
和 cluster-3
的 httpbin
命名空间(由网格管理,会注入 sidecar)下,部署 httpbin
应用。这里的 httpbin
应用由 Pipy[3] 实现,会返回当前的集群名,并提示被网格管理。
export NAMESPACE=httpbin
for CLUSTER_NAME in cluster-1 cluster-3
do
kubectx k3d-${CLUSTER_NAME}
kubectl create namespace ${NAMESPACE}
osm namespace add ${NAMESPACE}
kubectl apply -n ${NAMESPACE} -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
labels:
app: pipy
spec:
replicas: 1
selector:
matchLabels:
app: pipy
template:
metadata:
labels:
app: pipy
spec:
containers:
- name: pipy
image: flomesh/pipy:latest
ports:
- containerPort: 8080
command:
- pipy
- -e
- |
pipy()
.listen(8080)
.serveHTTP(new Message('Hi, I am from ${CLUSTER_NAME} and controlled by mesh!\n'))
---
apiVersion: v1
kind: Service
metadata:
name: httpbin
spec:
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
app: pipy
---
apiVersion: v1
kind: Service
metadata:
name: httpbin-${CLUSTER_NAME}
spec:
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
app: pipy
EOF
sleep 3
kubectl wait --for=condition=ready pod -n ${NAMESPACE} --all --timeout=60s
done
在集群 cluster-2
的命名空间 curl
下部署 curl
应用,这个命名空间是被网格管理的,注入的 sidecar 会完全流量的跨集群调度。
export NAMESPACE=curl
kubectx k3d-cluster-2
kubectl create namespace ${NAMESPACE}
osm namespace add ${NAMESPACE}
kubectl apply -n ${NAMESPACE} -f - <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: curl
---
apiVersion: v1
kind: Service
metadata:
name: curl
labels:
app: curl
service: curl
spec:
ports:
- name: http
port: 80
selector:
app: curl
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: curl
spec:
replicas: 1
selector:
matchLabels:
app: curl
template:
metadata:
labels:
app: curl
spec:
serviceAccountName: curl
containers:
- image: curlimages/curl
imagePullPolicy: IfNotPresent
name: curl
command: ["sleep", "365d"]
EOF
sleep 3
kubectl wait --for=condition=ready pod -n ${NAMESPACE} --all --timeout=60s
导出服务
export NAMESPACE_MESH=httpbin
for CLUSTER_NAME in cluster-1 cluster-3
do
kubectx k3d-${CLUSTER_NAME}
kubectl apply -f - <<EOF
apiVersion: flomesh.io/v1alpha1
kind: ServiceExport
metadata:
namespace: ${NAMESPACE_MESH}
name: httpbin
spec:
serviceAccountName: "*"
rules:
- portNumber: 8080
path: "/${CLUSTER_NAME}/httpbin-mesh"
pathType: Prefix
---
apiVersion: flomesh.io/v1alpha1
kind: ServiceExport
metadata:
namespace: ${NAMESPACE_MESH}
name: httpbin-${CLUSTER_NAME}
spec:
serviceAccountName: "*"
rules:
- portNumber: 8080
path: "/${CLUSTER_NAME}/httpbin-mesh-${CLUSTER_NAME}"
pathType: Prefix
EOF
sleep 1
done
导出后的服务,FSM 会自动为其创建 Ingress 规则,有了规则之后就可以通过 Ingress 来访问这些服务。
for CLUSTER_NAME_INDEX in 1 3
do
CLUSTER_NAME=cluster-${CLUSTER_NAME_INDEX}
((PORT=80+CLUSTER_NAME_INDEX))
kubectx k3d-${CLUSTER_NAME}
echo "Getting service exported in cluster ${CLUSTER_NAME}"
echo '-----------------------------------'
kubectl get serviceexports.flomesh.io -A
echo '-----------------------------------'
curl -s "http://${HOST_IP}:${PORT}/${CLUSTER_NAME}/httpbin-mesh"
curl -s "http://${HOST_IP}:${PORT}/${CLUSTER_NAME}/httpbin-mesh-${CLUSTER_NAME}"
echo '-----------------------------------'
done
查看其中的某个 ServiceExports
资源:
kubectl get serviceexports httpbin -n httpbin -o jsonpath='{.spec}' | jq
{
"loadBalancer": "RoundRobinLoadBalancer",
"rules": [
{
"path": "/cluster-3/httpbin-mesh",
"pathType": "Prefix",
"portNumber": 8080
}
],
"serviceAccountName": "*"
}
导出的服务,可以其他的纳管集群中被导入。比如我们查看集群 cluster-2
,可以有多个服务被导入。
kubectx k3d-cluster-2
kubectl get serviceimports -A
NAMESPACE NAME AGE
httpbin httpbin-cluster-1 13m
httpbin httpbin-cluster-3 13m
httpbin httpbin 13m
继续保持在 cluster-2
集群(kubectx k3d-cluster-2
),我们测试下能否从网格中的 curl
应用访问这些导入的服务。
获取 curl
应用的 pod,后面我们会从这个 pod 发起请求来模拟服务的访问。
curl_client="$(kubectl get pod -n curl -l app=curl -o jsonpath='{.items[0].metadata.name}')"
此时你会发现,无法访问。
kubectl exec "${curl_client}" -n curl -c curl -- curl -s http://httpbin.httpbin:8080/
command terminated with exit code 7
注意这是正常的,默认情况下不会使用其他集群的实例来响应请求,也就是说默认不会调用到其他集群去。那么要如何访问呢,那我们就要清楚全局流量策略 GlobalTrafficPolicy
了。
注意,所有的全局流量策略都是在使用方这一侧设置的,拿这个 demo 来说就是在集群 cluster-2
这一方进行全局流量策略的设置。所以在开始之前,先切换到 cluster-2
集群:kubectx k3d-cluster-2
。
全局流量策略通过 CRD GlobalTrafficPolicy
来设置。
type GlobalTrafficPolicy struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec GlobalTrafficPolicySpec `json:"spec,omitempty"`
Status GlobalTrafficPolicyStatus `json:"status,omitempty"`
}
type GlobalTrafficPolicySpec struct {
LbType LoadBalancerType `json:"lbType"`
LoadBalanceTarget []TrafficTarget `json:"targets"`
}
全局负载均衡类型 .spec.lbType
一共有三种类型:
Locality
:只使用本集群的服务,也是默认类型。这就是为什么我们不提供任何全局策略的时候,访问 httpbin
应用会失败,因为在集群 cluster-2
中并没有该服务。FailOver
:当本集群访问失败时才会代理到其他集群,也就是常说的故障迁移,类似主备。ActiveActive
:正常情况下也会代理到其他集群,类似多活。FailOver
和 ActiveActive
策略在使用时,需要通过 targets 字段来指定备用集群的 id,也就是当故障发生时或者负载均衡可以路由到的集群。 比如,在 集群 cluster-2
中查看导入服务 httpbin/httpbin
,可以看到其有两个外集群的 endpoints
,注意这里的 endpoints
与原生 endpoints.v1
是不同的概念,会包含更多的信息。此外,还有集群的 id clusterKey
。
kubectl get serviceimports httpbin -n httpbin -o jsonpath='{.spec}' | jq
{
"ports": [
{
"endpoints": [
{
"clusterKey": "default/default/default/cluster-1",
"target": {
"host": "192.168.1.110",
"ip": "192.168.1.110",
"path": "/cluster-1/httpbin-mesh",
"port": 81
}
},
{
"clusterKey": "default/default/default/cluster-3",
"target": {
"host": "192.168.1.110",
"ip": "192.168.1.110",
"path": "/cluster-3/httpbin-mesh",
"port": 83
}
}
],
"port": 8080,
"protocol": "TCP"
}
],
"serviceAccountName": "*",
"type": "ClusterSetIP"
}
默认情况下的路由类型就是 Locality
,就像上面测试的,流量无法调度到其他集群。
kubectl exec "${curl_client}" -n curl -c curl -- curl -s http://httpbin.httpbin:8080/
command terminated with exit code 7
既然为设置全局流量策略导致访问失败,那我们先开启 FailOver
模式。注意,全局策略流量,要与目标服务名和命名空间一致。 比如,我们要访问 http://httpbin.httpbin:8080/
,需要在命名空间 httpbin
下创建名为 httpbin
的 GlobalTrafficPolicy
资源。
kubectl apply -n httpbin -f - <<EOF
apiVersion: flomesh.io/v1alpha1
kind: GlobalTrafficPolicy
metadata:
name: httpbin
spec:
lbType: FailOver
targets:
- clusterKey: default/default/default/cluster-1
- clusterKey: default/default/default/cluster-3
EOF
设置好策略之后,我们再请求一次试试:
kubectl exec "${curl_client}" -n curl -c curl -- curl -s http://httpbin.httpbin:8080/
Hi, I am from cluster-1!
请求成功,请求被代理到了集群 cluster-1
中的服务。再请求一次,又被代理到了集群 cluster-3
,符合负载均衡的预期。
kubectl exec "${curl_client}" -n curl -c curl -- curl -s http://httpbin.httpbin:8080/
Hi, I am from cluster-3!
假如我们在集群 cluster-2
的命名空间 httpbin
中部署应用 httpbin
,会有什么现象呢?
export NAMESPACE=httpbin
export CLUSTER_NAME=cluster-2
kubectx k3d-${CLUSTER_NAME}
kubectl create namespace ${NAMESPACE}
osm namespace add ${NAMESPACE}
kubectl apply -n ${NAMESPACE} -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpbin
labels:
app: pipy
spec:
replicas: 1
selector:
matchLabels:
app: pipy
template:
metadata:
labels:
app: pipy
spec:
containers:
- name: pipy
image: flomesh/pipy:latest
ports:
- containerPort: 8080
command:
- pipy
- -e
- |
pipy()
.listen(8080)
.serveHTTP(new Message('Hi, I am from ${CLUSTER_NAME}!\n'))
---
apiVersion: v1
kind: Service
metadata:
name: httpbin
spec:
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
app: pipy
---
apiVersion: v1
kind: Service
metadata:
name: httpbin-${CLUSTER_NAME}
spec:
ports:
- port: 8080
targetPort: 8080
protocol: TCP
selector:
app: pipy
EOF
sleep 3
kubectl wait --for=condition=ready pod -n ${NAMESPACE} --all --timeout=60s
待应用正常运行之后,这次我们再发请求测试。从结果来看,请求在当前集群中处理完成了。
kubectl exec "${curl_client}" -n curl -c curl -- curl -s http://httpbin.httpbin:8080/
Hi, I am from cluster-2!
即使重复多次请求,也都会返回 Hi, I am from cluster-2!
,这说明在本集群存在服务时,优先使用本集群的服务处理请求。
有些情况下,我们还希望其他集群也一起参与服务,因为只使用本集群服务的情况下,其他集群的资源不免有些浪费。这就要用到 ActiveActive
路由类型了。
接着上面的状态,我们来测试下 ActiveActive
类型,修改前面创建的策略,将其更新为 ActiveActive
:
kubectl apply -n httpbin -f - <<EOF
apiVersion: flomesh.io/v1alpha1
kind: GlobalTrafficPolicy
metadata:
name: httpbin
spec:
lbType: ActiveActive
targets:
- clusterKey: default/default/default/cluster-1
- clusterKey: default/default/default/cluster-3
EOF
我们多次请求会发现,三个集群的 httpbin
都会参与服务。这说明负载被均衡代理到多个集群。
kubectl exec "${curl_client}" -n curl -c curl -- curl -s http://httpbin.httpbin:8080/
Hi, I am from cluster-1 and controlled by mesh!
kubectl exec "${curl_client}" -n curl -c curl -- curl -s http://httpbin.httpbin:8080/
Hi, I am from cluster-2!
kubectl exec "${curl_client}" -n curl -c curl -- curl -s http://httpbin.httpbin:8080/
Hi, I am from cluster-3 and controlled by mesh!
上面的示例中,我们演示了如何实现服务的跨集群的流量调度和负载均衡,并尝试了三种不同的全局流量策略:仅本集群调度、故障转移、全局负载均衡。
有了跨集群流量调度的加成,通过混合云、异地多中心等方案避免单集群出现故障导致的系统的可用性问题、满足数据隐私保护的监控要求;多版本的 Kubernetes 共存,Kubernetes 的升级会变得更加容易;单集群的容量限制不再成为问题。
在后面的文章中,我们还会继续介绍非服务网格管理的服务如何进行跨集群的流量调度、跨集群情况下的访问控制,以及更高级的流量管理等内容。
[1]
FSM: https://github.com/flomesh-io/fsm
[2]
KEP-1645: Multi-Cluster Services API: https://github.com/kubernetes/enhancements/tree/master/keps/sig-multicluster/1645-multi-cluster-services-api
[3]
Pipy: https://flomesh.io/pipy
本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/40NAj-jEW9A6ODSR-Suwrw
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。