k8s Ingress介绍和部署IngressController
Ingress介绍和部署IngressController
-
Ingress是为了弥补nodeport不足而生的,nodeport存在不足:一个端口只能一个服务使用,端口需要提前规划,只支持4层负载均衡。
-
Ingress 公开了从集群外部到集群内部服务的HTTP和HTTPS路由的规则集合,而具体实现流量路由是由Ingress Controller负责。
Ingress: k8s中一个抽象资源,给管理员提供一个暴漏应用的入口定义方法。
Ingress Controller: 根据Ingress生成具体的路由规则,并对Pod负载均衡器。
ingress Controller工作流程
Ingress Contronler通过于k8s API交互,动态去感知集群中Ingress 规则变化,然后读取它按照自定义规则,规则就是写明哪个域名对应哪个service ,生成一段nginx配资后,应用到管理Nginx服务, 然后热加载生效,从而达到Nginx负载均衡器配置及动态更新问题。
ingress-controller流程: 客户端->LB(公网)-> Ingress Controller(nginx) -> 分布在各pod节点
nodeport流程:客户端->LB(公网)->Service(nodeport)--> Ingress Controller(nginx) -> 分布在各pod节点
进入ingress-nginx
[root@k8s-master ~]# kubectl exec -it nginx-ingress-controller-5dc64b58f-7qwxn -n ingress-nginx -- bash
-
部署Ingress Controller
-
我们采用nginx控制器
-
下载YAML
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
-
也可以直接下载ingress-controller.yaml,提取码:hcgm 来直接创建ingress规则。
-
更改名称
mv mandatory.yaml ingress-controller.yaml
-
修改yaml
1. apps/v1 下的kind为 DaemonSet apiVersion: apps/v1 kind: DaemonSet# 如果通过Deployment部署只会在某个节点上能访问。考虑到高可用,通过DaemonSet会在每一个节点上部署 metadata: name: nginx-ingress-controller namespace: ingress-nginx labels: ... 2. 新增hostNetwork: true 将ingress-controller暴漏出去提供全局入口 spec: hostNetwork: true # wait up to five minutes for the drain of connections terminationGracePeriodSeconds: 300 serviceAccountName: nginx-ingress-serviceaccount nodeSelector: ... 3.更改镜像地址 containers: - name: nginx-ingress-controller image: lizhenliang/nginx-ingress-controller:0.30.0 args: - /nginx-ingress-controller ...
-
加载配置
kubectl apply -f ingress-controller.yaml
-
查看部署是否成功
kubectl get pods -n ingress-nginx
-
创建规则为其他项目暴漏
# 编辑规则 vi ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: xujunkai spec: rules: - host: web.xujunkai.com# 指定域名 http: paths: - path: / pathType: Prefix backend: service: name: web# 指定service 名称 port: number: 80 # service端口 # 创建规则 kubectl apply -f ingress.yaml # 查看规则 [root@k8s-master ~]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE xujunkai <none> web.xujunkai.com 80 7s
-
查看ingress-nginx在哪个节点上。
kubectl get pods -n ingress-nginx -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-ingress-controller-5dc64b58f-7qwxn 1/1 Running 0 9m50s 172.16.215.140 k8s-node01 <none> <none>
-
可以看到在172.16.215.140 上也就是k8s node01节点上
# 通过查看80 443端口已经有监听了,它就是ingress-nginx-controller监听的 [root@k8s-node01 logs]# ss -anpt | grep 80 [root@k8s-node01 logs]# ss -anpt | grep 443 # 而在master节点是没有监听的
-
访问
http://web.xujunkai.com/
是可以访问到的
-
-
ingress配置https
-
cfssl下载
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 chmod -x cfssl* for x in cfssl*; do mv $x ${x%*_linux-amd64}; done mv cfssl* /usr/bin
-
配置https步骤:
mkdir ssl cd ssl vi certs.sh # 生成证书 cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "expiry": "87600h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF cat > ca-csr.json <<EOF { "CN": "kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Beijing", "ST": "Beijing" } ] } EOF cfssl gencert -initca ca-csr.json | cfssljson -bare ca - #----------------------- cat > web.xujunkai.com-csr.json <<EOF { "CN": "web.xujunkai.com", "hosts": [], "key": { "algo": "rsa", "size": 2048 }, "name": [ { "C": "CN", "L": "BeiJing", "ST": "Beijing" } ] } EOF cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes web.xujunkai.com-csr.json | cfssljson -bare web.xujunkai.com
-
将证书保存到Secret
kubectl create secret tls web-xujunkai-com --cert=web.xujunkai.com.pem --key=web.xujunkai.com-key.pem
-
配置ingress https的yaml
vi ingress-https.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: xujunkai-https spec: tls: - hosts: - web.xujunkai.com secretName: web-xujunkai-com# 密钥证书名字 rules: - host: web.xujunkai.com http: paths: - path: / pathType: Prefix backend: service: name: web port: number: 80
-
应用ingress
kubectl apply -f ingress-https.yaml
-
查看ingress
[root@k8s-master ~]# kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE xujunkai-https <none> web.xujunkai.com 80, 443 35s
-
这样就可以访问
https://web.xujunkai.com
,需要提前本地配置hosts
-
-
之前部署的一个pod的python服务,通过service创建NodePod。这里通过ingress做负载。
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
rules:
- host: web.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: websvc# 这里是service名称
port:
number: 9527# 这里是创建pod容器端口