CentOS搭建k8s集群(8)—nginx-ingress简单使用

1、拉取镜像
docker pull httpd

2、创建一个pod
vi /home/httpd.yaml
填入:

apiVersion: apps/v1
kind: Deployment
metadata: 
  name: httpd
spec: 
  replicas: 1
  selector: 
    matchLabels:
      app: httpd
  template: 
    metadata: 
      labels: 
        app: httpd
    spec: 
      containers: 
      - name: httpd
        image: httpd:latest

3、创建一个service
vi /home/http_svc1.yaml
填入:

apiVersion: v1
kind: Service
metadata:
  name: httpd-svc1
  labels:
    app: httpd
spec:
  type: ClusterIP
  selector:
    app: httpd
  ports:
  - port: 80
    targetPort: 80

4、创建一个ingress
vi /home/ingress_httpd.yaml
填入:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: httpd-test
  annotations:
     kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path:
        backend:
          serviceName: httpd-svc1
          servicePort: 80

5、执行
kubectl create -f /home/httpd.yaml
kubectl create -f /home/http_svc1.yaml
kubectl create -f /home/ingress_httpd.yaml

6、说明
1)service会映射到pod上,所以selector配置的labels要和pod里的一致
2)ingress会映射到service上,通过serviceName和servicePort
3)http_svc1.yaml里port是service的端口,targetPort是pod的端口
4)apiVersion的版本很有讲究,版本不同语法也不同

7、CLUSTER-IP方式的pod和service可以在所安装的node上访问,其他node、master都不能访问(这里是错的,应该集群内部都能访问,后面有改)
kubectl get all -o wide
找到:

NAME                              READY   STATUS             RESTARTS   AGE     IP            NODE        NOMINATED NODE   READINESS GATES
pod/httpd-84898796c-v6bkv         1/1     Running            0          6h28m   10.122.1.18   k8s-node1   <none>           <none>

NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service/httpd-svc1   ClusterIP   10.103.242.174   <none>        80/TCP    6h21m   app=httpd

在node1上访问:
curl http://10.122.1.18
curl http://10.103.242.174
均返回:
<html><body><h1>It works!</h1></body></html>

8、外网访问
由于nginx-ingress使用nodePort方式对外暴露ip和端口
访问:
curl -H 'Host:foo.bar.com' http://node1的IP:PORT/
显示:
<html><body><h1>It works!</h1></body></html>
如果不加域名,则返回其他错误,说明配置生效

9、进入nginx-ingress容器内
kubectl exec -it gateway-nginx-ingress-84fd9b79fd-tmnj6 -n nginx-ingress -- /bin/bash
nginx@k8s-node2:/$ cat /etc/nginx/nginx.conf

发现在/etc/nginx/conf.d下生成了配置文件default-httpd-test.conf

10、查看ingress
kubectl get ingress
kubectl describe ingress httpd-test

参考资料:
https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-helm/