K8S Ingress 之 nginx-ingress-controller

阅读本文之前,建议先看一下前一篇文章《K8S Ingress 之 traefix-ingress-controller》,简单的了解下上篇文章的内容即可。

然后本文直接上配置步骤:
1、下载主描述文件

# wget 下载到本地
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml -O nginx-ingress-controller.yaml

在文件中搜索 serviceAccountName: nginx-ingress-serviceaccount,大约在215行左右。
然后添加 hostNetwork: true,再注释掉下面args中的几个参数,修改后的内容如下:

spec:
  replicas: 1 # 这个是运行ingress-controller程序的Pod的副本数,建议至少2个
  selector:
    matchLabels:
      app.kubernetes.io/name: ingress-nginx
      app.kubernetes.io/part-of: ingress-nginx
  template:
    metadata:
      labels:
        app.kubernetes.io/name: ingress-nginx
        app.kubernetes.io/part-of: ingress-nginx
      annotations:
        prometheus.io/port: "10254"
        prometheus.io/scrape: "true"
    spec:
      # wait up to five minutes for the drain of connections
      terminationGracePeriodSeconds: 300
      hostNetwork: true # 这个是添加的内容
      serviceAccountName: nginx-ingress-serviceaccount
      nodeSelector:
        kubernetes.io/os: linux
        #kubernetes.io/hostname: 192.168.1.65
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
          #image: docker.io/xzxiaoshan/nginx-ingress-controller:0.30.0 # 正常来说上面一行的image下载慢到你怀疑人生,你可以用我这个
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            #- --publish-service=$(POD_NAMESPACE)/ingress-nginx # 注释掉的内容
            - --annotations-prefix=nginx.ingress.kubernetes.io
            #- --default-backend-service=default/default-http-backend # 如果有需求可以不注释
            #- --default-ssl-certificate=$(POD_NAMESPACE)/tls-certificate # 如果有需求可以不注释

其中nodeSelector是指可以在哪些node节点上运行ingress-controller的Pod。
kubernetes.io/os: linux这个是默认值,你可以按需修改,os linux默认指所有node节点,因为k8s默认给所有节点打了这个label。
你可以在master上使用命令kubectl get node --show-labels查看label,你也可以给具体的节点设置特定的label用在这里使用。
比如kubernetes.io/hostname: 192.168.1.65 就是我只可能在这个节点上运行ingress-controller程序的的配置。

2、添加ingress定义文件
ingress-nginx.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-nginx
  #namespace: ingress-nginx
  annotations:
    kubernetes.io/ingress.class: "nginx"
    # 开启use-regex,启用path的正则匹配 
    nginx.ingress.kubernetes.io/use-regex: "true"
    nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
  tls:
  - hosts:
    - shanhy-k8s.com
    - "*.shanhy-k8s.com"
    secretName: ingress-secret
  rules:
  - host: www.shanhy-k8s.com
    http:
      paths:
      - path: /
        backend:
          serviceName: helloworld-nodejs
          servicePort: 20001

因为ingress和service以及service下的pod都要在同一个namespace中,而我的helloworld服务放在了默认的default命名空间下,所以这里需要把namespace: ingress-nginx注释掉。

3、https 证书的生成

openssl genrsa -out ingress-key.pem 2048 
openssl req -new -x509 -key ingress-key.pem -out ingress.pem -subj /C=CN/ST=BeiJing/L=BeiJing/O=Shanhy/OU=Shanhy/CN=www.shanhy-k8s.com

4、k8s 创建 secret

# 注意这里一定要用--key和--cert方式,不建议你用--from-file方式(除非你已经很了解secret不然有可能坑的你家都不知道在哪)
kubectl create secret tls ingress-secret --key cert/ingress-key.pem --cert cert/ingress.pem 

5、运行并查看状态

kubectl apply -f nginx-ingress-controller.yaml
kubectl apply -f ingress-nginx.yaml
# 下面几个命令用于查看相关组件
kubectl get ingress -o wide -A
kubectl get secret -o wide -A
kubectl get deploy -o wide -A
kubectl get svc -o wide -A
kubectl get pod -o wide -A
kubectl logs -f -n ingress-nginx   nginx-ingress-controller-7dc499cdd7-dxnns

如果 kubectl logs 输出的日志中没有错误,基本上就是运行成功了。
然后你就将域名配置到电脑的C:\Windows\System32\drivers\etc\hosts后用浏览器访问验证了。


官方资料:
https://github.com/kubernetes/ingress-nginx
https://kubernetes.github.io/ingress-nginx/deploy/

扫描二维码关注公众号,回复: 11514740 查看本文章

(END)

猜你喜欢

转载自blog.csdn.net/catoop/article/details/104927906