helm方式安装nginx-ingress
基本概念:
#kubernetes Service的类型(ServiceType)决定了Service如何对外提供服务,根据类型不同,服务可以只在Kubernetes cluster中可见,也可以暴露到Cluster外部。
Service有三种类型,ClusterIP,NodePort和LoadBalancer。
ClusterIP是Service的缺省类型,这种类型的服务会提供一个只能在Cluster内才能访问的虚拟IP,并且该ip不可ping
#kubernetes配置服务外部可访问的方式有(说法并不严谨,只做范例理解)
一、NodePort设置Service的类型为NodePort,可以在Cluster中的主机上通过一个指定端口暴露服务,发送到该主机端口的请求会被kubernetes路由到提供服务的Pod上。
可以通过主机ip:端口的方式访问服务
二、loadbalancer 需要云服务商提供
三、ingress(ingress可以转发外部请求到k8s内部的服务,然后再转发回来)
#此时配置nginx-ingress-controller为nodeport模式,外部访问ingress服务地址(nodeip+nodeport),当然如果有云服务支持,可以设置为loadbalancer;
#其他可转发的服务设置为clusterip,ingress通过clusterip与其他服务通信
官方参考地址:
https://kubernetes.github.io/ingress-nginx/deploy/#using-helm
https://kubernetes.github.io/ingress-nginx/user-guide/tls/
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/configmap/
https://github.com/helm/charts/blob/master/stable/nginx-ingress/values.yaml
https://docs.cert-manager.io/en/latest/getting-started/install/kubernetes.html
Service:
https://kubernetes.io/docs/concepts/services-networking/service/
https://kubernetes.github.io/ingress-nginx/deploy/baremetal/(ingress对外几种方式的官方详解,本教程采用的nodeport形式)
本教程采用阿里云stable/charts
具体用法:helm inspect stable/nginx-ingress
#安装nginx-ingress with cert-manager TLS
一、安装helm
#详见heml文件夹下的教程
二、部署NGINX Ingress
#使用helm安装ingress(此处以nodeport方式开放外部访问nginx-ingress-controller)
helm install stable/nginx-ingress --name nginx-ingress -f ./values.yaml --tls --debug
helm install micro/nginx-ingress --name nginx-ingress -f ./1.8.1.yaml --tls --debug
#获取安装的版本(看指定标签的pods,支持’=’, ‘==’, and ‘!=’操作符 kubectl get pods -l key=value)
POD_NAME=$(kubectl get pods -l app=nginx-ingress -o jsonpath='{.items[0].metadata.name}')
kubectl exec -it $POD_NAME -- /nginx-ingress-controller --version
#查看svc
kubectl get svc -o wide
#此时非集群内主机(但网络可达kubernetes),访问vip或者pod所在nodeip的32080端口(对应nginx-ingress-controller服务80)或者32443(对应nginx-ingress-controller服务服务443)
浏览器返回:default backend - 404
#卸载命令:helm del --purge nginx-ingress --tls
三、Assign a DNS name
The external IP that is allocated to the ingress-controller is the IP to which all incoming traffic should be routed. To enable this, add it to a DNS zone you control, for example as example.your-domain.com.
This quickstart assumes you know how to assign a DNS entry to an IP address and will do so.
#详见coredns教程
四、创建TLS
#创建自签ca和key
mkdir -pv /etc/kubernetes/pki/ingress && cd /etc/kubernetes/pki/ingress
#注意下面的域名,其他服务启用ingress tls的会验证主机名称
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ./ca.key.pem -out ./ca.cert.pem -subj "/C=CN/O=INGRESS/CN=*.kubernetes.ingress"
#集群内创建密钥
kubectl create secret tls ingress-cert-tls --key ./ca.key.pem --cert ./ca.cert.pem -n default
#查看
kubectl get secrets
NAME TYPE DATA AGE
default-token-7546r kubernetes.io/service-account-token 3 12d
ingress-tls-cert kubernetes.io/tls 2 9m54s
kubernetes-dashboard Opaque 0 3h21m
kubernetes-dashboard-token-dl66n kubernetes.io/service-account-token 3 3h21m
letsencrypt-prod Opaque 1 26h
nginx-ingress-token-4pzks kubernetes.io/service-account-token 3 27h
prometheus-prometheus-alertmanager-token-26kzc kubernetes.io/service-account-token 3 170m
prometheus-prometheus-kube-state-metrics-token-f26k5 kubernetes.io/service-account-token 3 170m
prometheus-prometheus-node-exporter-token-92d7g kubernetes.io/service-account-token 3 170m
prometheus-prometheus-server-token-wqlvq kubernetes.io/service-account-token 3 170m
五、部署一个pod服务到nginx-ingress的范例
#部署pod example01
cat <<EOF > example01-ingress.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: kuard
spec:
replicas: 1
template:
metadata:
labels:
app: kuard
spec:
containers:
- image: gcr.azk8s.cn/kuar-demo/kuard-amd64:1
imagePullPolicy: Always
name: kuard
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: kuard
spec:
ports:
- port: 80
targetPort: 8080
protocol: TCP
selector:
app: kuard
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-kuard
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
rules:
- host: kuard.kubernetes.ingress
http:
paths:
- path: /
backend:
serviceName: kuard
servicePort: 80
tls:
- secretName: ingress-cert-tls
hosts:
- kubernetes.ingress
EOF
kubectl apply -f example01-ingress.yaml
#查看ingress状态
kubectl get ingress
#web访问http://kubernetes.ingress:32080 #需要配置外部的dns解析对应域名为vip或者nodeip
会显示kuard的页面
#web访问https://kubernetes.ingress:32443 #需要配置外部的dns解析对应域名为vip或者nodeip
因为未配置合适的证书,所以会报证书风险,以及404错误
#curl -kivL -H 'Host: kubernetes.ingress' 'http://192.168.10.240:32080'
#curl -kivL -H 'Host: kubernetes.ingress' 'http://192.168.10.240:32443'
#升级
helm upgrade nginx-ingress micro/nginx-ingress -f ./1.7.0.yaml --tls --debug
直接粘贴笔记,格式不太美观,教程原文件及yaml配置文件,可以直接百度云下载后浏览:https://pan.baidu.com/s/14KArQ7yWhqWJEgcVZrxE6Q 提取码:86mq