集群Kubernetes-部署httpd并从外部访问
我创建了Kubernetes群集,并尝试部署此yaml文件:集群Kubernetes-部署httpd并从外部访问,kubernetes,Kubernetes,我创建了Kubernetes群集,并尝试部署此yaml文件: apiVersion: apps/v1 kind: Deployment metadata: name: httpd-deployment spec: selector: matchLabels: app: httpd replicas: 1 template: metadata: labels: app: httpd spec: contai
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment
spec:
selector:
matchLabels:
app: httpd
replicas: 1
template:
metadata:
labels:
app: httpd
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
---
kind: Service
apiVersion: v1
metadata:
name: httpd-service
spec:
selector:
app: httpd-app
ports:
- protocol: TCP
port: 8080
targetPort: 80
nodePort: 30020
name: httpd-port
type: NodePort
以下是配置:
[root@BCA-TST-K8S01 httpd-deploy]# kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/httpd-deployment-57fc687dcc-rggx9 1/1 Running 0 8m51s 10.44.0.1 bcc-tst-docker02 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/httpd-service NodePort 10.102.138.175 <none> 8080:30020/TCP 8m51s app=httpd-app
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 134m <none>
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/httpd-deployment 1/1 1 1 8m51s httpd httpd app=httpd
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/httpd-deployment-57fc687dcc 1 1 1 8m51s httpd httpd app=httpd,pod-template-hash=57fc687dcc
我怎样才能解决这个问题?
如何使用内部Matser IP公开集群(例如,我需要从主IP 10.100.170.150访问httpd部署,在同一网络中打开浏览器)
更新:
我修改了我的yaml文件,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: httpd-deployment
spec:
selector:
matchLabels:
app: httpd-app
replicas: 2
template:
metadata:
labels:
app: httpd-app
spec:
containers:
- name: httpd
image: httpd
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: http-service
spec:
externalIPs:
- 10.100.170.150 **--> IP K8S**
externalTrafficPolicy: Cluster
ports:
- name: httpd-port
protocol: TCP
port: 8080
targetPort: 80
nodePort: 30020
selector:
app: httpd-app
sessionAffinity: None
type: LoadBalancer
这些是我运行apply命令后的结果:
[root@K8S01 LoadBalancer]# kubectl get all -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/httpd-deployment-65d64d47c5-72xp4 1/1 Running 0 60s 10.44.0.2 bcc-tst-docker02 <none> <none>
pod/httpd-deployment-65d64d47c5-fc645 1/1 Running 0 60s 10.36.0.1 bca-tst-docker01 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/http-service LoadBalancer 10.100.236.203 10.100.170.150 8080:30020/TCP 60s app=httpd-app
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13d <none>
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/httpd-deployment 2/2 2 2 60s httpd httpd app=httpd-app
NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR
replicaset.apps/httpd-deployment-65d64d47c5 2 2 2 60s httpd httpd app=httpd-app,pod-template-hash=65d64d47c5
如果我尝试直接连接到节点,我可以连接:
[root@K8S01 LoadBalancer]# curl http://bca-tst-docker01:30020
<html><body><h1>It works!</h1></body></html>
[root@K8S01 LoadBalancer]# curl http://bcc-tst-docker02:30020
<html><body><h1>It works!</h1></body></html>
[root@K8S01负载平衡器]#卷曲http://bca-tst-docker01:30020
它起作用了!
[root@K8S01负载平衡器]#卷曲http://bcc-tst-docker02:30020
它起作用了!
您的连接被拒绝
,因为您的标签选择器与部署级别不同,因此服务后面没有任何端点
部署具有httpd
标签,而服务正试图使用httpd app
捕获所有部署。您可以在下面找到正确的选择器:
种类:服务
版本:v1
元数据:
名称:httpd服务
规格:
选择器:
应用程序:httpd您是如何引导群集的?库比德?米尼库贝?你在运行什么操作系统?如果我理解正确,您希望使用nodePort从外部访问在集群中运行的httpd服务?您有多少个节点?我可以假设它只有一个/主人?你们有防火墙吗?你能用sudo netstat-tulpn | grep LISTEN
检查一下端口30020
是否真的打开了吗?我用Kubeadm创建了我的集群。操作系统是Oracle Linux 8.3,docker版本20.10.5和Kubernetes版本客户端版本:version.Info{Major:“1”,Minor:“20”,GitVersion:“v1.20.5”,GitCommit:“6B1D87ACF3C8253C123756B9E61DAC6642678305F”,GitRestate:“clean”,BuildDate:“2021-03-18T01:10:43Z”,政府版本:“go1.15.8”,编译器:“gc”,平台:“Linux/amd64”}。如果可能的话,我的范围是使用负载平衡器。有防火墙,工作节点上的范围端口30000-32767已打开感谢您的回复。现在我可以直接连接到工作节点,但不能使用k8s ip作为负载平衡器进行连接。但是您是否配置了负载平衡器?如果是,是哪一种?有云的吗?Metallb?不,我没有配置任何LB,k8s是LB as服务?请检查(本指南)[关于如何在裸机上为kubernetes路由流量。Loadbalancer类型通常在云环境中使用,它会自动为您提供Loadbalancer。对于裸机,您需要使用其他选项,例如Metallb,或者只使用ingress控制器的ingress。使用您提供的ExternalIP选项,kubernetes不再负责IP地址,但您是。因此您应该使用与节点的主接口(例如eth0)关联的IP
[root@K8S01 LoadBalancer]# curl http://10.100.170.150:8080
curl: (7) Failed to connect to 10.100.170.150 port 8080: No route to host
[root@K8S01 LoadBalancer]# curl http://10.100.236.203:8080
curl: (7) Failed to connect to 10.100.236.203 port 8080: No route to host
[root@K8S01 LoadBalancer]# curl http://bca-tst-docker01:30020
<html><body><h1>It works!</h1></body></html>
[root@K8S01 LoadBalancer]# curl http://bcc-tst-docker02:30020
<html><body><h1>It works!</h1></body></html>