kube-ovn的搭建,站点文章中已经写过了,点击即可访问
现在是来验证在kube-ovn的情况下,应用放在了Pod中,我们应该怎么去访问,直接访问Pod_ip
?节点ip:port
?都是可以的
Pod_ip:Port
Pod_ip的方法就是不需要在Kubernetes中使用NAT,所以要将kube-ovn所在的subnet的NAT关掉,关掉之后,如果进行ping,发现ping包可以出去但无法回来。
那是因为Pod_ip被外部ip访问时,外部没有此ip的路由,不知道应该怎么走,所以需要在外部路由器加上一条路由,访问kube-ovn网段的ip时的下一跳地址为Kubernetes集群中的任意一台服务器。
Node_ip:port
使用SVC的方法将Pod_ip使用NAT转换成节点ip:port,即可访问
构建一个nginx镜像来做试验
编写nginx.yaml
[root@node1 ~]# vim Dockerfile
FROM centos
MAINTAINER FeiYi
RUN yum -y install net-tools iproute pcre-devel openssl-devel gcc gcc-c++ make zlib-devel eli
nks
ADD nginx-1.11.1.tar.gz /usr/src
ENV NGINX_ADD_DIR /usr/src/nginx-1.11.1
WORKDIR $NGINX_ADD_DIR
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make && make install
RUN useradd nginx && \
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
WORKDIR /
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
构建镜像
注意:记得要将nginx包放到和Dockerfile一个位置
因为要上传到Registry中,所以镜像名中主机命名为ip:port
[root@node1 ~]# docker build -t 192.168.1.11:5000/nginx:chai .
[root@node1 ~]# docker push 192.168.1.11:5000/nginx:chai
查看私库中的nginx
[root@node1 ~]# curl 192.168.1.11:5000/v2/nginx/tags/list
{"name":"nginx","tags":["latest","chai"]}
NodePort
准备工作
因为要将pod调度在非master节点,这里先给集群中的调度节点设置标签
[root@node1 ~]# kubectl label node node2 node3 node-role.kubernetes.io/worker=
创建目录来存放nginx相关文件,
注意:所有的部署节点都要有这个路径
[root@node2 ~]# mkdir Kubernetes/nginx/nginx/html -p
[root@node3 ~]# mkdir Kubernetes/nginx/nginx/html -p
编写nginx.yaml
[root@node1 ~]# vim nginx.yaml
---
# 创建一个nginx的命名空间
apiVersion: v1
kind: Namespace
metadata:
name: nginx
labels:
app: nginx
---
# 创建nginx的Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
namespace: nginx # 将它放在名为nginx的namespace
spec:
replicas: 4 # Deployment中将启动两个pod副本
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
nodeSelector:
node-role.kubernetes.io/worker: "" # 将使用节点标签控制pod的调度节点
restartPolicy: Always # 重启策略,无论遇到什么错误都将重启pod
containers: # 容器信息
- name: nginx # 容器名
image: 192.168.1.11:5000/nginx:chai # 镜像使用自己制作的
imagePullPolicy: IfNotPresent # 镜像下载策略,如果本地没有则会自动pull
ports:
- name: nginx-port
containerPort: 80 # 容器端口
# 以下这种映射方法不适用于配置文件,他是将外部的空目录映射到容器内的,如果映射配置文件就会被外部的空目录清空
volumeMounts: # 指定容器内需要挂载到宿主机的目录
- name: nginx-html
mountPath: /usr/local/nginx/html
readOnly: True
volumes: # 指定对应上述容易内目录对应的物理机路径
- name: nginx-html
hostPath:
path: /root/Kubernetes/nginx/nginx/html
部署nginx-deployment
[root@node1 ~]# kubectl apply -f nginx.yaml
查看Deployment和pod
[root@node1 html]# kubectl get pods -n nginx
NAME READY STATUS RESTARTS AGE
nginx-deployment-5ddd88ffbc-62thb 1/1 Running 0 5m34s
nginx-deployment-5ddd88ffbc-89qlj 1/1 Running 0 5m34s
nginx-deployment-5ddd88ffbc-8wgxd 1/1 Running 0 6m19s
nginx-deployment-5ddd88ffbc-mw8jp 1/1 Running 0 5m34s
自定义页面文件
因为指定的调度节点是非master节点,所以在非master节点创建index.html
[root@node2 ~]# echo Feiyi > Kubernetes/nginx/nginx/html/index.html
[root@node3 ~]# echo MuPei > Kubernetes/nginx/nginx/html/index.html
查看pod_ip并访问
查看
[root@node1 html]# kubectl get pods -n nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-5ddd88ffbc-62thb 1/1 Running 0 10m 10.16.0.46 node3 <none> <none>
nginx-deployment-5ddd88ffbc-89qlj 1/1 Running 0 10m 10.16.0.47 node2 <none> <none>
nginx-deployment-5ddd88ffbc-8wgxd 1/1 Running 0 10m 10.16.0.45 node3 <none> <none>
nginx-deployment-5ddd88ffbc-mw8jp 1/1 Running 0 10m 10.16.0.48 node3 <none> <none>
访问
[root@node1 ~]# curl 10.16.0.45
FeiYi
[root@node1 ~]# curl 10.16.0.46
MePei
[root@node1 ~]# curl 10.16.0.47
MuPei
[root@node1 ~]# curl 10.16.0.48
MuPei
使用SERVICE的NodePort类型
Service通过Cluster节点的静态端口对外提供服务。Cluster外部可以通过集群中的nodeip:port访问到Service,port范围为30000-32767,手动和自动获取必须都是这个端口号范围
编写Service的yaml文件
[root@node1 ~]# vim nginx-svc.yaml
---
apiVersion: v1
kind: Service # 资源类型为Service
metadata:
name: nginx-svc
namespace: nginx # 添加到nginx的namespace
spec:
type: NodePort # Service类型为NodePort
selector:
app: nginx # 为label为app: nginx的pode负载
ports:
- protocol: TCP
targetPort: 80 # 容器内端口
port: 8080 # Service-ClusterIP端口
nodePort: 30000 # Service-NodePort端口
部署Service
[root@node1 ~]# kubectl apply -f nginx-svc.yaml
service/nginx-svc configured
查看svc
[root@node1 nginx_pod]# kubectl get svc -n nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-svc NodePort 10.99.100.254 <none> 8080:30000/TCP 51m
访问方式
从查看到的svc,有三种访问方式
集群内访问,
container_ip:80
集群内访问负载,
Cluster_ip:8080
集群外部访问负载,
Node_ip:30000
# 集群内访问:container_ip:80
[root@node1 ~]# curl 10.16.0.45
MuPei
[root@node1 ~]# curl 10.16.0.46
MuPei
[root@node1 ~]# curl 10.16.0.47
FeiYi
[root@node1 ~]# curl 10.16.0.48
MuPei
# 集群内访问: Cluster_ip:8080
# 此方式的轮询负载不是RR轮询,所以即使两台node设置的index.html内容不一样,也不一定能按比例轮询到
# 按照以下的访问结果来看,是随机轮询的
[root@node1 ~]# curl 10.99.100.254:8080
FeiYi
[root@node1 ~]# curl 10.99.100.254:8080
MuPei
[root@node1 ~]# curl 10.99.100.254:8080
FeiYi
[root@node1 ~]# curl 10.99.100.254:8080
MuPei
[root@node1 ~]# curl 10.99.100.254:8080
FeiYi
[root@node1 ~]# curl 10.99.100.254:8080
MuPei
[root@node1 ~]# curl 10.99.100.254:8080
MuPei
# 集群外部访问负载: Node_ip:30000
# 但凡能访问到这个集群的主机都能够访问到nginx-deployment的4个pod
[root@node1 ~]# curl 192.168.1.11:30000
MuPei
[root@node1 ~]# curl 192.168.1.12:30000
MuPei
[root@node1 ~]# curl 192.168.1.13:30000
FeiYi
Pod_ip
让集群外部的网络直接访问Pod_ip即可访问到对应pod
修改subnet的yaml文件
[root@node1 ~]# kubectl edit subnet ovn-default -o yaml
...
spec:
cidrBlock: 10.16.0.0/16
default: true
excludeIps:
- 10.16.0.1
gateway: 10.16.0.1
gatewayNode: "node1"
gatewayType: distributed # 改为centralized,非虚拟网络不需要更改
natOutgoing: true # 将nat转发关闭
private: false
protocol: IPv4
provider: ovn
underlayGateway: false
...
因为我的外部网络使用的windows,所以在windows上添加到cluster的路由
如下:
C:\Users\FeiYi>route ADD 10.16.0.0 MASK 255.255.0.0 192.168.1.11
操作完成!
C:\Users\FeiYi>ping 10.16.0.45
正在 Ping 10.16.0.45 具有 32 字节的数据:
来自 10.16.0.45 的回复: 字节=32 时间=2ms TTL=62
来自 10.16.0.45 的回复: 字节=32 时间=1ms TTL=62
然后使用windows访问pod_ip即可
一共四个pod,10.16.0.45/46/47/48
以上就是本文提到的pod的两种访问方式