wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.20.0/deploy/mandatory.yaml
更新yaml里面两处镜像地址,此处使用的是阿里的镜像仓库
image: registry.cn-hangzhou.aliyuncs.com/google_containers/defaultbackend:1.4 image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.23.0
部署nginx-ingress-controller
[k8s@k8s-m1 ingress]$ kubectl apply -f mandatory.yaml namespace/ingress-nginx created deployment.extensions/default-http-backend created service/default-http-backend created configmap/nginx-configuration created configmap/tcp-services created configmap/udp-services created serviceaccount/nginx-ingress-serviceaccount created clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created role.rbac.authorization.k8s.io/nginx-ingress-role created rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created deployment.extensions/nginx-ingress-controller created
查看部署后的状态
#deployment状态 [k8s@k8s-m1 ingress]$ kubectl get deployment -n ingress-nginx NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE default-http-backend 1 1 1 1 7m nginx-ingress-controller 1 1 1 1 7m #pod状态 [k8s@k8s-m1 ingress]$ kubectl get pods -n ingress-nginx -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE default-http-backend-598df75c7d-ngfvs 1/1 Running 0 3m 172.60.75.2 k8s-m1 <none> nginx-ingress-controller-67954599b4-hbkfg 1/1 Running 0 3m 172.60.19.3 vm10-10-8-10ksccom <none> #svc状态 [k8s@k8s-m1 ingress]$ kubectl get svc -n ingress-nginx -o wide NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR default-http-backend ClusterIP 10.240.44.251 <none> 80/TCP 4m app.kubernetes.io/name=default-http-backend,app.kubernetes.io/part-of=ingress-nginx
default-http-backend是安装的一个默认后端,ClusterIP类型,可以在集群任意node访问,用于返回404结果
二、测试
[root@k8s-m2 ~]# curl http://10.240.44.251
default backend - 404
[root@k8s-m2 ~]# curl http://10.240.44.251/healthz
ok[root@k8s-m2 ~]#
到这里,说明ingress-nginx已经部署成功了。
以上是通过default-http-backend进行访问,并没有对集群外部暴露服务,
接下来继续,看看对外暴露服务的方式
三、通过nodeport的方式将服务暴露出去
下载nodePort模板
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/provider/baremetal/service-nodeport.yaml
default backend - 404[k8s@k8s-m1 ingress]$ cat service-nodeport.yaml
apiVersion: v1
kind: Service
metadata:
name: ingress-nginx
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
protocol: TCP
- name: https
port: 443
targetPort: 443
protocol: TCP
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
---
#生效
[k8s@k8s-m1 ingress]$ kubectl create -f service-nodeport.yaml
查看svc状态
[k8s@k8s-m1 ingress]$ kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE default-http-backend ClusterIP 10.240.13.114 <none> 80/TCP 44m ingress-nginx NodePort 10.240.82.29 <none> 80:8807/TCP,443:8956/TCP 40m nginx-1108 ClusterIP 10.240.31.31 <none> 80/TCP,1935/TCP 42m
创建一个应用
[k8s@k8s-m1 ingress]$ cat nginx-1.10.2.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-1108
labels:
app: nginx-1108
namespace: ingress-nginx
spec:
selector:
app: nginx-1108
ports:
- name: http80
port: 80
targetPort: 80
- name: rtmp1935
port: 1935
targetPort: 1935
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-1108
labels:
addonmanager.kubernetes.io/mode: Reconcile
namespace: ingress-nginx
spec:
template:
metadata:
labels:
app: nginx-1108
spec:
containers:
- name: my-nginx-1108
image: rtmp-nginx:1.10.8
imagePullPolicy: Never
command: ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
ports:
- containerPort: 80
创建ingress规则
# 域名方式访问,本次使用域名方式测试
nginx-ingress]# cat ingress-host-nginx-1.10.2.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: pand-ingress
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- host: www.test1.com
http:
paths:
- backend:
serviceName: nginx-1108
servicePort: 80
# url路径方式访问
nginx-ingress]# cat ingress-path-nginx-1.10.2.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: test-ingress
annotations:
ingress.kubernetes.io/ssl-redirect: "false"
spec:
rules:
- http:
paths:
- path: /test1
backend:
serviceName: nginx-1108
servicePort: 80
使用ingress域名规则进行测试
[root@k8s-m2 ~]# curl http://10.240.82.29/
default backend - 404[
[root@k8s-m2 ~]# curl -H "Host: foo.bar.com" http://10.240.82.29/
successfully
[root@k8s-m2 ~]# curl -H "Host: foo.bar.com" http://nodePort+port/
successfully
四、通过hostNetwork的方式,对外暴露服务
修改mandatory.yaml,对nginx-ingress-controller添加hostNetwork: true,
hostNetwork是直接定义pod的网络方式,定义后,物理机ip就是nginx-ingress的ip,通过物理机ip直接访问nginx-ingress端口,将请求转发给后端pod
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: nginx-ingress-controller
namespace: ingress-nginx
labels:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
spec:
replicas: 1
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:
hostNetwork: true
serviceAccountName: nginx-ingress-serviceaccount
nodeSelector:
zone: test_node
containers:
- name: nginx-ingress-controller
image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:0.23.0
kubectl apply -f mandatory.yaml
查看pod所在物理机监听的端口,多了一个80端口,即nginx-ingress端口
tcp 0 0 10.10.8.11:2380 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8800 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:8801 0.0.0.0:* LISTEN
测试
#通过物理机ip测试
[k8s@k8s-m1 ~]$ curl http://10.69.58.68/
default backend - 404