缘由

看了statefulset基础教程的基础教程,并且把环境搭建起来后。pod内部是可以连通了。但是我不知道怎么去从外部访问。在网上搜索一番,通过Ingress可以作为集群的入口。遂记录之。
结合Statefulset的示例进行配置。这是未配置Ingress之前的Statefulset示例:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
    - port: 80
      name: web
  clusterIP: None
  selector:
    app: nginx

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: "www-data-pv"
  labels:
    name: www-data-pv
    release: stable
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Recycle
  nfs:
    path: /nfs/www/data
    server: 192.168.84.75

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: www-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi
  selector:
    matchLabels:
      name: www-data-pv
      release: stable

---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
              name: web
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
      volumes:
        - name: www
          persistentVolumeClaim:
            claimName:  www-data-pvc

Ingress

我们知道前面我们使用 NodePort 和 LoadBlancer 类型的 Service 可以实现把应用暴露给外部用户使用,除此之外,Kubernetes 还为我们提供了一个非常重要的资源对象可以用来暴露服务给外部用户,那就是 ingress。
创建一个 ingress 对象:(ingress.yaml)

# Ingress 配置
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: web-cluster-external
  labels:
    name: web-cluster-external
    app: nginx
spec:
  rules:
    - host: nginx.com
      http:
        paths:
          - backend:
              serviceName: web-cluster-external
              servicePort: 80
            path: /

然后为 traefik dashboard 创建对应的 ingress 对象:

$ kubectl create -f ingress.yaml

可以查看ingress是否创建成功

kubectl describe ingress web-cluster-external

要注意上面的 ingress 对象的规则,特别是 rules 区域,我们这里是要为 ngin 建立一个 ingress 对象,所以这里的 serviceName 对应的是上面我们创建的 web-cluster-external
,端口也要注意对应 80端口,为了避免端口更改,这里的 servicePort 的值也可以替换成上面定义的 port 的名字: web
``
创建完成后,我们应该怎么来测试呢?

  • 第一步,在本地的**/etc/hosts**里面添加上 nginx.com
    与 节点外网 IP 的映射关系- 第二步,在浏览器中访问:nginx.com 我们会发现并没有得到我们期望的 inde.html界面,这是因为我们上面statefulset 部署 nginx 的时候没有外放NodePort端口。需要配置。ClusterIP都是集群内部访问的。需要我们建立一个名为service对象node.yaml
# cluster ip
apiVersion: v1
kind: Service
metadata:
  name:  web-cluster-external
  labels:
    name:  web-cluster-external
    app: nginx
spec:
  selector:
    app: nginx
  ports:
    - name: http
      port: 80
      targetPort: 80
      nodePort: 32002 #增加
  type: NodePort

创建service对象

kubectl  apply node.yaml

这样就可以通过节点 ip:32002来访问nginx或者是通过域名来访问啦

--完--