七、k8s ingress (http/https)部署与使用
简单来讲,就是一个利用负载均衡的玩意,其主要用来解决使用NodePort暴露Service的端口时Node IP会漂移的问题。同时,若大量使用NodePort暴露主机端口,管理会非常混乱。好的解决方案就是让外界通过域名去访问Service,而无需关心其Node IP及Port。那为什么不直接使用Nginx?这是因为在K8S集群中,如果每加入一个服务,我们都在Nginx中添加一个配置,其实是一...
ingress简单来讲,就是一个利用负载均衡的玩意,其主要用来解决使用NodePort暴露Service的端口时Node IP会漂移的问题。同时,若大量使用NodePort暴露主机端口,管理会非常混乱。
好的解决方案就是让外界通过域名去访问Service,而无需关心其Node IP及Port。那为什么不直接使用Nginx?这是因为在K8S集群中,如果每加入一个服务,我们都在Nginx中添加一个配置,其实是一个重复性的体力活,只要是重复性的体力活,我们都应该通过技术将它干掉。
参考文档:https://kubernetes.io/docs/concepts/services-networking/ingress/
注意线上要部署多副本模式,可以指定机器部署,也可以每台机器放一个ingress服务
Pod与Ingress的关系
通过label-selector相关联
通过Ingress Controller实现Pod的负载均衡
支持TCP/UDP 4层和HTTP 7层
1、部署ingress
部署文档:https://github.com/kubernetes/ingress-nginx/blob/master/docs/deploy/index.md
下载yaml文件:
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/mandatory.yaml
注意事项:
• 镜像地址修改成国内的:lizhenliang/nginx-ingress-controller:0.20.0
• 使用宿主机网络:hostNetwork: true
创建ingress:
[root@master ingress]# kubectl create -f mandatory.yaml
查看ingress服务:
[root@master ingress]# kubectl get all -n ingress-nginx
NAME READY STATUS RESTARTS AGE
pod/nginx-ingress-controller-79888fdc4c-qbpdb 1/1 Running 0 64s
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-ingress-controller 1 1 1 1 66s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-ingress-controller-79888fdc4c 1 1 1 65s
注意如果:
如果出现下面类似错误:
kubectl describe pod nginx-ingress-controller-7f44d6dccb-fn7rk -n ingress-nginx
可能是机器磁盘不够了,注意检测磁盘容量,这里我是被坑到了
其他控制器参考:
https://kubernetes.io/docs/concepts/services-networking/ingress/、
2、使用ingress (http)
编写ingress yam文件让service与ingress关联
[root@master ingress_test]# cat k8s_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: simple-nginx-example
annotations:
#配置重定向相关
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: k8s.aicard001.com
http:
paths:
- path: /
backend:
#匹配需要代理的service名字
serviceName: my-service
#对应clusterip端口
servicePort: 80
创建:
kubectl apply -f k8s_ingress.yaml
查看我们域名绑定策略是否正确:
[root@master ingress_test]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
simple-fanout-example test.aicard001.com 80 37m
查看ingress绑定的机器:
[root@master ~]# kubectl get pods -n ingress-nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE
default-http-backend-757754bc6b-x7g8q 1/1 Running 0 1d 172.17.32.8 192.168.1.40
nginx-ingress-controller-7f44d6dccb-mgdlg 1/1 Running 0 1d 192.168.1.42 192.168.1.42
绑定域名解析,可以本机host上绑定,也能在云服务商,云解析处绑定:
我们绑定:k8s.aicard001.com -->192.168.1.40
此时访问:k8s.aicard001.com 便能正确代理到service
注意,如果你有多个虚拟主机,ingress支持定义多个虚拟主机:
当多个项目使用同一个ingress的时候,这个时候需要更加项目名来区分具体代理到那个后端了:
例如:
此时,访问原来的项目就是:http://k8s.aicard001.com/k8s
3、使用ingress(https)
利用cfssl颁发证书:
1 生成ca模板并改信息
cfssl print-defaults csr >ca-csr.json
[root@master https]# cat ca-csr.json
{
"CN": "xianrenqiu",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Hangzhou",
"ST": "Hangzhou"
}
]
}
2 生成默认配置文件:(不用做变动)
cfssl print-defaults csr >liaochao-csr.json
3 生成网站所需要的配置文件:
[root@master https]# cat liaochao-csr.json
{
"CN": "www.liaochao.com",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing"
}
]
}
4 初始化ca证书文件
cfssl gencert --initca ca-csr.json |cfssljson -bare ca -
5 初始化网站证书文件
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem --config=ca-config.json --profile=www liaochao-csr.json |cfssljson -bare server
此时生成的 server-key.pem server.pem 2个私钥就是我们所需要的
如果我们在服务商处申请到了证书,上面的步骤都可以省略
将生成的密钥导入到集群中
kubectl create secret tls aicard --key 2_aicard001.com.key --cert 1_aicard001.com_bundle.crt
检查
[root@master ingress_test]# kubectl get secret
NAME TYPE DATA AGE
aicard kubernetes.io/tls 2 26m
生成https的网站文件
[root@master ingress_test]# cat https_aicard.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tls-k8s-ingress
spec:
tls:
- hosts:
- k8s.aicard001.com
secretName: aicard
rules:
- host: k8s.aicard001.com
http:
paths:
- path: /
backend:
serviceName: my-service
servicePort: 80
创建:
kubectl apply -f https_aicard.yaml
查看是否绑定
[root@master ingress_test]# kubectl get ingress
NAME HOSTS ADDRESS PORTS AGE
simple-nginx-example k8s.aicard001.com 80 83m
tls-k8s-ingress k8s.aicard001.com 80, 443 25m
https访问
此时,如果是字签证书,我们在win机器上面的hosts文件中加入相对于的域名,现在我们访问域名http会自动跳转https,因为这个证书不信任这个域名所以会显示不安全。
更多推荐
所有评论(0)