基本概念: #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