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

10.16.0.45_pod

10.16.0.46_pod

10.16.0.47_pod

10.16.0.48_pod

以上就是本文提到的pod的两种访问方式

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0