搭建好k8s環(huán)境之后吴叶,需要將內部的服務一個個都能夠在外網進行訪問,所以我們的設想是這樣的:
nginx擁有外部網絡的ip锌俱,而且能夠轉發(fā)請求到內部晤郑,接下來我們來實現
安裝各種ingress controller的各種組件
yaml文件在此:https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml,這個總是最新的版本贸宏,如果需要其他版本的造寝,可以參考:https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.20.0/deploy/mandatory.yaml,這里的0.20.0吭练,可以更改诫龙,比如改為0.21.0;
這些文件都都是開源維護在github上的鲫咽,可以上去看具體的實現和使用說明签赃,這里給個0.25.0的地址https://github.com/kubernetes/ingress-nginx/tree/nginx-0.25.0/deploy/static,上去后可以切換Tag分尸,branch來看其他的版本锦聊,如圖:
下載文件稍作修改
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml
查找文件中用到的鏡像,有些鏡像需要翻墻才可以下箩绍,所以提前準備好鏡像孔庭,或者有自己的倉庫的,可以提前準備好
給一個我現在0.25.0版本鏡像地址:
registry.cn-hangzhou.aliyuncs.com/wuji_cyb/ingress-controller:0.25.0(注意下載完docker tag成需要的鏡像)
加上hostNetwork的選項,配置hostNetwork: true是一種直接定義Pod網絡的方式圆到。定義后怎抛,Ingress-controller的IP就與宿主機IP一樣:
部署、測試
kubectl apply -f mandatory.yaml
測試curl通芽淡,也看到了ip是宿主機node的ip
部署一個應用來進行測試
查看mandatory.yaml马绝,里面有如下圖的args配置:
這里有tcp-services、udp-services挣菲、nginx-configuration富稻、這些都是configmap,我們可以通過創(chuàng)建這些configmap己单,來動態(tài)讓配置生效唉窃;如果有nginx-configuration這個configmap,會自動作為nginx的配置項生效纹笼;tcp-services和udp-services是用來將內部服務通過nginx暴露出去的,來試一試:
部署一個mysql苟跪,然后將mysql暴露出去:
mysql.yaml:
---
apiVersion: v1
kind: ReplicationController
metadata:
name: mysql-rc
labels:
name: mysql-rc
spec:
replicas: 1
selector:
name: mysql-pod
template:
metadata:
labels:
name: mysql-pod
spec:
containers:
- name: mysql
image: hub.c.163.com/library/mysql:5.7
imagePullPolicy: IfNotPresent
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: "mysql"
---
apiVersion: v1
kind: Service
metadata:
name: mysql-svc
labels:
name: mysql-svc
spec:
ports:
- port: 3306
targetPort: 3306
selector:
name: mysql-pod
---
編輯configmap廷痘, tcp-services,如下:
kind: ConfigMap
apiVersion: v1
metadata:
name: tcp-services
namespace: kube-system
data:
13306: "default/mysql-svc:3306"
13306: "default/mysql:3306"的含義是將命名空間default的下mysql-svc的3306端口負載到nginx-controller的13306端口件已;話說這是L4層負載笋额,本人不是很懂這些;然后我們就可以通過nginx controller 這個pod的ip加上13306端口就可以訪問mysql了篷扩,上面我們看到pod的ip是node宿主機的ip10.57.31.23兄猩,所以10.57.31.23:13306就是mysql的訪問地址;同理鉴未,UDP暴露用配置udp-services的configmap即可枢冤,不舉例了
編寫ingress規(guī)則來暴露
這才是我們平時使用最多的,通過定義ingress來暴露服務铜秆,也就是L7淹真,部署個tomcat
---
apiVersion: v1
kind: ReplicationController
metadata:
name: tomcat-rc
labels:
name: tomcat-rc
spec:
replicas: 1
selector:
name: tomcat-pod
template:
metadata:
labels:
name: tomcat-pod
spec:
containers:
- name: tomcat
image: hub.c.163.com/library/tomcat:8.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: tomcat-svc
labels:
name: tomcat-svc
spec:
ports:
- port: 8080
targetPort: 8080
selector:
name: tomcat-pod
---
編寫Ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: ingress-tomcat-mysql
spec:
rules:
- host: k9s.cyb.com
http:
paths:
- path: /tomcat(/|$)(.*)
backend:
serviceName: tomcat-svc
servicePort: 8080
配置k9s.cyb.com到本地/etc/hosts,然后瀏覽器訪問k8s.cyb.com就可以訪問到tomcat了连茧; nginx.ingress.kubernetes.io/rewrite-target這個配置為了轉發(fā)的時候將/tomcat這個相對路徑換成/核蘸,而且保留后面的露囧;具體使用參照https://github.com/kubernetes/ingress-nginx/blob/master/docs/examples/rewrite/README.md,這樣的最終結果就是對外提供一個域名啸驯,加上各種路徑就可以提供不同的服務了客扎;
替換效果示例:
rewrite.bar.com/something rewrites to rewrite.bar.com/
rewrite.bar.com/something/ rewrites to rewrite.bar.com/
rewrite.bar.com/something/new rewrites to rewrite.bar.com/new