Service資源為動態(tài)管理的Pod對象添加一個固定訪問入口
Service為四層調(diào)度器
service通過標(biāo)簽選擇器關(guān)聯(lián)至擁有相關(guān)標(biāo)簽的Pod對象
客戶端向Service進(jìn)行請求,而非目標(biāo)Pod對象
Service資源變動時,有kube-proxy控制器將規(guī)則應(yīng)用至本機(jī)iptables或者ipvs規(guī)則
而kube-proxy為DaemonSet 控制器將會在集群中每個節(jié)點運(yùn)行一個Pod或者守護(hù)進(jìn)程
如果需要轉(zhuǎn)換ipvs規(guī)則,則需要手動加載ipvs模塊進(jìn)入內(nèi)核
iptables代理模式,對于每個Service對象,kube-proxy會創(chuàng)建iptables規(guī)則直接捕獲到達(dá)cluster ip和Port流量,并將其重定向至當(dāng)前Service對象的后端Pod資源,對于每個Endpoint對象,Service資源會為其創(chuàng)建iptables規(guī)則并關(guān)聯(lián)
ipvs代理模式 kube-proxy跟蹤API server上 Service和Endpoints(ip+port)對象變動,來調(diào)用netlink接口創(chuàng)建ipvs規(guī)則,并確保于API server中變動同步,于iptables規(guī)則不同之處僅在處于其請求流量的調(diào)度功能有ipvs實現(xiàn),余下的其他功仍然由iptables完成
servcie資源定義:
[root@node1 ~]# vim svc.yml
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: prod
spec:
ports: #ports字段定義svc端口與后端哪個端口相關(guān)連
- name: http #ports字段名稱
port: 80 #svc端口
targetPort: 80#目標(biāo)后端端口
nodePort: 30080 #自定義nodePort端口
selector:#標(biāo)簽選擇器
app: myapp
rel: stable
type: NodePort#NodePort可以定義一個端口給外部范圍
#####直接訪問svc地址就會調(diào)度至后端匹配的標(biāo)簽的pod中即便控制器增加或者減少,svc也會自動關(guān)聯(lián)新增pod
[root@node1 chapter5]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d5h
myweb NodePort 10.100.112.31 <none> 80:30593/TCP 2d1h
[root@node1 chapter5]# kubectl get svc -n prod
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
myapp ClusterIP 10.105.226.215 <none> 80/TCP 2m2s
[root@node1 chapter5]# curl 10.105.226.215
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>
[root@node1 chapter5]#
svc類型:
clusterIP:為一個svc分配一個當(dāng)前集群內(nèi)的動態(tài)地址,客戶端pod對象訪問服務(wù)的Pod對象時不會進(jìn)行源地址轉(zhuǎn)換,且不會被外部地址訪問,只能在集群內(nèi)部被訪問。
NodePort:對于某svc來說會在每個節(jié)點生成一個ipvs規(guī)則打開節(jié)點端口,映射至svc ip的端口上。
還可以手動創(chuàng)建endpoints資源將ip地址指向外部。將名稱命名為svc相同時即可
kubectl edit cm kube-proxy -n kube-system

在線修改configmap文件,使其加載ipvs規(guī)則
kubectl delete pod -l k8s-app=kube-proxy,pod-template-generation=1 -n kube-system ##刪除pod,讓ipvs規(guī)則在kube-proxy生效

生效之后的pod會生成ipvs規(guī)則
Ingress資源,7層代理|調(diào)度
標(biāo)準(zhǔn)的api對象,管理外部請求到內(nèi)部流量。協(xié)議為http,僅用域定義流量轉(zhuǎn)發(fā)和調(diào)度的通用格式的配置信息,它們需要轉(zhuǎn)換為特定的具有http協(xié)議轉(zhuǎn)發(fā)和調(diào)度功能的應(yīng)用程序的配置文件,并由相應(yīng)的應(yīng)用程序生效,相應(yīng)的配置后完成流量轉(zhuǎn)發(fā)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml 部署ingress
[root@node1 ingress]# vim ingress-svc.yml
apiVersion: v1
kind: Service
metadata:
name: ingress
namespace: ingress-nginx
spec:
selector:
app.kubernetes.io/name: ingress-nginx
app.kubernetes.io/part-of: ingress-nginx
ports:
- name: http
port: 80
- name: https
port: 443
type: NodePort
部署svc使其外部網(wǎng)絡(luò)能夠訪問至ingress


創(chuàng)建后端pod,并為pod指定svc資源
[root@node1 ~]# vim myns-ingress.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
namespace: myns
spec:
replicas: 2
selector:
matchLabels:
app: myapp
rel: beta
template:
metadata:
namespace: myns
labels:
app: myapp
rel: beta
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: myns
spec:
selector:
app: myapp
rel: beta
ports:
- name: http
port: 80
targetPort: 80
創(chuàng)建ingress資源,為之前創(chuàng)建的ingress-nginx這個程序提供ingress配置。
apiVersion: extensions/v1beta1
kind: Ingress #資源類型
metadata: #元數(shù)據(jù)
name: myapp
namespace: myns
annotations: #此字段為資源注解,作為配置信息提供方
kubernetes.io/ingress.class: "nginx"
spec: #定義ingress內(nèi)部資源
rules:
- host: www.node1.com #定義后端主機(jī)
- http: ##定義后端資源
paths:
- path: / #定義后端映射路徑為/
backend: #后端資源
serviceName: myapp #此為svc資源名稱
servicePort: 80 #此為svc端口
~

創(chuàng)建成功,會自動關(guān)聯(lián)至myapp此svc,且會綁定后端資源

此時直接訪問宿主機(jī)即可訪問后端資源
使用https訪問
openssl genrsa -out myapp.key 2048 ##生成私鑰
openssl req -new -x509 -key myapp.key -out myapp.crt -subj /C=CN/ST=Beijing/L=Beijing/O=ops/CN=www.node.com -days 365 #自簽名
[root@node1 ~]# kubectl create secret tls ilinux-cert -n myns --cert=myapp.crt --key=myapp.key
secret/ilinux-cert created #在集群中創(chuàng)建證書。
##配置成使用證書的ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: tls-ingress
namespace: myns
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
tls: #引用證書
- hosts: #此主機(jī)需要為證書簽名時指定的域名一致
- www.node.com
secretName: ilinux-cert #secre資源的名稱。就是我們剛才創(chuàng)建的k8s資源
rules: #后端規(guī)則,需前一份資源系統(tǒng)
- host: www.node1.com
http:
paths:
- path: /
backend:
serviceName: myapp
servicePort: 80
#############################
[root@node1 ~]# kubectl get ingress -n myns
NAME HOSTS ADDRESS PORTS AGE
myapp www.node1.com 80 52m
tls-ingress www.node.com 80, 443 51s

創(chuàng)建完成
kubectl exec -it nginx-ingress-controller-568867bf56-lrm4f -n ingress-nginx -- /bin/sh##連接至pod內(nèi)容器,配置文件會自動填充我們定義的ingress的配置


