Kubernetes --(k8s) service

service

  • Kubernete Service 是一個定義了一組Pod的策略的抽象,咱們也有時候叫作宏觀服務。這些被服務標記的Pod都是(通常)經過label Selector決定的node

  • 對於Kubernete原生的應用,Kubernete提供了一個簡單的Endpoints API,這個Endpoints api的做用就是當一個服務中的pod發生變化時,Endpoints API隨之變化,對於哪些不是原生的程序,Kubernetes提供了一個基於虛擬IP的網橋的服務,這個服務會將請求轉發到對應的後臺podnginx


實驗

第一步:編寫部署nginx-svc的yml文件web

╭─root@node1 ~  
╰─➤  vim nginx-svc.yml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
   name: nginx1
spec:
   replicas: 2
   template:
      metadata:
         labels:
           name: web # 標籤 service  
      spec:
         containers:
         - name: nginx
           image: nginx
           ports:
           - containerPort: 80 # 暴露在pod的ip上的端口
---
apiVersion: v1
kind: Service
metadata:
   name: my-svc  
spec:
   selector:
      name: web  # 標籤 labels
   ports:
   - port: 80 # service暴露的端口
     targetPort: 80  # pods的端口

第二步:運行yml文件vim

╭─root@node1 ~  
╰─➤  kubectl apply -f nginx-svc.yml

第三步:查看標籤api

╭─root@node1 ~  
╰─➤  kubectl get po -o wide --show-labels
NAME                      READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES   LABELS
nginx1-7f56c7b7f8-qxqbg   1/1     Running   0          2m33s   10.244.1.6    node2   <none>           <none>            name=web,pod-template-hash=7f56c7b7f8
nginx1-7f56c7b7f8-zjt9m   1/1     Running   0          2m33s   10.244.2.11   node3   <none>           <none>            name=web,pod-template-hash=7f56c7b7f8

指定namespace

查看namespaceapp

╭─root@node1 ~  
╰─➤  kubectl get namespace
NAME              STATUS   AGE
default           Active   2d19h
kube-node-lease   Active   2d19h
kube-public       Active   2d19h
kube-system       Active   2d19h

編輯yml文件ide

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
   name: nginx1
   namespace: kube-system  # 指定namespace
spec:
   replicas: 2
   template:
      metadata:
         labels:
           name: web
      spec:
         containers:
         - name: nginx
           image: nginx
           ports:
           - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
   name: my-svc
   namespace: kube-system  # 指定namespace
spec:
   selector:
      name: web
   ports:
   - port: 80

其中:spa

  1. 經過DNS名稱訪問,只能在同一名稱空間
  2. 若是不是同一名稱空間,須要指定namespace

外網訪問

第一步:修改yml文件code

kind: Deployment
metadata:
   name: nginx1
spec:
   replicas: 2
   template:
      metadata:
         labels:
           name: web
      spec:
         containers:
         - name: nginx
           image: nginx
           ports:
           - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
   name: my-svc
spec:
   type: NodePort    # 選擇service端口暴露方式
   selector:
      name: web
   ports:
   - port: 80
     targetPort: 80
     nodePort: 30007   #  端口選擇範圍 30000-32767

第二步:執行yml文件blog

╭─root@node1 ~  
╰─➤  kubectl apply -f nginx-svc.yml

第三步:查看svc

╭─root@node1 ~  
╰─➤  kubectl get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        2d19h
my-svc       NodePort    10.109.183.148   <none>        80:30007/TCP   9s

第四步:查看主機端口

╭─root@node1 ~  
╰─➤  ss -ntl |grep 30007
LISTEN     0      128         :::30007                   :::*

service暴露端口的四種方式:

  1. clusterIP
  2. NodePort
  3. LoadBalance
  4. ExternalName

相關文章
相關標籤/搜索