1. 程式人生 > 實用技巧 >Kubernetes Service 學習

Kubernetes Service 學習

Kubernetes-Service 學習

部署在容器中的服務想要被外界訪問到,就得做埠對映才行。但是這種方式在K8s中是無法實現的,因為每一次Pod的建立和重啟其IP都會改變,而且同一個節點上的Pod可能存在多個,這個時候做埠對映是不現實的。而Service相當於我們Pod的VIP

Service的三種模式

Service有三種執行模式,其實是Service升級的三個版本。

[userspace

Client要訪問Pod時,它先將請求發給本機核心空間中的service規則,由它再將請求,轉給監聽在指定套接字上的kube-proxy,kube-proxy處理完請求,並分發請求到指定Server Pod後,再將請求遞交給核心空間中的service,由service將請求轉給指定的Server Pod。

iptables

直接由核心的Iptables轉發到Pod,不在進過kube-proxy。

ipvs

它是直接有核心中的ipvs規則來接受Client Pod請求,並處理該請求,再有核心封包後,直接發給指定的Server Pod。

Service的四種類型

NodePort

建立這種方式的Service,內部可以通過ClusterIP進行訪問,外部使用者可以通過NodeIP:NodePort的方式單獨訪問每個Node上的例項。

[root@kubernetes-master-01 ~]# vim svc.yaml
[root@kubernetes-master-01 ~]# cat svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30001
  selector:
    app: nginx
---
apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: alvinos/django:v1
        ports:
        - containerPort: 80

[root@kubernetes-master-01 ~]# kubectl apply -f svc.yaml
service/nginx created
replicationcontroller/nginx configured
[root@kubernetes-master-01 ~]# kubectl get all
NAME              READY   STATUS              RESTARTS   AGE
pod/nginx-47s6q   0/1     ContainerCreating   0          13s
pod/nginx-kd6d6   1/1     Running             0          13s
pod/nginx-t2vqz   1/1     Running             0          13s

NAME                          DESIRED   CURRENT   READY   AGE
replicationcontroller/nginx   3         3         2       13s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        106m
service/nginx        NodePort    10.102.211.15   <none>        80:30001/TCP   13sCopy to clipboardErrorCopied
  • 測試連線

    [root@kubernetes-master-01 ~]# while true; do curl 10.102.211.15/index; echo ''; sleep 1; done
    主機名:nginx-47s6q,版本:v1
    主機名:nginx-47s6q,版本:v1
    主機名:nginx-t2vqz,版本:v1
    主機名:nginx-47s6q,版本:v1
    主機名:nginx-47s6q,版本:v1
    主機名:nginx-t2vqz,版本:v1
    主機名:nginx-47s6q,版本:v1Copy to clipboardErrorCopied
    

LoadBalancer

接入外部負載均衡器的IP,到我們的k8s上

  • 建立LoadBalancer
[root@kubernetes-master-01 ~]# cat svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: loadbalancer
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: 80
  selector:
    app: nginx
EOFCopy to clipboardErrorCopied
  • 檢視
[root@kubernetes-node-01 ~]# kubectl get svc
NAME           TYPE           CLUSTER-IP    EXTERNAL-IP    PORT(S)        AGE
kubernetes     ClusterIP      10.0.0.1      <none>         443/TCP        110d
loadbalancer   LoadBalancer   10.0.129.18   81.71.12.240   80:30346/TCP   11sCopy to clipboardErrorCopied

HeadLess Service

建立一個沒有IP的特殊的Cluster IP型別的Service。

  • 建立

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: nginx
              image: nginx
              ports:
                - containerPort: 80
                  name: http
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: headless-service
    spec:
      selector:
        app: nginx
      ports:
        - protocol: TCP
          port: 80
          targetPort: 80
      clusterIP: None    Copy to clipboardErrorCopied
    
  • 檢視

    [root@kubernetes-master-01 ~]# kubectl apply -f headless.yaml
    deployment.apps/nginx-deployment created
    service/headless-service created
    [root@kubernetes-master-01 ~]# kubectl get svc
    NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
    headless-service   ClusterIP   None            <none>        80/TCP         4s
    kubernetes         ClusterIP   10.96.0.1       <none>        443/TCP        119m
    [root@kubernetes-master-01 ~]# kubectl describe svc headless-service
    Name:              headless-service
    Namespace:         default
    Labels:            <none>
    Annotations:       <none>
    Selector:          app=nginx
    Type:              ClusterIP
    IP:                None
    Port:              <unset>  80/TCP
    TargetPort:        80/TCP
    Endpoints:         10.244.1.5:80,10.244.1.6:80,10.244.2.6:80 + 2 more...
    Session Affinity:  None
    Events:            <none>