我在控制面运行了一个名为库贝-nginx的pod,并转发端口。我是kubernetes的新生。
[root@k8smaster ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.4", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"clean", BuildDate:"2021-02-18T16:12:00Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"20", GitVersion:"v1.20.4", GitCommit:"e87da0bd6e03ec3fea7933c4b5263d151aafd07c", GitTreeState:"clean", BuildDate:"2021-02-18T16:03:00Z", GoVersion:"go1.15.8", Compiler:"gc", Platform:"linux/amd64"}
[root@k8smaster ~]# cat /opt/pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: kube-nginx
spec:
containers:
- name: nginx
image: nginx
[root@k8smaster ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
kube-nginx 1/1 Running 0 38m
[root@k8smaster ~]# kubectl port-forward pod/kube-nginx 10086:80
Forwarding from 127.0.0.1:10086 -> 80
Forwarding from [::1]:10086 -> 80
我可以访问localhost上的吊舱,但我不能访问扩展IP上的吊舱。
[root@k8smaster opt]# ip a | awk '/^2: ens33/,/^3: docker/{print $2}' | sed -n '3P'
192.168.80.201/24
[root@k8smaster opt]# nc -vz localhost 10086
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connected to ::1:10086.
Ncat: 0 bytes sent, 0 bytes received in 0.01 seconds.
在外部IP主机上,我可以ping k8smaster,但无法访问其中的pod。
[root@k8snode01 opt]# ping -c 3 192.168.80.201
PING 192.168.80.201 (192.168.80.201) 56(84) bytes of data.
64 bytes from 192.168.80.201: icmp_seq=1 ttl=64 time=0.367 ms
64 bytes from 192.168.80.201: icmp_seq=2 ttl=64 time=0.215 ms
64 bytes from 192.168.80.201: icmp_seq=3 ttl=64 time=0.248 ms
--- 192.168.80.201 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.215/0.276/0.367/0.068 ms
[root@k8snode01 opt]# ip a | awk '/^2: ens33/,/^3: docker/{print $2}' | sed -n '3p'
192.168.80.202/24
[root@k8snode01 opt]# nc -nvz 192.168.80.201 10086
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: No route to host.
和路由表显示如下
[root@k8snode01 opt]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.80.2 0.0.0.0 UG 100 0 0 ens33
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.16.128 192.168.80.201 255.255.255.192 UG 0 0 0 ens33
192.168.80.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
的防火墙设置
[root@k8smaster ~]# iptables-save | egrep -w -- INPUT
:INPUT ACCEPT [78784:15851659]
-A INPUT -j INPUT_direct
:INPUT ACCEPT [0:0]
:INPUT ACCEPT [61299:11943644]
-A INPUT -j INPUT_direct
:INPUT ACCEPT [0:0]
:cali-INPUT - [0:0]
-A INPUT -m comment --comment "cali:Cz_u1IQiXIMmKD4c" -j cali-INPUT
-A INPUT -m conntrack --ctstate NEW -m comment --comment "kubernetes externally-visible service portals" -j KUBE-EXTERNAL-SERVICES
-A INPUT -j KUBE-FIREWALL
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j INPUT_direct
-A INPUT -j INPUT_ZONES_SOURCE
-A INPUT -j INPUT_ZONES
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A cali-INPUT -p udp -m comment --comment "cali:w7ud0UgQSEi_zKuQ" -m comment --comment "Allow VXLAN packets from whitelisted hosts" -m multiport --dports 4789 -m set --match-set cali40all-vxlan-net src -m addrtype --dst-type LOCAL -j ACCEPT
-A cali-INPUT -p udp -m comment --comment "cali:4cgmbdWsLmozYhJh" -m comment --comment "Drop VXLAN packets from non-whitelisted hosts" -m multiport --dports 4789 -m addrtype --dst-type LOCAL -j DROP
-A cali-INPUT -i cali+ -m comment --comment "cali:t45BUBhpu3Wsmi1_" -g cali-wl-to-host
-A cali-INPUT -m comment --comment "cali:NOmsycyknYZaGOFf" -m mark --mark 0x10000/0x10000 -j ACCEPT
-A cali-INPUT -m comment --comment "cali:Or0B7eoenKO2p8Bf" -j MARK --set-xmark 0x0/0xf0000
-A cali-INPUT -m comment --comment "cali:AmIfvPGG2lYUK6mj" -j cali-from-host-endpoint
-A cali-INPUT -m comment --comment "cali:79fWWn1SpufdO7SE" -m comment --comment "Host endpoint policy accepted packet." -m mark --mark 0x10000/0x10000 -j ACCEPT
[root@k8smaster ~]# firewall-cmd --list-all
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: ens33
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
如何排查?
监听所有地址上的10086端口,转发到pod中的80
kubectl port-forward --address 0.0.0.0 pod/kube-nginx 10086:80
铭记以下声明:
我是Kubernetes的新生。
我认为有一些话题应该解决:
$kubectl端口转发…
库伯内特斯作为一个平台有一个特定的对象来完成某些事情/任务。您已经创建了一个名为库贝-nginx
的Pod
,它衍生于节点
。
要为内部/外部源公开Pods
(如您的库贝-nginx
),您需要使用Service
。您可以通过以下官方留档阅读更多信息:
一种将运行在一组Pod上的应用程序公开为网络服务的抽象方法。使用库伯内特斯,您无需修改应用程序以使用不熟悉的服务发现机制。库伯内特斯为Pod提供自己的IP地址和一组Pod的单个DNS名称,并且可以在它们之间进行负载平衡。
--Kubernetes.io:文档:概念:服务网络:服务
您的Pod
定义是正确的,它将生成一个带有nginx
映像的Pod
,但库伯内特斯将无法将其暴露给外部源(除了$kubectl port-转发
,我稍后会解决),因为您的清单中缺少某些字段。
Services
应该可以公开的最小示例:
apiVersion: v1
kind: Pod
metadata:
name: kube-nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
我还认为您应该使用其他库伯内特斯对象,例如部署
:
此外,您还没有在清单中添加任何内容来强制Pod
在k8smaster
上进行调度。它可以在k8node01
上进行调度。您可以检查您的Pod
是由哪个节点
运行的:
$kubectl获取pods/库贝-nginx-o宽
NAME READY STATUS RESTARTS AGE IP --> NODE <-- NOMINATED NODE READINESS GATES
kube-nginx 1/1 Running 0 84m 10.32.2.7 --> raven-6k6m <-- <none> <none>
请参阅Node
列。
这是一个猜测,但我认为解释是,它将永久暴露库贝-nginx
端口:10086
上的Pod在运行此命令的主机上。是的,它将暴露您的Pod
,但在这个设置中,它只在localhost上运行,并且只要命令运行,它就会运行。要暴露您的工作负载,您应该使用前面提到的Services
。如果您想使用$kubectl port-转发
公开您的Pod
,您应该使用user@Phillipe指出的命令:
kubectl端口转发--地址0.0.0.0pod/库贝-nginx 10086:80
--address0.0.0.0
将允许来自LAN
的传入连接(假设没有防火墙丢弃请求)。
引用Stackoverflow.com的另一个答案:
kubectl port-前进
发出特定的库伯内特斯API请求。这意味着运行它的系统需要访问API服务器,任何流量都将通过单个HTTP连接进行隧道传输。
拥有它对调试非常有用(如果一个特定的pod出了问题,你可以直接连接到它;在微服务环境中,你可以与一个你不会公开的后端服务对话),但它不是设置服务对象的替代方案。当我使用kubectl port-前进
时,它明显比通过服务连接到pod慢,我发现命令在几分钟后就停止了。同样,这些对调试来说不是大问题,但它们不是我想要的生产系统。
--Stackoverflow.com:答案:kubectl port-转发是如何工作的
假设您的集群配置正确,因为关于集群配置过程的问题中没有步骤,您可以使用以下示例将您的库贝-nginx
Pod
暴露给外部源。
apiVersion: v1
kind: Pod
metadata:
name: kube-nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Service
metadata:
name: kube-nginx-service
spec:
selector:
app: nginx # <-- this needs to match .metadata.labels field in Pod
type: NodePort
ports:
- protocol: TCP
port: 80 # <-- port inside of the cluster
targetPort: 80 # <-- port that app is listening on
nodePort: 30080 # <-- from 30000 to 32767 on the node (can be changed)
通过此示例,您将生成一个带有nginx
映像的Pod
,并允许每个Node
上端口:30080
上的连接到达Pod
(即$curl192.168.0.114:30080)
。
LoadBalancer
类型的服务也可以通过它的外部IP
分配,但是由于缺乏关于库伯内特斯设置的信息,可能很难找到正确的解决方案(本地=metallb
,否则请咨询提供程序留档)。
我还鼓励您查看以下留档以获取更多参考/最佳实践等:
您可以做的是附加一个服务类型负载平衡,如下所示:
kind: Service
apiVersion: v1
metadata:
name: kube-nginx
namespace: <your namespace>
labels:
app: kube-nginx
annotations:
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: "your certificate"
service.beta.kubernetes.io/aws-load-balancer-ssl-negotiation-policy: "ELBSecurityPolicy-TLS-1-2-2017-01"
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: "tcp"
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: '*'
service.beta.kubernetes.io/aws-load-balancer-connection-idle-timeout: '3600'
spec:
type: LoadBalancer
selector:
app: kube-nginx
ports:
- name: http
port: 80
targetPort: proxy
- name: https
port: 443
targetPort: http