service
? service存在的意義
? ? ? ? 1 防止pod失去聯(lián)系(服務(wù)發(fā)現(xiàn))
2 定義一組pod的訪問策略(負載均衡)
通過label-selector相關(guān)聯(lián)(標(biāo)簽關(guān)聯(lián))
通過service實現(xiàn)pod的負載均衡(tcp/UDP/只能支持4層)
service只支持4層負載均衡
4層: OSI中的傳輸層, TCP/UDP協(xié)議 只負責(zé)數(shù)據(jù)包的轉(zhuǎn)發(fā)
7層: OSI中的應(yīng)用層 http fTP? 可以拿到這些協(xié)議頭部信息 可以實現(xiàn)基于協(xié)議層面的處理
service的三種常用的類型
? ClusterIP 集群內(nèi)部使用
? ? ? clusterIP 默認分配一個穩(wěn)定的IP? 即VIP 只能在集群內(nèi)部訪問 (同Namespace內(nèi)的pod)
? NOdePort 對外部暴露應(yīng)用
? ? ? NoPort訪問流程
? ? ? ? ? [? USER > 域名 > node ip+port > iptables/ipvs > pod]
? LoadBalancer 對外暴露應(yīng)用 適合公有云
? LoadBalancer訪問流程
? ? [user > 域名 > 公有云的slb (自動配置端口) > node:ip:port > pod]
? userspace 自己用戶實現(xiàn)的轉(zhuǎn)發(fā)
? iptables? 阻止ip通信 端口映射 跟蹤包狀態(tài)? 數(shù)據(jù)包的修改
? ipvs? ? ? LVS 就是基于ipvs模塊做的4層負載均衡器
kube-proxy?
? ? 1:實現(xiàn)數(shù)據(jù)包的轉(zhuǎn)發(fā)
? ? 2:將service相關(guān)的規(guī)則落地現(xiàn)實
iptables規(guī)則:
Nodeport -> KUBE-SVC-RRHDV4CFXHW7RWV3 -> KUBE-SEP-XE5XFBDN7LLHNVMO -> -j DNAT --to-destination 10.244.2.2:80
clusterip -> KUBE-SVC-RRHDV4CFXHW7RWV3 -> KUBE-SEP-XE5XFBDN7LLHNVMO -> -j DNAT --to-destination 10.244.2.2:80
-A KUBE-SVC-RRHDV4CFXHW7RWV3 -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-BGV4R4Y32WAZO4AD
-A KUBE-SVC-RRHDV4CFXHW7RWV3 -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-XE5XFBDN7LLHNVMO
-A KUBE-SVC-RRHDV4CFXHW7RWV3 -j KUBE-SEP-CYUFO3BNAYR2R5O3
上面是轉(zhuǎn)發(fā)到3個pod規(guī)則视事。
輪訓(xùn)
ip_vs啟動
lsmod|grep ip_vs 查看ip_vs是否啟動
modprobe ip_v? 啟動ipvs
啟動模塊 ip_vs?
? ? modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack_ipv4
在每一個機器上面執(zhí)行一遍 把這些啟動的模塊加入到 [etc/rc.local]里面開機啟動
通過 kubectl get cm -n kube-system 查看kube-porxy
通過 kubectl edit cm kube-porxy -n kube-system 修改啟動ipvs? mode"ipvs"
lvs? 虛擬服務(wù)器? 真實服務(wù)器
? TCP? 10.96.0.1:443 rr
? -> 192.168.195.110:6443? ? ? ? Masq? ? 1? ? ? 0? ? ? ? ? 0? ? ? ?
TCP? 10.96.0.10:53 rr
? -> 10.244.1.6:53? ? ? ? ? ? ? ? Masq? ? 1? ? ? 0? ? ? ? ? 0? ? ? ?
? -> 10.244.1.7:53? ? ? ? ? ? ? ? Masq? ? 1? ? ? 0? ? ? ? ? 0? ? ? ?
TCP? 10.96.0.10:9153 rr
? -> 10.244.1.6:9153? ? ? ? ? ? ? Masq? ? 1? ? ? 0? ? ? ? ? 0? ? ? ?
? -> 10.244.1.7:9153? ? ? ? ? ? ? Masq? ? 1? ? ? 0? ? ? ? ? 0? ? ? ?
UDP? 10.96.0.10:53 rr
? -> 10.244.1.6:53? ? ? ? ? ? ? ? Masq? ? 1? ? ? 0? ? ? ? ? 0? ? ? ?
? -> 10.244.1.7:53? ? ? ? ? ? ? ? Masq? ? 1? ? ? 0? ? ? ?
ipvs 通過 虛擬的vip 流量首先會到ipvs的虛擬服務(wù)器 在通過虛擬服務(wù)器 轉(zhuǎn)發(fā)給真實服務(wù)器
通過 yum install ipvsadm -y 安裝ipvs的用戶端看見當(dāng)前狀態(tài)和轉(zhuǎn)發(fā)規(guī)則
iptables
靈活強大 規(guī)則遍歷匹配和更新慢 呈線性時延
ipvs
? ? 工作在內(nèi)核 有更好的性能
調(diào)度算法豐富 rr wrr lc wlc ip hash
ipvs 在部署 pod多的時候 客園切換因為調(diào)度快規(guī)則匹配少
有ipvs以后iptables的規(guī)則不要清空因為 ipvs還是需要通過iptables轉(zhuǎn)發(fā)流量到ipvs
service DNS
? 程序比寫死ip更好的方式
? ? 1. dns解析
2. 綁定hosts
coreDNS pod ->? 獲取server (apiserver 獲取) -> 更新到本地
kubelet 運行pod > pod 默認走> coreDNS pod >?
[1. 采用Nodeport 對外暴露應(yīng)用 前面加一個LB實現(xiàn)統(tǒng)一訪問入口]
[2. 優(yōu)秀使用IPVS 代理模式]
[3. 集群內(nèi)部采用dns名稱訪問]译蒂、
web.default.svc.cluster.local? 名稱.命名空間.svc.默認域
ingress
? ? ? [nodeporet存在的不足
? ? ? 一個端口只能一個服務(wù)去使用 端口需要提前規(guī)劃
? 只支持4層負載均衡]
pod與ingress的關(guān)系
? ? [通過 service相聯(lián)
? ? 通過ingress Controll現(xiàn)實pod的負載均衡
支持tcp/udp4層和http7層]
ingress訪問流程
? ? user >? 域名 >
node: ip:80/443 > ingress controller > 域名分流 > pod
? ? ingress
? 基于URL路由到多個服務(wù)類式nginx的反向代理
[apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: url-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: foobar.ctnrs.com
http:
paths:
- path: /foo
backend:
serviceName: service1
servicePort: 80
- host: foobar.ctnrs.com
http:
paths:
- path: /bar
backend:
serviceName: service2
servicePort: 80]
ingress 基于虛擬機主機
配置兩個域名 主機就可以了
? [apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
? name: name-virtual-host-ingress
spec:
? rules:
? - host: foo.ctnrs.com
? ? http:
? ? ? paths:
? ? ? - backend:
? ? ? ? ? serviceName: service1
? ? ? ? ? servicePort: 80
? - host: bar.ctnrs.com
? ? http:
? ? ? paths:
? ? ? - backend:
? ? ? ? ? serviceName: service2
? ? ? ? ? servicePort: 80]
Annotations對Ingress個性化配置
? +超時時間
[apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
? name: example-ingress
? annotations:
? ? kubernetes.io/ingress.class: "nginx“
? ? nginx.ingress.kubernetes.io/proxy-connect-timeout: "600"
? ? nginx.ingress.kubernetes.io/proxy-send-timeout: "600"
? ? nginx.ingress.kubernetes.io/proxy-read-timeout: "600"
? ? nginx.ingress.kubernetes.io/proxy-body-size: "10m"
spec:
? rules:
? - host: example.ctnrs.com
? ? http:
? ? ? paths:
? ? ? - path: /
? ? ? ? backend:
? ? ? ? ? serviceName: web
? ? ? ? ? servicePort: 80]
ingress controller pod -> 獲取service(apiserver)-> 應(yīng)用到本地nginx
1、控制器獲取service關(guān)聯(lián)的pod應(yīng)用到nginx
2忍燥、nginx 提供七層負載均衡
ingress controller 高可用方案
? 1. 使用? Daemonset+nodeselector
? ? ? ? ? 固定ingress到兩個nodes上
? 訪問邏輯
? ? ? user > 域名解析到 > vip (keepalived) ha功能 > pod
? 2.
? ? ? ? ? 固定ingress到N個nodes上 因并發(fā)定
? ? ? ? user > 域名 > LB (nginx? lvs haproxy) >? ingress controller > pod ?
360 調(diào)度流程
? ? ? lvs(定制開發(fā)的lvs控制器 對接lvs的api)? >? pod
應(yīng)用程序管理配置
? ? secret
? ? 加密數(shù)據(jù)并存放在ETCD中 讓pod容器以掛載volume的方式 去訪問
應(yīng)用場景 憑據(jù)
pod使用 secret的兩種方式
? ? ? 變量注入
? 掛載
secret的應(yīng)用場景
? ? 1. ingress? https證書
2. secret 存放docker registry認證信息
3. 存放文件內(nèi)容或者是字符串
configmap 主要是使用文件傳入 和secret的使用場景不一樣
[參數(shù)
? docker-registry 創(chuàng)建一個給 Docker registry 使用的 secret
? generic? ? ? ? 從本地 file, directory 或者 literal value 創(chuàng)建一個 secret
? tls? ? ? ? ? ? 創(chuàng)建一個 TLS secret
用法
? kubectl create secret [flags] [options]]
---
用戶名 密碼這些必須通過base64轉(zhuǎn)過 因為這樣子比較安全
echo -n 'admin' | base64
---
創(chuàng)建一個secret
apiVersion: v1
kind: Secret
metadata:
? name: mysecret
type: Opaque
data:
? username: YWRtaW4=
? password: MWYyZDFlMmU2N2Rm
----
引入secret變量
[apiVersion: v1
kind: Pod
metadata:
? name: mypod
spec:
? containers:
? - name: nginx
? ? image: nginx
? ? env:
? ? ? - name: secret_user
? ? ? ? valueFrom:
? ? ? ? ? secretKeyRef:
? ? ? ? ? ? name: mysecret
? ? ? ? ? ? key: username
? ? ? - name: secret_passwd
? ? ? ? valueFrom:
? ? ? ? ? secretKeyRef:
? ? ? ? ? ? name: mysecret
? ? ? ? ? ? key: password]
~? ? ? ? ? ? ? ? ? ? ? ?
-------------------------------------
secret通過掛載的方式
apiVersion: v1
kind: Pod
metadata:
? name: mypod
spec:
? containers:
? - name: nginx
? ? image: nginx
? ? volumeMounts:
? ? - name: foo
? ? ? mountPath: "/etc/foo"
? ? ? readOnly: true
? volumes:
? - name: foo
? ? secret:
? ? ? secretName: mysecret
~? ? ? ? ? ? ?
----------------------------
應(yīng)用程序如何動態(tài)更新配置
? 1. 重新構(gòu)建pod
? 2. 應(yīng)用程序本身實現(xiàn)監(jiān)聽本地配置文件 如果發(fā)生變化觸發(fā)配置熱更新
? 3. 使用 sidecal容器是否觸發(fā)更新 如果發(fā)生變化觸發(fā) socket http 通知應(yīng)用程序熱更新
? 采用配置中心的 例如 nacos apollo
------------------------------