Service資源是爲動態管理的Pod對象添加一個固定訪問入口。html
service經過標籤選擇器關聯至擁有相關標籤的Pod對象客戶端向Service進行請求,而非目標Pod對象,當Service資源變更時,有kube-proxy控制器將規則應用至本機iptables或者ipvs規則。node
而kube-proxy爲DaemonSet 控制器將會在集羣中每一個節點運行一個Pod或者守護進程 若是須要轉換ipvs規則,則須要手動加載ipvs模塊進入內核iptables代理模式,對於每一個Service對象,kube-proxy會建立iptables規則直接捕獲到達cluster ip和Port流量,並將其重定向至當前Service對象的後端Pod資源,對於每一個Endpoint對象,Service資源會爲其建立iptables規則並關聯ipvs代理模式 kube-proxy跟蹤API server上 Service和Endpoints(ip+port)對象變更,來調用netlink接口建立ipvs規則,並確保於API server中變更同步,於iptables規則不一樣之處僅在處於其請求流量的調度功能有ipvs實現,餘下的其餘功仍然由iptables完成linux
[root@node1 ~]# vim svc.yml apiVersion: v1 kind: Service metadata: name: myapp namespace: prod spec: ports: #ports字段定義svc端口與後端哪一個端口相關連 - name: http #ports字段名稱 port: 80 #svc端口 targetPort: 80#目標後端端口 nodePort: 30080 #自定義nodePort端口 selector:#標籤選擇器 app: myapp rel: stable type: NodePort#NodePort能夠定義一個端口給外部範圍 #####直接訪問svc地址就會調度至後端匹配的標籤的pod中即使控制器增長或者減小,svc也會自動關聯新增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]#
clusterIP:爲一個svc分配一個當前集羣內的動態地址,客戶端pod對象訪問服務的Pod對象時不會進行源地址轉換,且不會被外部地址訪問,只能在集羣內部被訪問。NodePort:對於某svc來講會在每一個節點生成一個ipvs規則打開節點端口,映射至svc ip的端口上。還能夠手動建立endpoints資源將ip地址指向外部。將名稱命名爲svc相同時便可nginx
kubectl edit cm kube-proxy -n kube-system
在線修改configmap文件,使其加載ipvs規則git
kubectl delete pod -l k8s-app=kube-proxy,pod-template-generation=1 -n kube-system ##刪除pod,讓ipvs規則在kube-proxy生效
生效以後的pod會生成ipvs規則。github
標準的api對象,管理外部請求到內部流量。協議爲http,僅用域定義流量轉發和調度的通用格式的配置信息,它們須要轉換爲特定的具備http協議轉發和調度功能的應用程序的配置文件,並由相應的應用程序生效,相應的配置後完成流量轉發web
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使其外部網絡可以訪問至ingressvim
建立後端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
建立ingress資源,爲以前建立的ingress-nginx這個程序提供ingress配置。api
piVersion: extensions/v1beta1 kind: Ingress #資源類型 metadata: #元數據 name: myapp namespace: myns annotations: #此字段爲資源註解,做爲配置信息提供方 kubernetes.io/ingress.class: "nginx" spec: #定義ingress內部資源 rules: - host: www.node1.com #定義後端主機 - http: ##定義後端資源 paths: - path: / #定義後端映射路徑爲/ backend: #後端資源 serviceName: myapp #此爲svc資源名稱 servicePort: 80 #此爲svc端口
建立成功,會自動關聯至myapp此svc,且會綁定後端資源
此時直接訪問宿主機便可訪問後端資源使用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 #在集羣中建立證書。 ##配置成使用證書的ingress apiVersion: extensions/v1beta1 kind: Ingress metadata: name: tls-ingress namespace: myns annotations: kubernetes.io/ingress.class: "nginx" spec: tls: #引用證書 - hosts: #此主機須要爲證書籤名時指定的域名一致 - www.node.com secretName: ilinux-cert #secre資源的名稱。就是咱們剛纔建立的k8s資源 rules: #後端規則,需前一份資源系統 - 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
建立完成
kubectl exec -it nginx-ingress-controller-568867bf56-lrm4f -n ingress-nginx -- /bin/sh##鏈接至pod內容器,配置文件會自動填充咱們定義的ingress的配置
本文知識點來自於《阿里雲技術:雲原生基礎入門篇》更多內容可點擊查看!
有段時間沒跟你們分享資源福利了,看了下本身的資料夾,整理了一些我認爲比較好的Python學習資料了。相信這套資料能夠對你進階高級工程師有幫助
學習工具
大廠實戰手冊
自學視頻(部分)
【資料免費領取方式】:點這裏:2020Python高薪實戰學習大合集