k8s之Service資源

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


image.png

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


image.png

生效之后的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


image.png

image.png

創(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端口
~                        
image.png

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


image.png

此時直接訪問宿主機(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

image.png

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


image.png
image.png

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容