Kubernetes Service 學習
阿新 • • 發佈:2020-09-22
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>