k8s之Service資源

Service資源是爲動態管理的Pod對象添加一個固定訪問入口。html

Service爲四層調度器

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

servcie資源定義:

[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]#

svc類型

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

Ingress資源,7層代理|調度

標準的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高薪實戰學習大合集

相關文章
相關標籤/搜索