kubernetes资源控制与及ingress插件安装(容忍策略)
一.Daemonset 控制器(不支持滾動更新)
該文中的所有容器需自己創建
1.DaemonSet的概述
DaemonSet 每個機器斗要啟動運行的Pod,確保全部或一些Node上運行Pod副本
-當有Node加入集群時,也會為他新增Pod副本,當Node從集群移除,這些Pod也會回收
-刪除DaemonSet時將刪除所有他創建的Pod副本
-典型應用:ceph節點,監控節點,filebeat日志收集等
-系統服務 kube-proxy和flannel就是這種類型
2.DaemonSet控制器的資源文件書寫格式
daemonset與deployment非常相似,區別是不需要設置replicas,因為daemonset是每節點啟動的
deployment啟動
user-->> deployment--->>(優選與打分機制)--->>選擇pod(此時即是優點也是缺點,如果一定要在每一臺上運行就不行,比如監控)
# 示例 ~]# vim mynginx.yaml --- ? ? ? ? ? ? ? ?# 文件起始 kind: DaemonSet ? ?# 文件類型,所有對象查看(kubectl api-resources) apiVersion: apps/v1 ?# 資源的版本,( kubectl explain Daemonset) metadata: ? ? ? ? ?# Daemonset的元數據 name: mynginx ? ?# Daemonset的名字 spec: ? ? ? ? ? ? ?# Daemonset的詳細信息 selector: ? ? ? ?# Daemonset的標簽matchLabels: ? # Daemonset的標簽組myapp: nginx # Daemonset的標簽是nginx ? template: ? ? ? ?# peo的定義metadata: ? ? ?# 定義標簽labels:myapp: nginxspec: ? ? ? ? ?# 詳細信息containers: ?# 容器的詳細信息- name: nginxcluster ?# 容器名image: 172.17.0.98:5000/myos:nginx2 ?# 鏡像command: ["/data/nginx/sbin/nginx", "-g", "daemon off;"] ?# 設置啟動stdin: false ?# 不用交互式tty: false ? # 不用終端ports: ? ? ? # 開放的端口- protocol: TCPcontainerPort: 80restartPolicy: Always # 發現daemonset沒有replicas副本設置,這是因為daemonset不允許設置副本數,而且deployment下有一個rc二級控制,而daemonset直接連pod,且不知持滾動更新 ? ~]# kubectl apply -f mynginx.yaml daemonset.apps/mynginx created ~]# kubectl get pods -o wide NAME ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES mynginx-4qwl8 ? 1/1 ? ? Running ? 0 ? ? ? ? 3s ? 10.244.2.34 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> mynginx-tzs48 ? 1/1 ? ? Running ? 0 ? ? ? ? 3s ? 10.244.1.26 ? vm-0-114-centos ? <none> ? ? ? ? ? <none>3.污點策略
注:daemonset 會調度到除master以外所有的節點;master節點除了一些系統服務以外不會在有其他POD
為什么其他POD不會在master上部署
-
污點策略:
-NoSchedule 不會被調度
-PreferNoSchedule 盡量不調度
-NoExecute 驅逐節點
-
查看污點標簽
-
設置污點標簽
-
刪除污點標簽
4.容忍策略
某些時候我們需要無視污點標簽進行操作,這種方式稱為對污點的容忍
污點策略官方文檔
污點和容忍度 | Kubernetes
## 示例 # 可以看出現在只有一臺機器運行了容器 ~]# kubectl get pods -o wide NAME ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES mynginx-bpm2z ? 1/1 ? ? Running ? 0 ? ? ? ? 10s ? 10.244.1.29 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> ? # 因為其他兩臺設置了污點策略,所以只有一臺運行 ~]# kubectl describe nodes | grep -P "^Taints" ? Taints: ? ? ? ? ? ? node-role.kubernetes.io/master:NoSchedule Taints: ? ? ? ? ? ? <none> Taints: ? ? ? ? ? ? key=value:NoSchedule ? # 修改文件 ~]# cat mynginx.yaml --- kind: DaemonSet apiVersion: apps/v1 metadata:name: mynginx spec:selector:matchLabels:myapp: nginxtemplate:metadata:labels:myapp: nginxspec: tolerations: ? ? ? ? ? ? ? ? ? ? ? ? ?# 聲明污點策略- key: "node-role.kubernetes.io/master" ?# 聲明的鍵(因為污點策略都是以鍵值的形式存在的,這里是建)operator: "Equal" ? ? ? ? ? # 完全匹配,污點只要存在即可value: "" ? ? ? ? ? ? ? ? ? # 值valueeffect: "NoSchedule" ? ? ? ?# 容忍策略containers:- name: nginxclusterimage: 172.17.0.98:5000/myos:nginx2command: ["/data/nginx/sbin/nginx", "-g", "daemon off;"]stdin: falsetty: falseports:- protocol: TCPcontainerPort: 80restartPolicy: Always ? ? # 更新 ~]# kubectl apply -f mynginx.yaml daemonset.apps/mynginx configured # 查看 ~]# kubectl get pods -o wide NAME ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES mynginx-6t6nx ? 1/1 ? ? Running ? 0 ? ? ? ? 13s ? 10.244.0.6 ? master ? ? ? ? ? <none> ? ? ? ? ? <none> mynginx-bpm2z ? 1/1 ? ? Running ? 0 ? ? ? ? 10s ? 10.244.1.29 ? vm-0-114-centos ? <none> ? ? ? ? ? <none>5.污點與容忍示例
# 準備好環境,刪除所有pod并刪除所有node的污點策略 ~]# kubectl delete -f mynginx.yaml daemonset.apps "mynginx" deleted ~]# kubectl describe nodes |grep -P "^Taints" Taints: ? ? ? ? ? ? node-role.kubernetes.io/master:NoSchedule Taints: ? ? ? ? ? ? <none> Taints: ? ? ? ? ? ? <none> ? # 創建pods,并設置成三臺 ~]# cat myapache.yaml --- kind: Deployment apiVersion: apps/v1 metadata: name: myapache annotations:kubernetes.io/change-cause: httpd.v1 spec: selector:matchLabels:myapp: httpd replicas: 3 template:metadata:labels:myapp: httpdspec:containers:- name: webclusterimage: 172.17.0.98:5000/myos:httpdstdin: falsetty: falseports:- protocol: TCPcontainerPort: 80restartPolicy: Always ~]# kubectl apply -f myapache.yaml deployment.apps/myapache created ? ~]# kubectl get pods NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE myapache-9d7557448-6c7c6 ? 1/1 ? ? Running ? 0 ? ? ? ? 9s ~]# kubectl scale deployment myapache --replicas=3 deployment.apps/myapache scaled ~]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-8p5qs ? 1/1 ? ? Running ? 0 ? ? ? ? 5s ? ?10.244.2.39 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-q4rm9 ? 1/1 ? ? Running ? 0 ? ? ? ? 5s ? ?10.244.1.30 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-qc5g7 ? 1/1 ? ? Running ? 0 ? ? ? ? 5s ? ?10.244.1.31 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> ? # 然后再創建三臺nginx ]# cat mynginx.yaml --- kind: DaemonSet apiVersion: apps/v1 metadata:name: mynginx spec:selector:matchLabels:myapp: nginxtemplate:metadata:labels:myapp: nginxspec:tolerations:- key: "node-role.kubernetes.io/master"operator: "Equal"value: ""effect: "NoSchedule"containers:- name: nginxclusterimage: 172.17.0.98:5000/myos:nginx2command: ["/data/nginx/sbin/nginx", "-g", "daemon off;"]stdin: falsetty: falseports:- protocol: TCPcontainerPort: 80restartPolicy: Always ? ~]# kubectl apply -f mynginx.yaml daemonset.apps/mynginx created ? # 可以看到nginx再每一臺上運行了容忍策略 ~]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-8p5qs ? 1/1 ? ? Running ? 0 ? ? ? ? 3m35s ? 10.244.2.39 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-q4rm9 ? 1/1 ? ? Running ? 0 ? ? ? ? 3m35s ? 10.244.1.30 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-qc5g7 ? 1/1 ? ? Running ? 0 ? ? ? ? 3m35s ? 10.244.1.31 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> mynginx-45dsc ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 3s ? ? ?10.244.2.40 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> mynginx-d662z ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 3s ? ? ?10.244.0.7 ? master ? ? ? ? ? <none> ? ? ? ? ? <none> mynginx-mgcts ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 3s ? ? ?10.244.1.32 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> ? ## 測試模仿機器損壞,但是還能用 # 在任意節點打上驅逐策略,我這里就在node1上驅逐容器 ~]# kubectl taint node vm-0-114-centos k1=v1:NoExecute node/vm-0-114-centos tainted ~]# kubectl describe nodes |grep -P "^Taints" Taints: ? ? ? ? ? ? node-role.kubernetes.io/master:NoSchedule Taints: ? ? ? ? ? ? k1=v1:NoExecute Taints: ? ? ? ? ? ? <none> ? # 因為apache使用deployment做控制器的,且運行了三臺,如上所示在node1運行了二臺的;nginx則是用的daemonset控制器也就是在所有pod上運一臺,此時可以看出,運行在node1上的機器已經沒有應用了。現在就可以下線維修了 ~]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-8p5qs ? 1/1 ? ? Running ? 0 ? ? ? ? 10m ? 10.244.2.39 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-md7q7 ? 1/1 ? ? Running ? 0 ? ? ? ? 39s ? 10.244.2.41 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-zbwpk ? 1/1 ? ? Running ? 0 ? ? ? ? 39s ? 10.244.2.42 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> mynginx-45dsc ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 7m ? ?10.244.2.40 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> mynginx-d662z ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 7m ? ?10.244.0.7 ? master ? ? ? ? ? <none> ? ? ? ? ? <none> ? ? # 維修好node機器之后,把污點刪除,運用daemonset的控制器的nginx就會恢復 ]# kubectl taint node vm-0-114-centos k1- node/vm-0-114-centos untainted [root@master config]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES ..... mynginx-45dsc ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 16m ? 10.244.2.40 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> mynginx-d662z ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 16m ? 10.244.0.7 ? master ? ? ? ? ? <none> ? ? ? ? ? <none> mynginx-kjb4z ? ? ? ? ? ? ?1/1 ? ? Running ? 0 ? ? ? ? 7s ? ?10.244.1.33 ? vm-0-114-centos ? <none> ? ? ? ? ? <none>二.其他資源控制器(對象)
1.Job控制器
1)job的概述(單任務)
Job也稱為單任務控制器, 負責執行一次任務,保證任務在一個或多個Pod.上執行成功
如果你運行一一個Pod,當第一個Pod失敗或者被刪除(比如因為節點硬件失效或者重啟)時,Job對象會啟動一個新的Pod, 直到這個任務完成。
刪除Job的操作會清除所創建的全部Pods。
2.CronJob資源對象
1)cronjob概述
CronJob重復多次任務控制器
Cr onJob像是Job的升級版,他是基于時間管理的Job
典型用法:周期性計劃任務
CronJob的本質是在約定的時間創建Job
在job中會保留最后三次的狀態,其他會被清除
# Cronjob示例 ~]# vim mycronjob.yaml --- ? ? ? ? ? ? ? # 起始--- apiVersion: batch/v1beta1 ? # cronjob的版本( kubectl api-resources | grep cron) kind: CronJob ? ? ? ? ?# 資源的類型 metadata: ? ? ? ? ? ? ?# cronjob的元數據 ? name: cronjob-pi ? ? # cronjob的名字 spec: ? ? ? ? ? ? ? ? ?# cronjob的詳細信息 schedule: "*/1 * * * *" ? # 定義時間周期 jobTemplate: ? ? ? ? # 這里定義的是job的詳細信息 ? ?spec: ? ? ? ? ? ? ?# job.spectemplate: ? ? ? ?# 這里定義的是pod的詳細信息spec: ? ? ? ? ?# pod.speccontainers: ?# 這里是容器的定義- name: piimage: 192.168.1.100:5000/myos:v1804command: ["perl", ?"-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: OnFailure # 創建cronjob ~]# kubectl apply -f mycronjob.yaml cronjob.batch/cronjob-pi created ? # 查看資源控制器 ~]# kubectl get cronjobs.batch NAME ? ? ? ? SCHEDULE ? ? ? ? ? SUSPEND ? ACTIVE ? ? ? LAST SCHEDULE ? AGE cronjob-pi ? */1 * * * * ? ? ? False ? ? 1 ? ? ? ? ? ? <none> ? ? ? ? 28s # 容器啟動完成之后進入completed ~]# kubectl get pod NAME ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? ? STATUS ? ? RESTARTS ? ? ? ? AGE cronjob-pi-1595410620-vvztx ? ? 0/1 ? ? ? Completed ? 0 ? 62s cronjob-pi-1595410620-vvztx ? ? 0/1 ? ? ? Completed ? 0 ? 2s # 查看job是否都啟動了 ~]# kubectl get jobs.batch NAME ? COMPLETIONS ? DURATION ? AGE cronjob-pi-1595410620 ? 1/1 ? ? ? ? ? 2s ? ? ? ? 98s cronjob-pi-1595410620 ? 1/1 ? ? ? ? ? 5s ? ? ? ? 38s ? # 默認只能創建三個job,創建第四個時就會把第一個刪除3.其他資源對象
其他資源對象
●Stateful Set有狀態服務相關POD
-為了解決有狀態服務設計的一種控制器
-基于PVC的穩定持久化存儲
-穩定的網絡標志,基于Head less Service
-有序部署,有序擴展/收縮(基于init containers實現)
●Hor izontal Pod Autoscaling 控制器(HPA)
-自動擴展,可以根據業務的高峰和低谷自動水平擴展Pod節點,提高資源利用率
注:這里主要的知識是pv,pvc,以及對cpu等資源的規劃,慢慢來,這里只需要知道有這幾個資源控制器就行
三.訪問服務
1.服務圖例與類型
1)服務使用場景
訪問會變化的pod給我們訪問帶來了非常多的不便
service就是解決這一個問題的方法
service會創建一個cluster ip, 這個地址對應資源地址,不管pod如何變化,service總能找到對應的pod, 且cluster ip保持不變,如果有pod對應多個容器,service會自動在多個容器間實現負載均衡
service通過IPTABLES/LVS 規則將訪問的請求最終映射到Pod的容器內部服務上
# 此時會發現pod的IP非常的不好用,當重啟時podSubnet(也就是在注冊flanel時定義的pod ip)的IP地址就會改變,訪問服務時就會不方便,所以k8s建議創建服務時用service,(在訪問時直接訪問網段,k8s會直接追蹤到服務地址,且當有多個服務時會提供負載均衡,服務的ip也永遠不會變) ? ## 示例 # 創建一個apache的服務 ~]# kubectl apply -f myapache.yaml deployment.apps/myapache created ~]# 然后設置成兩個副本 ~]# kubectl scale deployment myapache --replicas=2 deployment.apps/myapache scaled # 此時查看會在node2和node3上運行容器 ~]# kubectl get pod -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE myapache-7d689bf8f-c268l ? 1/1 ? ? Running ? 0 ? ? ? ? 13s ? 10.244.2.16 ? node-0002 myapache-7d689bf8f-4z225 ? 1/1 ? ? Running ? 0 ? ? ? ? 5s ? ?10.244.1.15 ? node-0003 # 當刪掉一個在node3上的容器時,會在另一個node上啟動一個容器(因為這里用的是deployment控制器) ~]# kubectl delete pod myapache-7d689bf8f-4z225 pod "myapache-7d689bf8f-4z225" deleted ~]# kubectl get pod -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? NODE myapache-7d689bf8f-c268l ? 1/1 ? ? Running ? 0 ? ? ? ? 38s ? 10.244.2.16 ? node-0002 myapache-7d689bf8f-mccqv ? 1/1 ? Running ? 0 ? ? ? ? 13s ? 10.244.3.12 ? node-0001 # 如果用node3的ip去訪問時,則會失敗2)服務資源文件的格式與示例
注:多個資源可以寫在同一個Yaml文件,使其---分割
## 服務資源示例 #創建 ClusterIP 服務 ~]# vim clusterip.yaml --- ? ? ? ? ? ? # 資源文件的開始--- kind: Service ? # 服務類型 apiVersion: v1 ?# 版本(kubectl api-resources | grep Services) metadata: ? ? ? # 元數據(service的元數據)name: myapache # service的名字 spec: ? ? ? ? ? # service的詳細信息ports: ? ? ?# 定義端口類型- protocol: TCP ?# 端口協議port: 80 ? ?# 開放的前端端口,也就是訪問端口targetPort: 80 ?# 目標主機端口,也就是容器內的端口selector: ? ? # 后端綁定(通過標簽來綁定)myapp: httpd ?# 標簽必須與 deploy 資源文件中一致type: ClusterIP ?# 服務的類型 ~]# kubectl apply -f clusterip.yaml service/myapache created ~]# kubectl get service NAME ? ? ? ? TYPE ? ? ? CLUSTER-IP ? ? EXTERNAL-IP ? PORT(S) ? AGE kubernetes ? ClusterIP ? 10.254.0.1 ? ? <none> ? ? ? ?443/TCP ? 6d2h myapache ? ? ClusterIP ? 10.254.40.243 ? <none> ? ? ? ?80/TCP ? 44m # 測試訪問service的ip ~]# curl http://10.254.40.243/info.html myapache-9d7557448-9g7rr ~]# curl http://10.254.40.243/info.html myapache-9d7557448-z27kx ~]# curl http://10.254.40.243/info.html myapache-9d7557448-2xgbk ~]# kubectl get pods NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE myapache-9d7557448-2xgbk ? 1/1 ? ? Running ? 0 ? ? ? ? 3h30m myapache-9d7557448-9g7rr ? 1/1 ? ? Running ? 0 ? ? ? ? 3h30m myapache-9d7557448-z27kx ? 1/1 ? ? Running ? 0 ? ? ? ? 3h30m # 可以看出還有負載均衡功能 ## 測試刪除容器是否會自動跟蹤 # 刪除node1上的一個容器,控制器自動在node2創建一個容器 ]# kubectl delete pods myapache-9d7557448-2xgbk pod "myapache-9d7557448-2xgbk" deleted ~]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? ? IP ? ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-9g7rr ? 1/1 ? ? Running ? 0 ? ? ? ? 3h32m ? 10.244.1.160 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-w6mdf ? 1/1 ? ? Running ? 0 ? ? ? ? 4s ? ? ?10.244.2.44 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-z27kx ? 1/1 ? ? Running ? 0 ? ? ? ? 3h32m ? 10.244.2.43 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> # 測試訪問 ~]# curl http://10.254.40.243/info.html myapache-9d7557448-9g7rr ~]# curl http://10.254.40.243/info.html myapache-9d7557448-w6mdf ~]# curl http://10.254.40.243/info.html myapache-9d7557448-z27kx # 可以看到service(服務)會自動找到容器 ? ## 如果本地訪問網址慢的話,可以用本地的校驗,把flannel的值設置成yes即可 ~]# ethtool -k flannel.1| grep checksum ......tx-checksum-ip-generic: on ...... # 設置 ~]# ethtool -K flannel.1 tx-checksum-ip-generic off Actual changes: tx-checksumming: offtx-checksum-ip-generic: off tcp-segmentation-offload: offtx-tcp-segmentation: off [requested on]tx-tcp-ecn-segmentation: off [requested on]tx-tcp6-segmentation: off [requested on]tx-tcp-mangleid-segmentation: off [requested on] udp-fragmentation-offload: off [requested on] # 查看 ~]# ethtool -k flannel.1| grep checksum ....tx-checksum-ip-generic: off ....注:service是根據容器的label(標簽)來綁定的,主要功能是負載均衡和和自動跟蹤容器。
3)服務端口
service服務的端口
-
port
service暴露在cluster ip上的端口,是提供給集群內部客戶訪問service的入口,供集群內部服務訪問使用
-
targetPort
是pod上容器服務監聽的端口,從port或nodePort上到來的數據最終經過kube-proxy 流入到后端pod的targetPort 進入容器,從而達到訪問pod容器內服務的目的
創建/查詢服務
創建服務: kubectI apply -f 資源文件
查詢服務可以使用: kubectI get service
服務自動發現
cluster- ip是集群隨機分配的服務ip,供集群訪問,在集群內部也可以通過服務的名稱訪問,服務的名稱是通過coredns(dns)解析的,每個服務在創建的過程中都會完成自動注冊
默認域名: <服務名稱>. <名稱空間>. svc. cluster. local
## 訪問域名示例 # 先查看service的名字 ~]# kubectl get svc NAME ? ? ? ? TYPE ? ? ? CLUSTER-IP ? ? EXTERNAL-IP ? PORT(S) ? AGE myapache ? ? ClusterIP ? 10.254.40.243 ? <none> ? ? ? ?80/TCP ? 3h54m # 查看命名空間 ~]# kubectl get pods -A | grep myapache default ? ? ? myapache-9d7557448-9g7rr ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 3h57m default ? ? ? myapache-9d7557448-w6mdf ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 24m default ? ? ? myapache-9d7557448-z27kx ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 3h57m # 進入容器訪問 ~]# kubectl exec -it myapache-9d7557448-w6mdf -- /bin/bash ~]# ping myapache.default.svc.cluster.local -c 5 PING myapache.default.svc.cluster.local (10.254.40.243) 56(84) bytes of data. 64 bytes from myapache.default.svc.cluster.local (10.254.40.243): icmp_seq=1 ttl=64 time=0.025 ms 64 bytes from myapache.default.svc.cluster.local (10.254.40.243): icmp_seq=2 ttl=64 time=0.048 ms 64 bytes from myapache.default.svc.cluster.local (10.254.40.243): icmp_seq=3 ttl=64 time=0.051 ms 64 bytes from myapache.default.svc.cluster.local (10.254.40.243): icmp_seq=4 ttl=64 time=0.052 ms 64 bytes from myapache.default.svc.cluster.local (10.254.40.243): icmp_seq=5 ttl=64 time=0.058 ms ? --- myapache.default.svc.cluster.local ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4000ms rtt min/avg/max/mdev = 0.025/0.046/0.058/0.014 ms # 或者直接訪問apache也可以,service創建時會自動寫入文件到resolv.conf文件中 ~]# cat /etc/resolv.conf nameserver 10.254.0.10 search default.svc.cluster.local svc.cluster.local cluster.local options ndots:5注:集群內可以直接訪問服務,集群外無法訪問
2.服務原理概述
1)服務類型
Service允許指定一個Type類型的, 默認是ClusterIP
-
ClusterIP:通過集群的內部IP 暴露服務,服務只能夠在集群內部可以訪問(集群外就不能訪問了),這也是默認的ServiceType
-
NodePort: 通過每個Node上的IP和靜態端口(NodePort)暴露服務。NodePort服務會路由到ClusterIP 服務
-
LoadBalancer:使用云提供商的負載局衡器,外部的負載均衡器可以路由到NodePort 服務和ClusterIP 服務(必須買云服務得SaaS服務(及云服務商做好得服務))
2)代理模式種類
k8s中的代理都是kube- proxy來設置的
- Kubernetes v1.0服務支持userspace代理模式
- Kubernetes v1.1服務支持iptables 代理模式
- Kubernetes v1.8服務支持ipvs
- 在Kubernetesv1.2中,kube- proxy的iptables模式成為默認設置,現在默認使用ipvs,如果不能滿足要求回退至iptables模式
第一代的訪問方式:
用戶訪問ClusterIP,ClusterIP通過iptables的端口映射,映射給kube-proxy,由kube-proxy轉發給對應的容器;此時發現kube-proxy的性能,穩定性等等都非常的不好;所以就把kube-proxy拿走了進入下一代
第二代的訪問方式:
客戶端通過訪問,此時跳過ClusterIP直接訪問iptables,iptables直接轉發給對應的容器;從而實現客戶對后端的訪問,此時kube-proxy退居幕后專門設置iptables的規則;此時發現iptables不是專門做負載均衡的(調度算法少),所以就把kiptables拿走了進入下一代
第三代,也就是現在用的這一代
用戶訪問LVS,此時pod直接變成service了;此時kube-proxy退居幕后專門設置LVS的規則,因為LVS沒有服務(內核級服務),所以k8s也沒有服務,我們設置好規則之后kube-proxy負責翻譯給LVS
## 查看LVS規則 # 查看服務控制器的名字,取最前面的(myapache) ]# kubectl get pods -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? ? IP ? ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-9g7rr ? 1/1 ? ? Running ? 0 ? ? ? ? 4h27m ? 10.244.1.160 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-w6mdf ? 1/1 ? ? Running ? 0 ? ? ? ? 54m ? ? 10.244.2.44 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-z27kx ? 1/1 ? ? Running ? 0 ? ? ? ? 4h27m ? 10.244.2.43 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> # 查看service ~]# kubectl get svc | grep myapache myapache ? ? ClusterIP ? 10.254.40.243 ? <none> ? ? ? ?80/TCP ? 4h29m # 根據ip查看規則 ]# ipvsadm -L -n IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port ? ? ? ? ? Forward Weight ActiveConn InActConn...... TCP ?10.254.40.243:80 rr-> 10.244.1.160:80 ? ? ? ? ? ? Masq ? ?1 ? ? ?0 ? ? ? ? ?0 ? ? ? ? -> 10.244.2.43:80 ? ? ? ? ? ? ? Masq ? ?1 ? ? ?0 ? ? ? ? ?0 ? ? ? ? -> 10.244.2.44:80 ? ? ? ? ? ? ? Masq ? ?1 ? ? ?0 ? ? ? ? ?0 ? ? ? ? ..... # 此時可以看出是利用輪詢機制到每一臺容器服務的后端注:設置k8s服務的本質就是把LVS與容器建立關聯,
kube-proxy的作用
# 查看kube-proxy,此時可以發現kube-proxy是daemonset控制器安裝的(與硬件綁定,所以在所有節點都有設置,相當與有多少節點就有多少LVS服務) ~]# kubectl get pods -A -o wide | grep kube-proxy kube-system ? kube-proxy-flzrz ? ? ? ? ? ? ? ? 1/1 ? ? Running ? 2 (3d13h ago) ? 6d6h ? ?172.17.0.51 ? master ? ? ? ? ? <none> ? ? ? ? ? <none> kube-system ? kube-proxy-sv5n8 ? ? ? ? ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 3d13h ? 172.17.0.142 ? vm-0-142-centos ? <none> ? ? ? ? ? <none> kube-system ? kube-proxy-tkctb ? ? ? ? ? ? ? ? 1/1 ? ? Running ? 0 ? ? ? ? ? ? ? 4d12h ? 172.17.0.114 ? vm-0-114-centos ? <none> ? ? ? ? ? <none>3)ClusterIP服務概述
-創建簡單的WEB集群多副本會自動分配到不同機器上會變化的資源
-當發現某一個pod不能使用的時候RS會在其他機器上在創建一個相同的pod,及其對應的容器
4)nodeport 服務
我們之前構建的服務已經可以在集群內部運轉起來了,但集群外還無法訪問集群內部的服務有時候,服務可能來自第三方或其他團隊,我們無法把所有服務都放入集群內部,這時候我們就需要集群內部和集群外部的服務能夠實現互訪
-
LoadBalancer:使用外部的云服務(需要支持,externallPs)
-
nodePort:基于端口對外提供服務(四層)(本質:LVS)
-
Ingress:使用ingress控制器(七層)(本質:nginx)
nodePort對外服務示例
# 創建文件 ~]# vim mynodeport.yaml --- ? ? ? ? ? ? # 資源開始起始--- kind: Service ? # 資源類型 apiVersion: v1 ?# 類型版本 metadata: ? ? ? # 該內型得元數據name: mynodeport ? # 該內型得名字 spec: ? ? ? ? ? # Service的詳細信息ports: ? ? ? ?# 端口設置- protocol: TCP ?# 類型port: 80 ? ?# 開放端口 ?targetPort: 80 ?# 容器內端口selector: ? ? # 標簽(service是根據標簽來控制容器的)myapp: httpd ?# 標簽名type: NodePort ? ? # 指定服務類型(對外訪問) ~]# kubectl apply -f mynodeport.yaml ~]# kubectl get service NAME ? ? ? ? TYPE ? ? ? CLUSTER-IP ? ? ? EXTERNAL-IP ? PORT(S) ? ? ? AGE mynodeport ? NodePort ? 10.254.49.174 ? <none> ? ? ? 80:30975/TCP ? 83s # 此時nodeport實現了負載,容器的變化與跟蹤(這里兩點與ClusterIP類似) ]# kubectl get pods NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE myapache-9d7557448-9g7rr ? 1/1 ? ? Running ? 0 ? ? ? ? 5h16m myapache-9d7557448-z27kx ? 1/1 ? ? Running ? 0 ? ? ? ? 5h16m ? #---------------------------所有node節點30975端口均可訪問----------------------------------- # 在跳板機上訪問服務 ~]# curl http://172.17.0.142:30975/info.html myapache-9d7557448-z27kx ~]# curl http://172.17.0.114:30975/info.html myapache-9d7557448-9g7rr # 如果要設置公網訪問那么就需要在云上購買一臺LB(彈性負載)然后設置端口,端口綁定后端ip及端口,再給LB添加一個公網就可以訪問公網了 # 添加之后訪問 ~]# curl http://172.17.0.50:30975/info.html myapache-9d7557448-9g7rr ~]# curl http://172.17.0.50:30975/info.html myapache-9d7557448-z27kx5)Headless 服務
有時不需要或不想要負載均衡,以及單獨的Service IP。遇到這種情況,我們可以創建Headless服 務
Headless 服務會把ip通過多個A記錄的形式解析到具體的容器IP上面,多用于有狀態的服務(相當于域名來解析,和clusterip不同的是,clusterip只會創建一個總的服務ip,而hadless會自動為容器創建不同的解析ip)
## headless示例 # 創建資源文件 ~]# vim myheadless.yaml --- ? ? ? ? ? # 文件的起始 kind: Service # 資源類型 apiVersion: v1 # 資源版本(kubectl api-resources | grep Service ) metadata: ? ? ?# 資源的元數據 name: myheadless # 資源的名字 spec: ? ? ? ? ? # 資源的詳細信息ports: ? ? ? ?# 綁定端口- protocol: TCP ?# 端口類型port: 80 ? ?# 前端端口targetPort: 80 # 后端端口selector: ? ? # 定制標簽管理容器myapp: httpd # 標簽名type: ClusterIP # 類型ClusterIP支持負載clusterIP: None ?# 設置Clusterip為None e ? ? ?# 新添加 # 創建headless ~]# kubectl apply -f myheadless.yaml service/myheadless created ? # 查看service,可以看到headless這里并沒有clusterip,這里我們需要進入容器解析查看,因為headless是直接給容器服務的 ~]# kubectl get service NAME ? ? ? ? TYPE ? ? ? CLUSTER-IP ? ? ? EXTERNAL-IP ? PORT(S) ? AGE ..... myheadless ? ClusterIP ? None ? ? ? ? ? <none> ? ? ? ?80/TCP ? ? ? ? 7m41s ..... ? #-----------------------------------進入pod查看解析結果------------------------------------ ~]# kubectl exec -it myapache-9d7557448-9g7rr -- /bin/bash /]# yum install -y bind-utils /]# host myheadless.default.svc.cluster.local myheadless.default.svc.cluster.local has address 10.244.1.160 myheadless.default.svc.cluster.local has address 10.244.2.43 ~]# cat /etc/resolv.conf ? ? ? ? ? .... search default.svc.cluster.local svc.cluster.local cluster.local # 查看容器的IP與之一樣 ~]# kubectl get pod -o wide NAME ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE ? IP ? ? ? ? ? ? NODE ? ? ? ? ? ? NOMINATED NODE ? READINESS GATES myapache-9d7557448-9g7rr ? 1/1 ? ? Running ? 0 ? ? ? ? 16h ? 10.244.1.160 ? vm-0-114-centos ? <none> ? ? ? ? ? <none> myapache-9d7557448-z27kx ? 1/1 ? ? Running ? 0 ? ? ? ? 16h ? 10.244.2.43 ? vm-0-142-centos ? <none> ? ? ? ? ? <none>Headless應用示例圖與概述
首先用戶通過headless服務查詢終節點的ip,headless把ip告訴用戶,然后用戶直接訪問容器,headless適合較大的集群,這里就用來解析一下域名
總:ClusterIP———>> LVS(負載均衡)4層
nodePort———>> LVS+iptables(端口映射)4層
headless———>> DNS A(也就是DNS的A記錄解析)
四.ingress插件
1.ingress介紹
ingress是公開了從集群外部到集群內services路由
可以將Ingress配置為提供服務外部可訪問的URL、負載均衡流量
Ingress控制器通常由負載均衡器來實現
必須具有ingress控制器才能滿足Ingress的要求,僅創建資源無效
ingress軟件也就是nginx服務的負載均衡,如果此時nginx負載直接訪問后臺服務是會出現問題的,當容器因損壞的話,這個時候就會創建新的容器,此時nginx也就無法找到新的容器了;此時nginx為了跟蹤后臺容器借用了service服務,nginx借用service服務由service服務再把請求轉發給后端容器(service自帶容器跟蹤功能)
ingress架構圖
?注:可以根據域名訪問service
2.Ingrees 控制器安裝地址文件
-導入鏡像到私有倉庫
-鏡像: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0
-地址:ingress-nginx/deploy/static at nginx-0.30.0 · kubernetes/ingress-nginx (github.com)
-資源文件
https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/mandatory.yaml
3.安裝控制器配置
## 安裝示例 # 下載鏡像 ~]# docker pull quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 # 打上標簽上傳私有倉庫 ~]# docker tag quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.30.0 172.17.0.98:5000/nginx-ingress-controller:0.30.0 ~]# docker push 192.168.1.100:5000/nginx-ingress-controller:0.30.0 # 查看私有倉庫鏡像 ~]# curl http://172.17.0.98:5000/v2/nginx-ingress-controller/tags/list {"name":"nginx-ingress-controller","tags":["0.30.0"]} ? # 下載nginx-ingress資源配置文件 ~]# wget https://github.com/kubernetes/ingress-nginx/blob/nginx-0.30.0/deploy/static/mandatory.yaml # 修改資源文件 ~]# vim ingress/mandatory.yaml 221: image: 192.168.1.100:5000/nginx-ingress-controller:0.30.0 ?# 指向私有倉庫 # 創建ingress ~]# kubectl apply -f ingress/mandatory.yaml ? # 查看創建的ingress ~]# kubectl -n ingress-nginx get pod NAME ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? READY ? STATUS ? RESTARTS ? AGE nginx-ingress-controller-fc6766d7-ptppp ? 1/1 ? ? Running ? 0 ? ? ? ? 47s注意:k8s的1.22版本以后不支持這么安裝了
4.發布服務
用ingress發布服務架構圖
user---> ingress-->>service---myapache--->>contarner
# 如果在云上有購買LoadBalancer的Saas那么就可以用以下文件 ~]# vim ingress-service.yaml --- kind: Service apiVersion: v1 metadata:name: ingress-nginxnamespace: ingress-nginxlabels:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginx spec:externalTrafficPolicy: Localtype: LoadBalancerexternalIPs:- 172.17.0.50 ? ? ? ? ? ?# 指定LB的ip即可selector:app.kubernetes.io/name: ingress-nginxapp.kubernetes.io/part-of: ingress-nginxports:- name: httpport: 80protocol: TCPtargetPort: http- name: httpsport: 443protocol: TCPtargetPort: https # 創建 ~]# kubectl apply -f ingress-service.yaml如果沒有云的Saas服務則可以運用一下
# 定制規制資源文件 ~]# vim ingress-example.yaml --- ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # 資源的起始--- apiVersion: extensions/v1beta1 ? ? ?# 資源的版本 kind: Ingress ? ? ? ? ? ? ? ? ? ? ? # 資源的類型 metadata: ? ? ? ? ? ? ? ? ? ? ? ? ? # 資源的元數據name: my-app ? ? ? ? ? ? ? ? ? ? ?# 資源的名字annotations: ? ? ? ? ? ? ? ? ? ? ?# 資源的標簽kubernetes.io/ingress.class: "nginx" ? spec: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 資源的詳細信息backend: ? ? ? ? ? ? ? ? ? ? ? ? # 指定serviceserviceName: myapache ? ? ? ? ?# service名,必須與服務的名子同樣servicePort: 80 ? ? ? ? ? ? ? ?# service端口 ? # 創建資源 ~]# kubectl apply -f ingress-example.yaml # 查看(1分鐘左右) ~]# kubectl get ingresses NAME ? ? HOSTS ? ADDRESS ? ? ? PORTS ? AGE my-app ? * ? ? ? 10.254.0.24 ? 80 ? ? 3m2s #----------------------- ----訪問測試 ----------------------------- ~]# curl http://10.254.0.24/info.html myapache-9d7557448-9g7rr ~]# curl http://10.254.0.24/info.html myapache-9d7557448-z27kx基于域名的訪問
~]# vim ingress-example.yaml --- apiVersion: extensions/v1beta1 kind: Ingress metadata:name: my-appannotations:kubernetes.io/ingress.class: "nginx" spec:rules:- host: apache.tedu.localhttp: paths:- path: /backend:serviceName: web-apacheservicePort: 80- host: nginx.tedu.localhttp: paths:- path: /backend:serviceName: web-nginxservicePort: 80 # 創建資源 ~]# kubectl apply -f ingress-example.yaml # 查看(1分鐘左右) ~]# kubectl get ingress NAME ? ? ? ? ? ? CLASS ? HOSTS ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ADDRESS ? PORTS ? ? AGE web-apache ? ? <none> ? apache.tedu.local ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 80 ? ? ? 82d web-nginx <none> ? nginx.tedu.local ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 80 ? 67d注:Ingress 本質是nginx/haproxy 實現的負載均衡
ingress可以設置七層規則,例如根據域名選擇服務
總結
以上是生活随笔為你收集整理的kubernetes资源控制与及ingress插件安装(容忍策略)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k8命令,pod的启动流程与资源文件书写
- 下一篇: linux远程跳板机超时