博客 / 詳情

返回

k8s service隨記

1.隨記

service 隨記

流量負載組件

Service 4層網絡負載 TCP UDP

Ingress 7層網絡負載 Http https

kube-proxy 進程

service是一個概念,真正起作用的是kube-proxy ,當創建一個service時候,api-server會將對應的service信息保存到etcd中,kube-proxy監聽etcd的變化
生成對應的訪問規則,進行暴露服務

訪問規則: ipvs規則

ipvsadm -Ln 查看service的端口轉發

三種工作模式:

userspace: 
kube-proxy 為service創建一個監聽端口,發向Cluster IP的請求會被iptables規則重定向到kube-proxy監聽的端口上


iptables:

iptables直接轉發到具體的pod,kube-proxy的作用是生成iptables規則

ipvs 

類似iptables  支持輪訓算法

需要安裝ipvs內核模塊,否則會降級為iptables

開啓ipvs 

ipvsadm -Ln 查看是否開啓了ipvs

kubectl edit cm kube-proxy -n kube-system

修改 mode: "ipvs"

kubectl delete pod -l k8s-app=kube-proxy -n kube-system

[root@node3 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.17.0.1:30857 rr
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.2.41:80               Masq    1      0          0         
TCP  192.168.56.110:30857 rr
  -> 10.244.2.40:80               Masq    1      0          0         
  -> 10.244.2.41:80               Masq    1      0          0         
TCP  10.0.2.15:30857 rr


apiVersion: v1
kind: service
metadata: 
   name: service
   namespace: dev
spec:
   selector:  #確定代理哪些pod,通過標籤進行選擇,具體實現是會被kube-proxy轉換成具體的訪問規則
      app: nginx
   type:  #servie 類型       ClusterIP(默認值,k8s集羣內部自動分配虛擬ip,只能在集羣內部訪問),NodePort(將service指定的Node上的端口暴露給外部,可以實現外部訪問服務),LoadBalancer(使用外接的負載均衡完成負載分發) , ExternalName (把集羣外部的服務引入集羣內部,直接使用)
   clusterIp: #虛擬服務的ip地址
   sessionAffinity: #session親和性,支持ClientIP,None兩個選項,如果是同一個地址的請求,就將該請求打到同一個pod上去,None是設置沒有親和性
   ports: 
     - protocol: TCP
       port: 3017 #service端口
       targetPort: 5009 #pod的端口
       nodePort: 31122 #主機的端口
       


apiVersion: apps/v1
kind: Deployment
metadata:
  name: service-deployment
  namespace: dev
spec:
  replicase: 3
  selector:
    matchLabels:
      app: nginx-pod
    template:
      metadata:
        labels:
          app: nginx-pod
        spec:
          containers:
          - name: nginx
            iamge: nginx:1.18.0
            ports:
            - containerPort: 80
            
===============================================================clusterIp===================================
[root@node3 ~]# kubectl describe svc service-typ -n dev
Name:              service-type
Namespace:         dev
Labels:            <none>
Annotations:       <none>
Selector:          app=nginx-pod
Type:              ClusterIP
IP Families:       <none>
IP:                10.1.97.97
IPs:               10.1.97.97
Port:              <unset>  80/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.44:80,10.244.1.45:80,10.244.2.46:80
Session Affinity:  None
Events:            <none>

kubectl get endpoints -n dev

TCP  10.1.97.97:80 rr   #rr輪詢
  -> 10.244.1.44:80               Masq    1      0          0         
  -> 10.244.1.45:80               Masq    1      0          0         
  -> 10.244.2.46:80               Masq    1      0          0
   

service負載分發策略:
默認使用kube-proxy的輪詢策略

sessionAffinity: ClientIP  #設置session親和性 ClientIP None  如果沒有設置就會使用kube-proxy的隨機或者輪詢

ipvsadm -Ln 
---  多了persistent
TCP  10.1.97.97:80 rr persistent 10800
  -> 10.244.1.44:80               Masq    1      0          0         
  -> 10.244.1.45:80               Masq    1      0          0         
  -> 10.244.2.46:80               Masq    1      0          0 
---
===============================================================clusterIp===================================

===============================================================HeadLiness===================================
如果沒有clusterIP的設置,默認的ClusterIP方式會自動找一個clusterIP
[root@node1 ~]# kubectl get svc -n dev
NAME                   TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service-type           ClusterIP   10.1.113.241   <none>        80/TCP         114s

如果clusterIP: None 設置成None就會成為一個ClusterIP方式
[root@node1 ~]# kubectl get svc -n dev
NAME                   TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
service-type           ClusterIP   None         <none>        80/TCP         7s
就成為了無頭service

如果訪問可以通過查看pod容器裏面的域名來進行訪問
[root@node1 ~]# kubectl exec -it service-deployment-848c68b85-8jvcv -n dev /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. 
# cat /etc/resolv.conf
nameserver 10.1.0.10
search dev.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

[root@node1 ~]# kubectl exec -it service-deployment-848c68b85-8jvcv -n dev /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cat /etc/resolv.conf
nameserver 10.1.0.10
search dev.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
# exit
[root@node1 ~]# 
[root@node1 ~]# 
[root@node1 ~]# curl 10.1.0.10:80
curl: (7) Failed connect to 10.1.0.10:80; 拒絕連接
[root@node1 ~]# dig @10.1.0.10 service-deployment.dev.svc.cluster.local   
10.1.0.10 
service-deployment: service名稱
dev : 命名空間
svc.cluster.local :集羣默認域名


===============================================================HeadLiness===================================

===============================================================NodePort===================================
將service的端口映射到node上的端口上
type: NodePort
nodePort: 30005 #30000 32767  

[root@node1 ~]# kubectl get svc -n dev
NAME                   TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
service-type           NodePort   10.1.1.248   <none>        80:30005/TCP   6s

===============================================================NodePort===================================

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.