k8s基本概念-如何使用Services

k8s基本概念-如何使用Services

2018/1/5

Services 使用示例

  • Virtual IPs and service proxies
  • Publishing services - service types
  • 通過命令行來控制 Service
  • 通過 yaml 配置文件來定義 Service
Virtual IPs and service proxies
  • Proxy-mode: userspace
    • 輪詢
  • Proxy-mode: iptables
    • v1.2開始作爲默認選項
    • 比 userspace 快
    • 注意:如果一開始選擇的 pod 失去響應後,不能自動重試其他 pod 因而需要定義 readiness probes
    • 隨機
  • Proxy-mode: ipvs
    • FEATURE STATE: Kubernetes v1.9 beta
    • 比 iptables 快
Publishing services - service types
  • ClusterIP
    • 創建一個 ClusterIP 來提供集羣內部訪問
    • 默認選項
  • NodePort
    • 在每個節點 IP 上暴露一個端口(NodePort)來提供服務,集羣外部通過這種方式來訪問:<NodeIP>:<NodePort>,同時會創建一個 ClusterIP
    • 這種類型使用較多
    • 默認暴露的隨機端口範圍:30000-32767
    • 可以通過 nodePort 字段來顯式的指定端口
  • LoadBalancer
    • 通過和 cloud provider’s load balancer 關聯使用,此時 NodePort and ClusterIP 將自動創建
  • ExternalName
    • 將 service 名稱映射到一個 externalName (例如一個域名),通過 kube-dns 來提供 DNS 到 CNAME 記錄
通過命令行來控制 Service
  • 獲取和創建 service
    
    ### 獲取所有的 service 列表:
    [root@tvm-00 ~]# kubectl get services
    NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
    kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   5d

創建一個網絡類型爲 NodePort 的 service 並暴露 pods 的 80 端口

[root@tvm-00 ~]# kubectl expose deployments/test-deployment-app-whoami --type="NodePort" --port 80
service "test-deployment-app-whoami" exposed

再次獲取所有的 service 列表:

[root@tvm-00 ~]# kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 5d
test-deployment-app-whoami NodePort 10.108.8.154 <none> 80:31816/TCP 9s

當然,也可以通過 label 來篩選:

[root@tvm-00 ~]# kubectl get services -l app=whoami
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
test-deployment-app-whoami NodePort 10.108.8.154 <none> 80:31816/TCP 23s


