牛商网站建设定制vx免费
web/
2025/9/29 16:47:43/
文章来源:
牛商网站建设,定制vx免费,查找企业名录,跨境电商卖什么产品最赚钱Kubernetes 的网络模型
通过前面教程的学习#xff0c;我们已经可以将容器化的应用程序在 Kubernetes 中运行起来#xff0c;并且发布到 Kubernetes 内/外的网络上。
通常#xff0c;Docker 使用一种 host-private 的联网方式#xff0c;在此情况下#xff0c;只有两个容…Kubernetes 的网络模型
通过前面教程的学习我们已经可以将容器化的应用程序在 Kubernetes 中运行起来并且发布到 Kubernetes 内/外的网络上。
通常Docker 使用一种 host-private 的联网方式在此情况下只有两个容器都在同一个节点主机上时一个容器才可以通过网络连接另一个容器。为了使 Docker 容器可以跨节点通信必须在宿主节点主机的 IP 地址上分配端口并将该端口接收到的网络请求转发或代理到容器中。这意味着用户必须非常小心地为容器分配宿主节点主机的端口号或者端口号可以自动分配。
在一个集群中多个开发者之间协调分配端口号是非常困难的。Kubernetes 认为集群中的两个 Pod 应该能够互相通信无论他们各自在哪个节点上。每一个 Pod 都被分配自己的 “cluster-private-IP”因此您无需在 Pod 间建立连接或者将容器的端口映射到宿主机的端口。因此
Pod 中的任意容器可以使用 localhost 直连同 Pod 中另一个容器的端口集群中的任意 Pod 可以使用另一的 Pod 的 cluster-private-IP 直连对方的端口无需 NAT 映射
在集群中部署nginx
创建文件 run-my-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: my-nginx
spec:selector:matchLabels:run: my-nginxreplicas: 2template:metadata:labels:run: my-nginxspec:containers:- name: my-nginximage: nginxports:- containerPort: 80部署 Pod
kubectl apply -f ./run-my-nginx.yaml检查运行情况
kubectl get pods -l runmy-nginx -o wide输出结果:
NAME READY STATUS RESTARTS AGE IP NODE
my-nginx-3800858182-jr4a2 1/1 Running 0 13s 10.244.3.4 kubernetes-minion-905m
my-nginx-3800858182-kna2y 1/1 Running 0 13s 10.244.2.5 kubernetes-minion-ljyd执行命令 kubectl get pods -l runmy-nginx -o yaml | grep podIP 检查 Pod 的 IP 地址输出结果如下
cni.projectcalico.org/podIP: 10.244.84.185/32cni.projectcalico.org/podIPs: 10.244.84.185/32podIP: 10.244.84.185podIPs:cni.projectcalico.org/podIP: 10.244.14.61/32cni.projectcalico.org/podIPs: 10.244.14.61/32podIP: 10.244.14.61podIPs:
在集群中的任意节点上您可以执行curl 10.244.84.185或curl 10.244.14.61 获得 nginx 的响应。
容器并没有使用节点上的 80 端口没有使用 NAT 规则对容器端口进行映射
这意味着您可以
在同一节点上使用 80 端口运行多个 nginx Pod在集群的任意节点/Pod 上使用 nginx Pod 的 clusterIP 访问 nginx 的 80 端口
同 Docker 一样Kubernets 中仍然可以将 Pod 的端口映射到宿主节点的网络地址上使用 nodePort但是使用 Kubernetes 的网络模型时这类需求已经大大减少了。
创建 Service
上面的步骤中我们已经创建了 nginx Pod运行在集群的 IP 地址空间。您可以直接通过 Pod 的地址访问其端口但是如果某一个 Pod 终止了该怎么办Pod 因为故障或其他原因终止后Deployment Controller 将创建一个新的 Pod 以替代该 Pod但是 IP 地址将发生变化。Kubernetes Service 解决了这样的问题。
Kubernetes Service
定义了集群中一组 Pod 的逻辑集合该集合中的 Pod 提供了相同的功能被创建后获得一个唯一的 IP 地址ClusterIP。直到该 Service 被删除此地址不会发生改变Pod 可以直接连接 Service IP 地址上的端口且发送到该 IP 地址的网络请求被自动负载均衡分发到 Service 所选取的 Pod 集合中
执行命令 kubectl expose deployment/my-nginx 可以为上面的两个 nginx Pod 创建 Service输出结果如下所示
service/my-nginx exposed该命令等价于 kubectl apply -f nginx-svc.yaml其中 nginx-svc.yaml 文件的内容如下所示
apiVersion: v1
kind: Service
metadata:name: my-nginxlabels:run: my-nginx
spec:ports:- port: 80targetPort: 80protocol: TCPselector:run: my-nginx该 yaml 文件将创建一个 Service
该 Service 通过 label selector 选取包含 run: my-nginx 标签的 Pod 作为后端 Pod该 Service 暴露一个端口 80spec.ports[*].port该 Service 将 80 端口上接收到的网络请求转发到后端 Pod 的 80 spec.ports[*].targetPort端口上支持负载均衡
执行命令 kubectl get svc my-nginx输出结果如下
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
my-nginx ClusterIP 10.100.223.157 none 80/TCP 75sService 的后端 Pod 实际上通过 Endpoints 来暴露。Kubernetes 会持续检查 Service 的 label selector spec.selector并将符合条件的 Pod 更新到与 Service 同名my-nginx的 Endpoints 对象。如果 Pod 终止了该 Pod 将被自动从 Endpoints 中移除新建的 Pod 将自动被添加到该 Endpoint。
执行命令 kubectl describe svc my-nginx输出结果如下请注意 Endpoints 中的 IP 地址与上面获得的 Pod 地址相同
Name: my-nginx
Namespace: default
Labels: none
Annotations: none
Selector: runmy-nginx
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.100.223.157
IPs: 10.100.223.157
Port: unset 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.14.61:80,10.244.84.185:80
Session Affinity: None
Events: none执行命令 kubectl get ep my-nginx输出结果
NAME ENDPOINTS AGE
my-nginx 10.244.14.61:80,10.244.84.185:80 8m37s此时您可以在集群的任意节点上执行curl 10.100.223.157:80通过 Service 的 ClusterIP:Port 访问 nginx。
访问 Service
Kubernetes 支持两种方式发现服务
环境变量DNS 参考
环境变量
针对每一个有效的 Servicekubelet 在创建 Pod 时向 Pod 添加一组环境变量。这种做法引发了一个 Pod 和 Service 的顺序问题。例如
执行命令 kubectl exec my-nginx-df7bbf6f5-87hqg -- printenv | grep SERVICE 您的 Pod 名字可能不一样输出结果如下
KUARD_SERVICE_PORT80
KUBERNETES_SERVICE_PORT_HTTPS443
KUARD_SERVICE_HOST10.110.143.73
KUBERNETES_SERVICE_HOST10.96.0.1
KUBERNETES_SERVICE_PORT443DNS
Kubernetes 提供了一个 DNS cluster addon可自动为 Service 分配 DNS name。
查看该 addon 在您的集群上是否可用
kubectl get services kube-dns --namespacekube-system输出结果
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kube-dns ClusterIP 10.96.0.10 none 53/UDP,53/TCP,9153/TCP 140d可以从集群中任何 Pod 中按 Service 的名称访问该 Service。
执行命令 kubectl run curl --imageradial/busyboxplus:curl -i --tty 获得 busyboxplus 容器的命令行终端该命令输出结果
If you dont see a command prompt, try pressing enter.
[ rootcurl:/ ]$然后单击回车键并执行命令 nslookup my-nginx输出结果如下所示
[ rootcurl:/ ]$ nslookup my-nginx
Server: 10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.localName: my-nginx
Address 1: 10.100.223.157 my-nginx.default.svc.cluster.local执行命令 curl my-nginx:80可获得 Nginx 的响应。
[ rootcurl:/ ]$ curl my-nginx:80
!DOCTYPE html
html
head
titleWelcome to nginx!/title
style
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
/style
/head
body
h1Welcome to nginx!/h1
pIf you see this page, the nginx web server is successfully installed and
working. Further configuration is required./ppFor online documentation and support please refer to
a hrefhttp://nginx.org/nginx.org/a.br/
Commercial support is available at
a hrefhttp://nginx.com/nginx.com/a./ppemThank you for using nginx./em/p
/body
/html
执行命令 exit 可推出该容器的命令行执行命令 kubectl delete deployment curl 可删除刚才创建的 curl 测试容器
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84003.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!