- 查看細節
```bash
### 查看 service 的細節:
[root@tvm-00 ~]# kubectl describe services/test-deployment-app-whoami
Name:                     test-deployment-app-whoami
Namespace:                default
Labels:                   app=whoami
Annotations:              <none>
Selector:                 app=whoami
Type:                     NodePort
IP:                       10.108.8.154
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31816/TCP
Endpoints:                172.30.11.74:80,172.30.11.75:80,172.30.11.77:80 + 2 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

### 此處也可以通過 label 來篩選
[root@tvm-00 ~]# kubectl describe services -l app=whoami
Name:                     test-deployment-app-whoami
Namespace:                default
Labels:                   app=whoami
Annotations:              <none>
Selector:                 app=whoami
Type:                     NodePort
IP:                       10.108.8.154
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  31816/TCP
Endpoints:                172.30.11.74:80,172.30.11.75:80,172.30.11.77:80 + 2 more...
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>
  • 請求 service
    
    [root@tvm-00 ~]# export NODE_PORT=$(kubectl get services/test-deployment-app-whoami -o go-template='{{(index .spec.ports 0).nodePort}}')
    [root@tvm-00 ~]# echo NODE_PORT=$NODE_PORT
    NODE_PORT=31816

[root@tvm-00 ~]# kubectl get pods -l app=whoami
NAME READY STATUS RESTARTS AGE
test-deployment-app-whoami-6cf9cd6bf4-2dd5m 1/1 Running 0 15h
test-deployment-app-whoami-6cf9cd6bf4-bb7v7 1/1 Running 0 15h
test-deployment-app-whoami-6cf9cd6bf4-c7cht 1/1 Running 0 15h
test-deployment-app-whoami-6cf9cd6bf4-jhtqz 1/1 Running 0 15h
test-deployment-app-whoami-6cf9cd6bf4-px24h 1/1 Running 0 15h

測試請求 10 次的結果:

[root@tvm-00 ~]# for i in $(seq 1 10); do curl -s tvm-00:$NODE_PORT|grep Hostname; done
Hostname: test-deployment-app-whoami-6cf9cd6bf4-jhtqz
Hostname: test-deployment-app-whoami-6cf9cd6bf4-bb7v7
Hostname: test-deployment-app-whoami-6cf9cd6bf4-px24h
Hostname: test-deployment-app-whoami-6cf9cd6bf4-jhtqz
Hostname: test-deployment-app-whoami-6cf9cd6bf4-2dd5m
Hostname: test-deployment-app-whoami-6cf9cd6bf4-c7cht
Hostname: test-deployment-app-whoami-6cf9cd6bf4-c7cht
Hostname: test-deployment-app-whoami-6cf9cd6bf4-bb7v7
Hostname: test-deployment-app-whoami-6cf9cd6bf4-jhtqz
Hostname: test-deployment-app-whoami-6cf9cd6bf4-px24h

符合預期,請求隨機分佈在 5 個 pods 上


- 刪除 service
```bash
[root@tvm-00 ~]# kubectl delete services -l app=whoami
service "test-deployment-app-whoami" deleted
[root@tvm-00 ~]# kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   5d
通過 yaml 配置文件來定義 Service
  • 創建配置文件
    
    [root@tvm-00 ~]# cat ~/k8s_install/test/whoami/app.yaml
    apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
    kind: Deployment
    metadata:
    name: app-whoami
    labels:
    app: whoami
    spec:
    replicas: 3
    selector:
    matchLabels:
      app: whoami
    template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
        - name: whoami
          image: opera443399/whoami:0.9
          ports:
            - containerPort: 80

apiVersion: v1
kind: Service
metadata:
name: svc-whoami
labels:
app: whoami
spec:
selector:
app: whoami
ports:

  • protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080
    type: NodePort

- 執行
```bash
[root@tvm-00 ~]# kubectl apply -f whoami/app.yaml --record
deployment "app-whoami" created
service "svc-whoami" created
  • 獲取信息
    
    [root@tvm-00 ~]# kubectl get all -l app=whoami
    NAME                DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    deploy/app-whoami   3         3         3            3           25s

NAME DESIRED CURRENT READY AGE
rs/app-whoami-6cf9cd6bf4 3 3 3 25s

NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deploy/app-whoami 3 3 3 3 25s

NAME DESIRED CURRENT READY AGE
rs/app-whoami-6cf9cd6bf4 3 3 3 25s

NAME READY STATUS RESTARTS AGE
po/app-whoami-6cf9cd6bf4-2pxlh 1/1 Running 0 25s
po/app-whoami-6cf9cd6bf4-82ng2 1/1 Running 0 25s
po/app-whoami-6cf9cd6bf4-msbmk 1/1 Running 0 25s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
svc/svc-whoami NodePort 10.96.100.22 <none> 80:30080/TCP 25s


- 測試
```bash
[root@tvm-00 ~]# curl -s 10.96.100.22:80 |grep Hostname
Hostname: app-whoami-6cf9cd6bf4-msbmk
[root@tvm-00 ~]# curl -s tvm-00:30080 |grep Hostname
Hostname: app-whoami-6cf9cd6bf4-2pxlh
[root@tvm-00 ~]# curl -s tvm-01:30080 |grep Hostname
Hostname: app-whoami-6cf9cd6bf4-2pxlh
[root@tvm-00 ~]# curl -s tvm-02:30080 |grep Hostname
Hostname: app-whoami-6cf9cd6bf4-msbmk
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章